Skip to content

Commit cd40ea9

Browse files
committed
Add parser tests
1 parent 94d0520 commit cd40ea9

File tree

3 files changed

+70
-3
lines changed

3 files changed

+70
-3
lines changed

clang/lib/Sema/SemaExpand.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,13 @@ StmtResult Sema::ActOnCXXExpansionStmtPattern(
6969
Expr *ExpansionInitializer, SourceLocation LParenLoc,
7070
SourceLocation ColonLoc, SourceLocation RParenLoc,
7171
ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps) {
72-
Diag(ColonLoc, diag::err_expansion_stmt_todo);
72+
Diag(ESD->getLocation(), diag::err_expansion_statements_todo);
7373
return StmtError();
7474
}
7575

7676
StmtResult Sema::FinishCXXExpansionStmt(Stmt *Exp, Stmt *Body) {
7777
if (!Exp || !Body)
7878
return StmtError();
7979

80-
Diag(Exp->getBeginLoc(), diag::err_expansion_stmt_todo);
81-
return StmtError();
80+
llvm_unreachable("TODO");
8281
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: %clang_cc1 %s -std=c++23 -fsyntax-only -verify
2+
3+
void f() {
4+
template for (char x : "123") {} // expected-error {{expansion statements are only supported in C++2c}}
5+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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

Comments
 (0)