|
| 1 | +// RUN: %clang_cc1 -fsyntax-only -verify -Wall -W -Wno-comment -triple arm64-linux-gnu -target-feature +sve -std=c90 %s |
| 2 | +// RUN: %clang_cc1 -fsyntax-only -verify -Wall -W -triple arm64-linux-gnu -target-feature +sve -std=c11 %s |
| 3 | +// RUN: %clang_cc1 -fsyntax-only -verify -Wall -W -triple arm64-linux-gnu -target-feature +sve -std=gnu11 %s |
| 4 | + |
| 5 | +typedef __SVInt8_t svint8_t; |
| 6 | +typedef __SVInt16_t svint16_t; |
| 7 | + |
| 8 | +svint8_t *global_int8_ptr; |
| 9 | +extern svint8_t *extern_int8_ptr; |
| 10 | +static svint8_t *static_int8_ptr; |
| 11 | + |
| 12 | +typedef svint8_t int8_typedef; |
| 13 | +typedef svint8_t *int8_ptr_typedef; |
| 14 | + |
| 15 | +void pass_int8(svint8_t); // expected-note {{passing argument to parameter here}} |
| 16 | + |
| 17 | +svint8_t return_int8(); |
| 18 | + |
| 19 | +typedef svint8_t vec_int8_a __attribute__((vector_size(64))); // expected-error {{invalid vector element type}} |
| 20 | +typedef svint8_t vec_int8_b __attribute__((ext_vector_type(4))); // expected-error {{invalid vector element type}} |
| 21 | + |
| 22 | +void dump(const volatile void *); |
| 23 | + |
| 24 | +void __attribute__((overloadable)) overf(svint8_t); |
| 25 | +void __attribute__((overloadable)) overf(svint16_t); |
| 26 | + |
| 27 | +void __attribute__((overloadable)) overf8(svint8_t); // expected-note + {{not viable}} |
| 28 | +void __attribute__((overloadable)) overf8(int); // expected-note + {{not viable}} |
| 29 | + |
| 30 | +void __attribute__((overloadable)) overf16(svint16_t); // expected-note + {{not viable}} |
| 31 | +void __attribute__((overloadable)) overf16(int); // expected-note + {{not viable}} |
| 32 | + |
| 33 | +void noproto(); |
| 34 | +void varargs(int, ...); |
| 35 | + |
| 36 | +void unused() { |
| 37 | + svint8_t unused_int8; // expected-warning {{unused}} |
| 38 | +} |
| 39 | + |
| 40 | +struct incomplete_struct *incomplete_ptr; |
| 41 | + |
| 42 | +void func(int sel) { |
| 43 | + svint8_t local_int8; |
| 44 | + svint16_t local_int16; |
| 45 | + |
| 46 | + // Using pointers to sizeless data isn't wrong here, but because the |
| 47 | + // type is incomplete, it doesn't provide any alignment guarantees. |
| 48 | + _Static_assert(__atomic_is_lock_free(1, &local_int8) == __atomic_is_lock_free(1, incomplete_ptr), ""); |
| 49 | + _Static_assert(__atomic_is_lock_free(2, &local_int8) == __atomic_is_lock_free(2, incomplete_ptr), ""); // expected-error {{static_assert expression is not an integral constant expression}} |
| 50 | + _Static_assert(__atomic_always_lock_free(1, &local_int8) == __atomic_always_lock_free(1, incomplete_ptr), ""); |
| 51 | + |
| 52 | + local_int8; // expected-warning {{expression result unused}} |
| 53 | + |
| 54 | + (void)local_int8; |
| 55 | + |
| 56 | + local_int8, 0; // expected-warning + {{expression result unused}} |
| 57 | + |
| 58 | + 0, local_int8; // expected-warning + {{expression result unused}} |
| 59 | + |
| 60 | + svint8_t init_int8 = local_int8; |
| 61 | + svint8_t bad_init_int8 = for; // expected-error {{expected expression}} |
| 62 | + |
| 63 | + int empty_brace_init_int = {}; // expected-error {{scalar initializer cannot be empty}} |
| 64 | + |
| 65 | + const svint8_t const_int8 = local_int8; // expected-note {{declared const here}} |
| 66 | + const svint8_t uninit_const_int8; |
| 67 | + |
| 68 | + volatile svint8_t volatile_int8; |
| 69 | + |
| 70 | + const volatile svint8_t const_volatile_int8 = local_int8; // expected-note {{declared const here}} |
| 71 | + const volatile svint8_t uninit_const_volatile_int8; |
| 72 | + |
| 73 | + __restrict svint8_t restrict_int8; // expected-error {{requires a pointer or reference}} |
| 74 | + |
| 75 | + _Bool test_int8 = init_int8; // expected-error {{initializing '_Bool' with an expression of incompatible type 'svint8_t'}} |
| 76 | + |
| 77 | + int int_int8 = init_int8; // expected-error {{initializing 'int' with an expression of incompatible type 'svint8_t'}} |
| 78 | + |
| 79 | + init_int8 = local_int8; |
| 80 | + init_int8 = local_int16; // expected-error {{assigning to 'svint8_t' (aka '__SVInt8_t') from incompatible type 'svint16_t'}} |
| 81 | + init_int8 = sel; // expected-error {{assigning to 'svint8_t' (aka '__SVInt8_t') from incompatible type 'int'}} |
| 82 | + |
| 83 | + sel = local_int8; // expected-error {{assigning to 'int' from incompatible type 'svint8_t'}} |
| 84 | + |
| 85 | + local_int8 = (svint8_t)local_int16; // expected-error {{used type 'svint8_t' (aka '__SVInt8_t') where arithmetic or pointer type is required}} |
| 86 | + local_int8 = (svint8_t)0; // expected-error {{used type 'svint8_t' (aka '__SVInt8_t') where arithmetic or pointer type is required}} |
| 87 | + sel = (int)local_int8; // expected-error {{operand of type 'svint8_t' (aka '__SVInt8_t') where arithmetic or pointer type is required}} |
| 88 | + |
| 89 | + init_int8 = local_int8; |
| 90 | + init_int8 = const_int8; |
| 91 | + init_int8 = volatile_int8; |
| 92 | + init_int8 = const_volatile_int8; |
| 93 | + |
| 94 | + const_int8 = local_int8; // expected-error {{cannot assign to variable 'const_int8' with const-qualified type 'const svint8_t'}} |
| 95 | + |
| 96 | + volatile_int8 = local_int8; |
| 97 | + volatile_int8 = const_int8; |
| 98 | + volatile_int8 = volatile_int8; |
| 99 | + volatile_int8 = const_volatile_int8; |
| 100 | + |
| 101 | + const_volatile_int8 = local_int8; // expected-error {{cannot assign to variable 'const_volatile_int8' with const-qualified type 'const volatile svint8_t'}} |
| 102 | + |
| 103 | + pass_int8(local_int8); |
| 104 | + pass_int8(local_int16); // expected-error {{passing 'svint16_t' (aka '__SVInt16_t') to parameter of incompatible type 'svint8_t'}} |
| 105 | + |
| 106 | + local_int8 = return_int8(); |
| 107 | + local_int16 = return_int8(); // expected-error {{assigning to 'svint16_t' (aka '__SVInt16_t') from incompatible type 'svint8_t'}} |
| 108 | + |
| 109 | + dump(&local_int8); |
| 110 | + dump(&const_int8); |
| 111 | + dump(&volatile_int8); |
| 112 | + dump(&const_volatile_int8); |
| 113 | + |
| 114 | + *&local_int8 = local_int8; |
| 115 | + *&const_int8 = local_int8; // expected-error {{read-only variable is not assignable}} |
| 116 | + *&volatile_int8 = local_int8; |
| 117 | + *&const_volatile_int8 = local_int8; // expected-error {{read-only variable is not assignable}} |
| 118 | + |
| 119 | + overf(local_int8); |
| 120 | + overf(local_int16); |
| 121 | + |
| 122 | + overf8(local_int8); |
| 123 | + overf8(local_int16); // expected-error {{no matching function}} |
| 124 | + |
| 125 | + overf16(local_int8); // expected-error {{no matching function}} |
| 126 | + overf16(local_int16); |
| 127 | + |
| 128 | + noproto(local_int8); |
| 129 | + varargs(1, local_int8, local_int16); |
| 130 | + |
| 131 | + +init_int8; // expected-error {{invalid argument type 'svint8_t'}} |
| 132 | + ++init_int8; // expected-error {{cannot increment value of type 'svint8_t'}} |
| 133 | + init_int8++; // expected-error {{cannot increment value of type 'svint8_t'}} |
| 134 | + -init_int8; // expected-error {{invalid argument type 'svint8_t'}} |
| 135 | + --init_int8; // expected-error {{cannot decrement value of type 'svint8_t'}} |
| 136 | + init_int8--; // expected-error {{cannot decrement value of type 'svint8_t'}} |
| 137 | + ~init_int8; // expected-error {{invalid argument type 'svint8_t'}} |
| 138 | + !init_int8; // expected-error {{invalid argument type 'svint8_t'}} |
| 139 | + *init_int8; // expected-error {{indirection requires pointer operand}} |
| 140 | + __real init_int8; // expected-error {{invalid type 'svint8_t'}} |
| 141 | + __imag init_int8; // expected-error {{invalid type 'svint8_t'}} |
| 142 | + |
| 143 | + local_int8 + init_int8; // expected-error {{invalid operands to binary expression}} |
| 144 | + local_int8 - init_int8; // expected-error {{invalid operands to binary expression}} |
| 145 | + local_int8 *init_int8; // expected-error {{invalid operands to binary expression}} |
| 146 | + local_int8 / init_int8; // expected-error {{invalid operands to binary expression}} |
| 147 | + local_int8 % init_int8; // expected-error {{invalid operands to binary expression}} |
| 148 | + local_int8 &init_int8; // expected-error {{invalid operands to binary expression}} |
| 149 | + local_int8 | init_int8; // expected-error {{invalid operands to binary expression}} |
| 150 | + local_int8 ^ init_int8; // expected-error {{invalid operands to binary expression}} |
| 151 | + local_int8 << init_int8; // expected-error {{invalid operands to binary expression}} |
| 152 | + local_int8 >> init_int8; // expected-error {{invalid operands to binary expression}} |
| 153 | + local_int8 < init_int8; // expected-error {{invalid operands to binary expression}} |
| 154 | + local_int8 <= init_int8; // expected-error {{invalid operands to binary expression}} |
| 155 | + local_int8 == init_int8; // expected-error {{invalid operands to binary expression}} |
| 156 | + local_int8 != init_int8; // expected-error {{invalid operands to binary expression}} |
| 157 | + local_int8 >= init_int8; // expected-error {{invalid operands to binary expression}} |
| 158 | + local_int8 > init_int8; // expected-error {{invalid operands to binary expression}} |
| 159 | + local_int8 &&init_int8; // expected-error {{invalid operands to binary expression}} |
| 160 | + local_int8 || init_int8; // expected-error {{invalid operands to binary expression}} |
| 161 | + |
| 162 | + local_int8 += init_int8; // expected-error {{invalid operands to binary expression}} |
| 163 | + local_int8 -= init_int8; // expected-error {{invalid operands to binary expression}} |
| 164 | + local_int8 *= init_int8; // expected-error {{invalid operands to binary expression}} |
| 165 | + local_int8 /= init_int8; // expected-error {{invalid operands to binary expression}} |
| 166 | + local_int8 %= init_int8; // expected-error {{invalid operands to binary expression}} |
| 167 | + local_int8 &= init_int8; // expected-error {{invalid operands to binary expression}} |
| 168 | + local_int8 |= init_int8; // expected-error {{invalid operands to binary expression}} |
| 169 | + local_int8 ^= init_int8; // expected-error {{invalid operands to binary expression}} |
| 170 | + local_int8 <<= init_int8; // expected-error {{invalid operands to binary expression}} |
| 171 | + local_int8 >>= init_int8; // expected-error {{invalid operands to binary expression}} |
| 172 | + |
| 173 | + local_int8 + 0; // expected-error {{invalid operands to binary expression}} |
| 174 | + local_int8 - 0; // expected-error {{invalid operands to binary expression}} |
| 175 | + local_int8 * 0; // expected-error {{invalid operands to binary expression}} |
| 176 | + local_int8 / 0; // expected-error {{invalid operands to binary expression}} |
| 177 | + local_int8 % 0; // expected-error {{invalid operands to binary expression}} |
| 178 | + local_int8 & 0; // expected-error {{invalid operands to binary expression}} |
| 179 | + local_int8 | 0; // expected-error {{invalid operands to binary expression}} |
| 180 | + local_int8 ^ 0; // expected-error {{invalid operands to binary expression}} |
| 181 | + local_int8 << 0; // expected-error {{invalid operands to binary expression}} |
| 182 | + local_int8 >> 0; // expected-error {{invalid operands to binary expression}} |
| 183 | + local_int8 < 0; // expected-error {{invalid operands to binary expression}} |
| 184 | + local_int8 <= 0; // expected-error {{invalid operands to binary expression}} |
| 185 | + local_int8 == 0; // expected-error {{invalid operands to binary expression}} |
| 186 | + local_int8 != 0; // expected-error {{invalid operands to binary expression}} |
| 187 | + local_int8 >= 0; // expected-error {{invalid operands to binary expression}} |
| 188 | + local_int8 > 0; // expected-error {{invalid operands to binary expression}} |
| 189 | + local_int8 && 0; // expected-error {{invalid operands to binary expression}} |
| 190 | + local_int8 || 0; // expected-error {{invalid operands to binary expression}} |
| 191 | + |
| 192 | + if (local_int8) { // expected-error {{statement requires expression of scalar type}} |
| 193 | + } |
| 194 | + while (local_int8) { // expected-error {{statement requires expression of scalar type}} |
| 195 | + } |
| 196 | + do { // expected-error {{statement requires expression of scalar type}} |
| 197 | + } while (local_int8); |
| 198 | + switch (local_int8) { // expected-error {{statement requires expression of integer type}} |
| 199 | + default:; |
| 200 | + } |
| 201 | +} |
| 202 | + |
| 203 | +int vararg_receiver(int count, svint8_t first, ...) { |
| 204 | + __builtin_va_list va; |
| 205 | + |
| 206 | + __builtin_va_start(va, first); |
| 207 | + __builtin_va_arg(va, svint8_t); |
| 208 | + __builtin_va_end(va); |
| 209 | + return count; |
| 210 | +} |
| 211 | + |
| 212 | +#if __STDC_VERSION__ >= 201112L |
| 213 | +void test_generic(void) { |
| 214 | + svint8_t local_int8; |
| 215 | + svint16_t local_int16; |
| 216 | + |
| 217 | + int a1[_Generic(local_int8, svint8_t : 1, svint16_t : 2, default : 3) == 1 ? 1 : -1]; |
| 218 | + int a2[_Generic(local_int16, svint8_t : 1, svint16_t : 2, default : 3) == 2 ? 1 : -1]; |
| 219 | + int a3[_Generic(0, svint8_t : 1, svint16_t : 2, default : 3) == 3 ? 1 : -1]; |
| 220 | + (void)_Generic(0, svint8_t : 1, svint8_t : 2, default : 3); // expected-error {{type 'svint8_t' (aka '__SVInt8_t') in generic association compatible with previously specified type 'svint8_t'}} expected-note {{compatible type}} |
| 221 | +} |
| 222 | +#endif |
0 commit comments