File tree Expand file tree Collapse file tree 4 files changed +83
-2
lines changed
tests/ui/type/pattern_types Expand file tree Collapse file tree 4 files changed +83
-2
lines changed Original file line number Diff line number Diff line change @@ -848,6 +848,17 @@ where
848848 TyMaybeWithLayout :: Ty ( base)
849849 }
850850
851+ // May contain wide pointers
852+ ty:: Pat ( base, pat) => match * pat {
853+ ty:: PatternKind :: NotNull => {
854+ assert_eq ! ( i, 0 ) ;
855+ TyMaybeWithLayout :: Ty ( base)
856+ }
857+ ty:: PatternKind :: Range { .. } | ty:: PatternKind :: Or ( _) => {
858+ bug ! ( "TyAndLayout::field({this:?}): only applicable to !null patterns" )
859+ }
860+ } ,
861+
851862 ty:: UnsafeBinder ( bound_ty) => {
852863 let ty = tcx. instantiate_bound_regions_with_erased ( bound_ty. into ( ) ) ;
853864 field_ty_or_layout ( TyAndLayout { ty, ..this } , cx, i)
Original file line number Diff line number Diff line change @@ -276,6 +276,12 @@ fn layout_of_uncached<'tcx>(
276276 } ;
277277
278278 layout. largest_niche = Some ( niche) ;
279+ // Make wide pointer pattern types contain only a single field
280+ // of the wide pointer type itself.
281+ layout. fields = FieldsShape :: Arbitrary {
282+ offsets : [ Size :: ZERO ] . into_iter ( ) . collect ( ) ,
283+ memory_index : [ 0 ] . into_iter ( ) . collect ( ) ,
284+ }
279285 } else {
280286 bug ! (
281287 "pattern type with `!null` pattern but not scalar/pair layout: {ty:?}, {layout:?}"
Original file line number Diff line number Diff line change @@ -13,6 +13,9 @@ type NonNull<T> = pattern_type!(*const T is !null); //~ ERROR layout_of
1313#[ rustc_layout( debug) ]
1414type Test = Option < NonNull < ( ) > > ; //~ ERROR layout_of
1515
16+ #[ rustc_layout( debug) ]
17+ type Wide = pattern_type ! ( * const [ u8 ] is !null) ; //~ ERROR layout_of
18+
1619const _: ( ) = assert ! ( size_of:: <NonNull <( ) >>( ) == size_of:: <Option <NonNull <( ) >>>( ) ) ;
1720
1821fn main ( ) { }
Original file line number Diff line number Diff 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 {
153160LL | 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
You can’t perform that action at this time.
0 commit comments