]>
Commit | Line | Data |
---|---|---|
fc512014 XL |
1 | // Figuring out the size of a vector type that depends on traits doesn't ICE |
2 | ||
3 | #![allow(dead_code)] | |
4 | ||
5 | // pretty-expanded FIXME #23616 | |
6 | ||
94222f64 | 7 | #![feature(repr_simd, platform_intrinsics, generic_const_exprs)] |
fc512014 XL |
8 | #![allow(non_camel_case_types, incomplete_features)] |
9 | ||
10 | pub trait Simd { | |
11 | type Lane: Clone + Copy; | |
12 | const SIZE: usize; | |
13 | } | |
14 | ||
15 | pub struct i32x4; | |
16 | impl Simd for i32x4 { | |
17 | type Lane = i32; | |
18 | const SIZE: usize = 4; | |
19 | } | |
20 | ||
21 | #[repr(simd)] | |
22 | #[derive(Copy, Clone)] | |
23 | pub struct T<S: Simd>([S::Lane; S::SIZE]); | |
94222f64 | 24 | //~^ ERROR unconstrained generic constant |
fc512014 XL |
25 | |
26 | extern "platform-intrinsic" { | |
27 | fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T; | |
28 | fn simd_extract<T, E>(x: T, idx: u32) -> E; | |
29 | } | |
30 | ||
31 | pub fn main() { | |
32 | let mut t = T::<i32x4>([0; 4]); | |
33 | unsafe { | |
34 | for i in 0_i32..4 { | |
35 | t = simd_insert(t, i as u32, i); | |
36 | } | |
37 | for i in 0_i32..4 { | |
38 | assert_eq!(i, simd_extract(t, i as u32)); | |
39 | } | |
40 | } | |
41 | } |