|
| 1 | +// RUN: %clang_cc1 %s -std=c++2c -fsyntax-only -verify |
| 2 | +namespace std { |
| 3 | +template <typename T> |
| 4 | +struct initializer_list { |
| 5 | + const T* a; |
| 6 | + const T* b; |
| 7 | + initializer_list(T*, T*) {} |
| 8 | +}; |
| 9 | +} |
| 10 | + |
| 11 | +void bad() { |
| 12 | + template for; // expected-error {{expected '(' after 'for'}} |
| 13 | + template for (); // expected-error {{expected expression}} expected-error {{expected ';' in 'for' statement specifier}} expected-error {{expansion statement must be a range-based for loop}} expected-error {{TODO (expansion statements)}} |
| 14 | + template for (;); // expected-error {{expected ';' in 'for' statement specifier}} expected-error {{expansion statement must be a range-based for loop}} expected-error {{TODO (expansion statements)}} |
| 15 | + template for (;;); // expected-error {{expansion statement must be a range-based for loop}} expected-error {{TODO (expansion statements)}} |
| 16 | + template for (int x;;); // expected-error {{expansion statement must be a range-based for loop}} expected-error {{TODO (expansion statements)}} |
| 17 | + template for (x : {1}); // expected-error {{expansion statement requires type for expansion variable}} expected-error {{TODO (expansion statements)}} |
| 18 | + template for (: {1}); // expected-error {{expected expression}} expected-error {{expected ';' in 'for' statement specifier}} expected-error {{expansion statement must be a range-based for loop}} expected-error {{TODO (expansion statements)}} |
| 19 | + template for (auto y : {1})]; // expected-error {{expected expression}} expected-error {{TODO (expansion statements)}} |
| 20 | + template for (auto y : {1}; // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{TODO (expansion statements)}} |
| 21 | + template for (extern auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'extern'}} expected-error {{TODO (expansion statements)}} |
| 22 | + template for (extern static auto y : {1, 2}); // expected-error {{cannot combine with previous 'extern' declaration specifier}} expected-error {{expansion variable 'y' may not be declared 'extern'}} expected-error {{TODO (expansion statements)}} |
| 23 | + template for (static auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'static'}} expected-error {{TODO (expansion statements)}} |
| 24 | + template for (thread_local auto y : {1, 2}); // expected-error {{'thread_local' variables must have global storage}} expected-error {{TODO (expansion statements)}} |
| 25 | + template for (static thread_local auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'thread_local'}} expected-error {{TODO (expansion statements)}} |
| 26 | + template for (__thread auto y : {1, 2}); // expected-error {{'__thread' variables must have global storage}} expected-error {{TODO (expansion statements)}} |
| 27 | + template for (static __thread auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'static'}} expected-error {{TODO (expansion statements)}} |
| 28 | + template for (constinit auto y : {1, 2}); // expected-error {{local variable cannot be declared 'constinit'}} expected-error {{TODO (expansion statements)}} |
| 29 | + template for (consteval auto y : {1, 2}); // expected-error {{consteval can only be used in function declarations}} expected-error {{TODO (expansion statements)}} |
| 30 | + template for (int x; extern auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'extern'}} expected-error {{TODO (expansion statements)}} |
| 31 | + template for (int x; extern static auto y : {1, 2}); // expected-error {{cannot combine with previous 'extern' declaration specifier}} expected-error {{expansion variable 'y' may not be declared 'extern'}} expected-error {{TODO (expansion statements)}} |
| 32 | + template for (int x; static auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'static'}} expected-error {{TODO (expansion statements)}} |
| 33 | + template for (int x; thread_local auto y : {1, 2}); // expected-error {{'thread_local' variables must have global storage}} expected-error {{TODO (expansion statements)}} |
| 34 | + template for (int x; static thread_local auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'thread_local'}} expected-error {{TODO (expansion statements)}} |
| 35 | + template for (int x; __thread auto y : {1, 2}); // expected-error {{'__thread' variables must have global storage}} expected-error {{TODO (expansion statements)}} |
| 36 | + template for (int x; static __thread auto y : {1, 2}); // expected-error {{expansion variable 'y' may not be declared 'static'}} expected-error {{TODO (expansion statements)}} |
| 37 | + template for (int x; constinit auto y : {1, 2}); // expected-error {{local variable cannot be declared 'constinit'}} expected-error {{TODO (expansion statements)}} |
| 38 | + template for (int x; consteval auto y : {1, 2}); // expected-error {{consteval can only be used in function declarations}} expected-error {{TODO (expansion statements)}} |
| 39 | + template for (auto y : {abc, -+, }); // expected-error {{use of undeclared identifier 'abc'}} expected-error {{expected expression}} expected-error {{TODO (expansion statements)}} |
| 40 | + template for (3 : "error") // expected-error {{expansion statement declaration must declare a variable}} \ |
| 41 | + expected-error {{expansion statement must be a range-based for loop}} expected-error {{TODO (expansion statements)}} |
| 42 | + ; |
| 43 | + template while (true) {} // expected-error {{expected '<' after 'template'}} |
| 44 | +} |
| 45 | + |
| 46 | +void good() { |
| 47 | + template for (auto y : {}); // expected-error {{TODO (expansion statements)}} |
| 48 | + template for (auto y : {1, 2}); // expected-error {{TODO (expansion statements)}} |
| 49 | + template for (int x; auto y : {1, 2}); // expected-error {{TODO (expansion statements)}} |
| 50 | + template for (int x; int y : {1, 2}); // expected-error {{TODO (expansion statements)}} |
| 51 | + template for (int x; constexpr auto y : {1, 2}); // expected-error {{TODO (expansion statements)}} |
| 52 | + template for (int x; constexpr int y : {1, 2}); // expected-error {{TODO (expansion statements)}} |
| 53 | + template for (constexpr int a : {1, 2}) { // expected-error {{TODO (expansion statements)}} |
| 54 | + template for (constexpr int b : {1, 2}) { // expected-error {{TODO (expansion statements)}} |
| 55 | + template for (constexpr int c : {1, 2}); // expected-error {{TODO (expansion statements)}} |
| 56 | + } |
| 57 | + } |
| 58 | +} |
| 59 | + |
| 60 | +void trailing_comma() { |
| 61 | + template for (int x : {1, 2,}) {} // expected-error {{TODO (expansion statements)}} |
| 62 | + template for (int x : {,}) {} // expected-error {{expected expression}} expected-error {{TODO (expansion statements)}} |
| 63 | +} |
0 commit comments