Skip to content

Commit 317a963

Browse files
committed
Implement wide not-null pointer patterns
1 parent ba63d40 commit 317a963

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

compiler/rustc_middle/src/ty/layout.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,11 +822,21 @@ where
822822
| ty::FnDef(..)
823823
| ty::CoroutineWitness(..)
824824
| ty::Foreign(..)
825-
| ty::Pat(_, _)
826825
| ty::Dynamic(_, _, ty::Dyn) => {
827826
bug!("TyAndLayout::field({:?}): not applicable", this)
828827
}
829828

829+
// May contain wide pointers
830+
ty::Pat(base, pat) => match *pat {
831+
ty::PatternKind::NotNull => {
832+
assert_eq!(i, 0);
833+
TyMaybeWithLayout::Ty(base)
834+
}
835+
ty::PatternKind::Range { .. } | ty::PatternKind::Or(_) => {
836+
bug!("TyAndLayout::field({this:?}): only applicable to !null patterns")
837+
}
838+
},
839+
830840
ty::UnsafeBinder(bound_ty) => {
831841
let ty = tcx.instantiate_bound_regions_with_erased(bound_ty.into());
832842
field_ty_or_layout(TyAndLayout { ty, ..this }, cx, i)

compiler/rustc_ty_utils/src/layout.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,12 @@ fn layout_of_uncached<'tcx>(
273273
};
274274

275275
layout.largest_niche = Some(niche);
276+
// Make wide pointer pattern types contain only a single field
277+
// of the wide pointer type itself.
278+
layout.fields = FieldsShape::Arbitrary {
279+
offsets: [Size::ZERO].into_iter().collect(),
280+
memory_index: [0].into_iter().collect(),
281+
}
276282
} else {
277283
bug!(
278284
"pattern type with `!null` pattern but not scalar/pair layout: {ty:?}, {layout:?}"

tests/ui/type/pattern_types/non_null.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ type NonNull<T> = pattern_type!(*const T is !null); //~ ERROR layout_of
1212
#[rustc_layout(debug)]
1313
type Test = Option<NonNull<()>>; //~ ERROR layout_of
1414

15+
#[rustc_layout(debug)]
16+
type Wide = pattern_type!(*const [u8] is !null); //~ ERROR layout_of
17+
1518
const _: () = assert!(size_of::<NonNull<()>>() == size_of::<Option<NonNull<()>>>());
1619

1720
fn main() {}

tests/ui/type/pattern_types/non_null.stderr

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@ error: layout_of((*const T) is !null) = Layout {
1313
valid_range: 1..=18446744073709551615,
1414
},
1515
),
16-
fields: Primitive,
16+
fields: Arbitrary {
17+
offsets: [
18+
Size(0 bytes),
19+
],
20+
memory_index: [
21+
0,
22+
],
23+
},
1724
largest_niche: Some(
1825
Niche {
1926
offset: Size(0 bytes),
@@ -153,5 +160,60 @@ error: layout_of(Option<(*const ()) is !null>) = Layout {
153160
LL | type Test = Option<NonNull<()>>;
154161
| ^^^^^^^^^
155162

156-
error: aborting due to 2 previous errors
163+
error: layout_of((*const [u8]) is !null) = Layout {
164+
size: Size(16 bytes),
165+
align: AbiAndPrefAlign {
166+
abi: Align(8 bytes),
167+
pref: Align(8 bytes),
168+
},
169+
backend_repr: ScalarPair(
170+
Initialized {
171+
value: Pointer(
172+
AddressSpace(
173+
0,
174+
),
175+
),
176+
valid_range: 1..=18446744073709551615,
177+
},
178+
Initialized {
179+
value: Int(
180+
I64,
181+
false,
182+
),
183+
valid_range: 0..=18446744073709551615,
184+
},
185+
),
186+
fields: Arbitrary {
187+
offsets: [
188+
Size(0 bytes),
189+
],
190+
memory_index: [
191+
0,
192+
],
193+
},
194+
largest_niche: Some(
195+
Niche {
196+
offset: Size(0 bytes),
197+
value: Pointer(
198+
AddressSpace(
199+
0,
200+
),
201+
),
202+
valid_range: 1..=18446744073709551615,
203+
},
204+
),
205+
uninhabited: false,
206+
variants: Single {
207+
index: 0,
208+
},
209+
max_repr_align: None,
210+
unadjusted_abi_align: Align(8 bytes),
211+
randomization_seed: $SEED,
212+
}
213+
--> $DIR/non_null.rs:16:1
214+
|
215+
LL | type Wide = pattern_type!(*const [u8] is !null);
216+
| ^^^^^^^^^
217+
218+
error: aborting due to 3 previous errors
157219

0 commit comments

Comments
 (0)