1 /* { dg-options "-msve-vector-bits=256 -W -Wall" } */
2 
3 #include <arm_sve.h>
4 
5 #define N __ARM_FEATURE_SVE_BITS
6 #define FIXED_ATTR __attribute__ ((arm_sve_vector_bits (N)))
7 #define ALIGNED_ATTR __attribute__((aligned(N / 8)))
8 
9 typedef svint8_t var1;
10 typedef __SVInt8_t var2;
11 
12 typedef const var1 const_var1;
13 typedef const var2 const_var2;
14 
15 typedef var1 aligned_var1 ALIGNED_ATTR;
16 typedef var2 aligned_var2 ALIGNED_ATTR;
17 
18 typedef var1 fixed1 FIXED_ATTR;
19 typedef var1 fixed1_alias FIXED_ATTR;
20 typedef var2 fixed2 FIXED_ATTR;
21 
22 typedef const_var1 const_fixed1 FIXED_ATTR;
23 typedef const var1 const_fixed1_alias FIXED_ATTR;
24 typedef const_var2 const_fixed2 FIXED_ATTR;
25 
26 typedef aligned_var1 aligned_fixed1 FIXED_ATTR;
27 typedef var1 aligned_fixed1_alias FIXED_ATTR ALIGNED_ATTR;
28 typedef aligned_var2 aligned_fixed2 FIXED_ATTR;
29 
30 extern fixed1 extern1;
31 extern fixed1_alias extern1_alias;
32 extern fixed2 extern2;
33 
34 extern const_fixed1 const_extern1;
35 extern const_fixed1_alias const_extern1_alias;
36 extern const_fixed2 const_extern2;
37 
38 fixed1 *ptr1a = &extern1;
39 fixed1_alias *ptr1b = &extern1;
40 fixed2 *ptr1c = &extern1;
41 
42 fixed1 *ptr2a = &extern1_alias;
43 fixed1_alias *ptr2b = &extern1_alias;
44 fixed2 *ptr2c = &extern1_alias;
45 
46 fixed1 *ptr3a = &extern2;
47 fixed1_alias *ptr3b = &extern2;
48 fixed2 *ptr3c = &extern2;
49 
50 fixed1 *ptr4a = &const_extern1; 	// { dg-error {invalid conversion} "c++" { target c++ } }
51 					// { dg-warning {discards 'const' qualifier} "c" { target c } .-1 }
52 fixed1_alias *ptr4b = &const_extern1; 	// { dg-error {invalid conversion} "c++" { target c++ } }
53 					// { dg-warning {discards 'const' qualifier} "c" { target c } .-1 }
54 fixed2 *ptr4c = &const_extern1; 	// { dg-error {invalid conversion} "c++" { target c++ } }
55 					// { dg-warning {discards 'const' qualifier} "c" { target c } .-1 }
56 
57 const fixed1 *ptr5a = &const_extern2;
58 const fixed1_alias *ptr5b = &const_extern2;
59 const fixed2 *ptr5c = &const_extern2;
60 
61 const_fixed1 *const_ptr1a = &extern1;
62 const_fixed1_alias *const_ptr1b = &extern1;
63 const_fixed2 *const_ptr1c = &extern1;
64 
65 const_fixed1 *const_ptr2a = &extern1_alias;
66 const_fixed1_alias *const_ptr2b = &extern1_alias;
67 const_fixed2 *const_ptr2c = &extern1_alias;
68 
69 const_fixed1 *const_ptr3a = &extern2;
70 const_fixed1_alias *const_ptr3b = &extern2;
71 const_fixed2 *const_ptr3c = &extern2;
72 
73 const_fixed1 *const_ptr4a = &const_extern1;
74 const_fixed1_alias *const_ptr4b = &const_extern1;
75 const_fixed2 *const_ptr4c = &const_extern1;
76 
77 const_fixed1 *const_ptr5a = &const_extern1_alias;
78 const_fixed1_alias *const_ptr5b = &const_extern1_alias;
79 const_fixed2 *const_ptr5c = &const_extern1_alias;
80 
81 const_fixed1 *const_ptr6a = &const_extern2;
82 const_fixed1_alias *const_ptr6b = &const_extern2;
83 const_fixed2 *const_ptr6c = &const_extern2;
84 
85 struct normal1 { int x; fixed1 y; };
86 struct normal1_alias { int x; fixed1_alias y; };
87 struct normal2 { int x; fixed2 y; };
88 
89 struct aligned1 { int x; aligned_fixed1 y; };
90 struct aligned1_alias { int x; aligned_fixed1_alias y; };
91 struct aligned2 { int x; aligned_fixed2 y; };
92 
93 #define ASSERT(NAME, TEST) typedef int NAME[(TEST) ? 1 : -1]
94 
95 ASSERT (check_normal1, sizeof (struct normal1) == N / 8 + 16);
96 ASSERT (check_normal1_alias, sizeof (struct normal1_alias) == N / 8 + 16);
97 ASSERT (check_normal2, sizeof (struct normal2) == N / 8 + 16);
98 
99 ASSERT (check_aligned1, sizeof (struct aligned1) == N / 4);
100 ASSERT (check_aligned1_alias, sizeof (struct aligned1_alias) == N / 4);
101 ASSERT (check_aligned2, sizeof (struct aligned2) == N / 4);
102