Skip to content

Commit 6330922

Browse files
committed
Implement wide not-null pointer patterns
1 parent 05b55f2 commit 6330922

File tree

4 files changed

+82
-3
lines changed

4 files changed

+82
-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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,10 @@ fn layout_of_uncached<'tcx>(
273273
};
274274

275275
layout.largest_niche = Some(niche);
276+
layout.fields = FieldsShape::Arbitrary {
277+
offsets: [Size::ZERO].into_iter().collect(),
278+
memory_index: [0].into_iter().collect(),
279+
}
276280
} else {
277281
bug!(
278282
"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
@@ -14,7 +14,14 @@ error: layout_of((*const T) is !null) = Layout {
1414
valid_range: 1..=18446744073709551615,
1515
},
1616
),
17-
fields: Primitive,
17+
fields: Arbitrary {
18+
offsets: [
19+
Size(0 bytes),
20+
],
21+
memory_index: [
22+
0,
23+
],
24+
},
1825
largest_niche: Some(
1926
Niche {
2027
offset: Size(0 bytes),
@@ -157,5 +164,60 @@ error: layout_of(Option<(*const ()) is !null>) = Layout {
157164
LL | type Test = Option<NonNull<()>>;
158165
| ^^^^^^^^^
159166

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

0 commit comments

Comments
 (0)