@@ -1964,25 +1964,28 @@ impl<'tcx> Ty<'tcx> {
19641964 let variant = def. non_enum_variant ( ) ;
19651965 let f0_ty = variant. fields [ FieldIdx :: from_u32 ( 0 ) ] . ty ( tcx, args) ;
19661966
1967- match f0_ty. kind ( ) {
1968- Array ( _, _) if def. repr ( ) . scalable ( ) => {
1969- bug ! ( "Scalable SIMD should be using a slice, not array" ) ;
1967+ if def. repr ( ) . scalable ( ) {
1968+ match f0_ty. kind ( ) {
1969+ Slice ( f0_elem_ty) => ( def. repr ( ) . scalable . unwrap_or ( 0 ) as u64 , * f0_elem_ty) ,
1970+ _ => {
1971+ bug ! ( "Scalable SIMD should be using a slice" ) ;
1972+ }
19701973 }
1971- Slice ( f0_elem_ty) if def. repr ( ) . scalable ( ) => {
1972- ( def. repr ( ) . scalable . unwrap_or ( 0 ) as u64 , * f0_elem_ty)
1973- }
1974- // If the first field is an array, we assume it is the only field and its
1975- // elements are the SIMD components.
1976- Array ( f0_elem_ty, f0_len) => {
1977- // FIXME(repr_simd): https://github.com/rust-lang/rust/pull/78863#discussion_r522784112
1978- // The way we evaluate the `N` in `[T; N]` here only works since we use
1979- // `simd_size_and_type` post-monomorphization. It will probably start to ICE
1980- // if we use it in generic code. See the `simd-array-trait` ui test.
1981- ( f0_len. eval_target_usize ( tcx, ParamEnv :: empty ( ) ) , * f0_elem_ty)
1974+ } else {
1975+ match f0_ty. kind ( ) {
1976+ // If the first field is an array, we assume it is the only field and its
1977+ // elements are the SIMD components.
1978+ Array ( f0_elem_ty, f0_len) => {
1979+ // FIXME(repr_simd): https://github.com/rust-lang/rust/pull/78863#discussion_r522784112
1980+ // The way we evaluate the `N` in `[T; N]` here only works since we use
1981+ // `simd_size_and_type` post-monomorphization. It will probably start to ICE
1982+ // if we use it in generic code. See the `simd-array-trait` ui test.
1983+ ( f0_len. eval_target_usize ( tcx, ParamEnv :: empty ( ) ) , * f0_elem_ty)
1984+ }
1985+ // Otherwise, the fields of this Adt are the SIMD components (and we assume they
1986+ // all have the same type).
1987+ _ => ( variant. fields . len ( ) as u64 , f0_ty) ,
19821988 }
1983- // Otherwise, the fields of this Adt are the SIMD components (and we assume they
1984- // all have the same type).
1985- _ => ( variant. fields . len ( ) as u64 , f0_ty) ,
19861989 }
19871990 }
19881991 _ => bug ! ( "`simd_size_and_type` called on invalid type" ) ,
0 commit comments