Skip to content

Commit 4baed81

Browse files
committed
Implement wide not-null pointer patterns
1 parent 596eaa2 commit 4baed81

File tree

4 files changed

+83
-3
lines changed

4 files changed

+83
-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
@@ -13,6 +13,9 @@ type NonNull<T> = pattern_type!(*const T is !null); //~ ERROR layout_of
1313
#[rustc_layout(debug)]
1414
type Test = Option<NonNull<()>>; //~ ERROR layout_of
1515

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

1821
fn main() {}

tests/ui/type/pattern_types/non_null.stderr

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

0 commit comments

Comments
 (0)