179b45389SRichard Trieu // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*644eb0a8SRafael Espindola // RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
379b45389SRichard Trieu namespace std {
479b45389SRichard Trieu template <class X>
579b45389SRichard Trieu class initializer_list {
679b45389SRichard Trieu public:
779b45389SRichard Trieu initializer_list();
879b45389SRichard Trieu };
979b45389SRichard Trieu }
1079b45389SRichard Trieu
1179b45389SRichard Trieu class Foo {
1279b45389SRichard Trieu public:
1379b45389SRichard Trieu Foo();
1479b45389SRichard Trieu Foo(std::initializer_list<int>);
1579b45389SRichard Trieu bool operator==(const Foo);
1679b45389SRichard Trieu Foo operator+(const Foo);
1779b45389SRichard Trieu };
1879b45389SRichard Trieu
1979b45389SRichard Trieu #define EQ(x,y) (void)(x == y) // expected-note 6{{defined here}}
test_EQ()2079b45389SRichard Trieu void test_EQ() {
2179b45389SRichard Trieu Foo F;
2279b45389SRichard Trieu F = Foo{1,2};
2379b45389SRichard Trieu
2479b45389SRichard Trieu EQ(F,F);
2579b45389SRichard Trieu EQ(F,Foo());
2679b45389SRichard Trieu EQ(F,Foo({1,2,3}));
2779b45389SRichard Trieu EQ(Foo({1,2,3}),F);
2879b45389SRichard Trieu EQ((Foo{1,2,3}),(Foo{1,2,3}));
2979b45389SRichard Trieu EQ(F, F + F);
3079b45389SRichard Trieu EQ(F, Foo({1,2,3}) + Foo({1,2,3}));
3179b45389SRichard Trieu EQ(F, (Foo{1,2,3} + Foo{1,2,3}));
3279b45389SRichard Trieu
3379b45389SRichard Trieu EQ(F,Foo{1,2,3});
3479b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
3579b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
3679b45389SRichard Trieu EQ(Foo{1,2,3},F);
3779b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
3879b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
3979b45389SRichard Trieu EQ(Foo{1,2,3},Foo{1,2,3});
4079b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
4179b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
4279b45389SRichard Trieu
4379b45389SRichard Trieu EQ(Foo{1,2,3} + Foo{1,2,3}, F);
4479b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
4579b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
4679b45389SRichard Trieu EQ(F, Foo({1,2,3}) + Foo{1,2,3});
4779b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
4879b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
4979b45389SRichard Trieu EQ(F, Foo{1,2,3} + Foo{1,2,3});
5079b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
5179b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
5279b45389SRichard Trieu }
5379b45389SRichard Trieu
5479b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:8-33:8}:"("
5579b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:18-33:18}:")"
5679b45389SRichard Trieu
5779b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:6-36:6}:"("
5879b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:16-36:16}:")"
5979b45389SRichard Trieu
6079b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:6-39:6}:"("
6179b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:16-39:16}:")"
6279b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:17-39:17}:"("
6379b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:27-39:27}:")"
6479b45389SRichard Trieu
6579b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:6-43:6}:"("
6679b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:29-43:29}:")"
6779b45389SRichard Trieu
6879b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:9-46:9}:"("
6979b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:34-46:34}:")"
7079b45389SRichard Trieu
7179b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:9-49:9}:"("
7279b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:32-49:32}:")"
7379b45389SRichard Trieu
7479b45389SRichard Trieu #define NE(x,y) (void)(x != y) // expected-note 6{{defined here}}
7579b45389SRichard Trieu // Operator != isn't defined. This tests that the corrected macro arguments
7679b45389SRichard Trieu // are used in the macro expansion.
test_NE()7779b45389SRichard Trieu void test_NE() {
7879b45389SRichard Trieu Foo F;
7979b45389SRichard Trieu
8079b45389SRichard Trieu NE(F,F);
8179b45389SRichard Trieu // expected-error@-1 {{invalid operands}}
8279b45389SRichard Trieu NE(F,Foo());
8379b45389SRichard Trieu // expected-error@-1 {{invalid operands}}
8479b45389SRichard Trieu NE(F,Foo({1,2,3}));
8579b45389SRichard Trieu // expected-error@-1 {{invalid operands}}
8679b45389SRichard Trieu NE((Foo{1,2,3}),(Foo{1,2,3}));
8779b45389SRichard Trieu // expected-error@-1 {{invalid operands}}
8879b45389SRichard Trieu
8979b45389SRichard Trieu NE(F,Foo{1,2,3});
9079b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
9179b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
9279b45389SRichard Trieu // expected-error@-3 {{invalid operands}}
9379b45389SRichard Trieu NE(Foo{1,2,3},F);
9479b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
9579b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
9679b45389SRichard Trieu // expected-error@-3 {{invalid operands}}
9779b45389SRichard Trieu NE(Foo{1,2,3},Foo{1,2,3});
9879b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
9979b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
10079b45389SRichard Trieu // expected-error@-3 {{invalid operands}}
10179b45389SRichard Trieu
10279b45389SRichard Trieu NE(Foo{1,2,3} + Foo{1,2,3}, F);
10379b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
10479b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
10579b45389SRichard Trieu // expected-error@-3 {{invalid operands}}
10679b45389SRichard Trieu NE(F, Foo({1,2,3}) + Foo{1,2,3});
10779b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
10879b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
10979b45389SRichard Trieu // expected-error@-3 {{invalid operands}}
11079b45389SRichard Trieu NE(F, Foo{1,2,3} + Foo{1,2,3});
11179b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
11279b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
11379b45389SRichard Trieu // expected-error@-3 {{invalid operands}}
11479b45389SRichard Trieu }
11579b45389SRichard Trieu
11679b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:8-89:8}:"("
11779b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:18-89:18}:")"
11879b45389SRichard Trieu
11979b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:6-93:6}:"("
12079b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:16-93:16}:")"
12179b45389SRichard Trieu
12279b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:6-97:6}:"("
12379b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:16-97:16}:")"
12479b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:17-97:17}:"("
12579b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:27-97:27}:")"
12679b45389SRichard Trieu
12779b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:6-102:6}:"("
12879b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:29-102:29}:")"
12979b45389SRichard Trieu
13079b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:9-106:9}:"("
13179b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:34-106:34}:")"
13279b45389SRichard Trieu
13379b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:9-110:9}:"("
13479b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")"
13579b45389SRichard Trieu
13679b45389SRichard Trieu #define INIT(var, init) Foo var = init; // expected-note 3{{defined here}}
13779b45389SRichard Trieu // Can't use an initializer list as a macro argument. The commas in the list
13879b45389SRichard Trieu // will be interpretted as argument separaters and adding parenthesis will
13979b45389SRichard Trieu // make it no longer an initializer list.
test()14079b45389SRichard Trieu void test() {
14179b45389SRichard Trieu INIT(a, Foo());
14279b45389SRichard Trieu INIT(b, Foo({1, 2, 3}));
14379b45389SRichard Trieu INIT(c, Foo());
14479b45389SRichard Trieu
14579b45389SRichard Trieu INIT(d, Foo{1, 2, 3});
14679b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
14779b45389SRichard Trieu // expected-note@-2 {{parentheses are required}}
14879b45389SRichard Trieu
14979b45389SRichard Trieu // Can't be fixed by parentheses.
15079b45389SRichard Trieu INIT(e, {1, 2, 3});
15179b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
15279b45389SRichard Trieu // expected-error@-2 {{use of undeclared identifier}}
1537aa72185SRichard Trieu // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}
15479b45389SRichard Trieu
15579b45389SRichard Trieu // Can't be fixed by parentheses.
15679b45389SRichard Trieu INIT(e, {1, 2, 3} + {1, 2, 3});
15779b45389SRichard Trieu // expected-error@-1 {{too many arguments provided}}
15879b45389SRichard Trieu // expected-error@-2 {{use of undeclared identifier}}
1597aa72185SRichard Trieu // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}
16079b45389SRichard Trieu }
16179b45389SRichard Trieu
16279b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"("
16379b45389SRichard Trieu // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")"
16479b45389SRichard Trieu
16579b45389SRichard Trieu #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \
16679b45389SRichard Trieu Foo name = a + b + c + d + e + f + g + h + i + j + k + l;
16779b45389SRichard Trieu // expected-note@-2 2{{defined here}}
test2()16879b45389SRichard Trieu void test2() {
16979b45389SRichard Trieu M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(),
17079b45389SRichard Trieu Foo(), Foo(), Foo(), Foo(), Foo(), Foo());
17179b45389SRichard Trieu
17279b45389SRichard Trieu M(F2, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3},
17379b45389SRichard Trieu Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3});
17479b45389SRichard Trieu // expected-error@-2 {{too many arguments provided}}
17579b45389SRichard Trieu // expected-note@-3 {{parentheses are required}}
17679b45389SRichard Trieu
17779b45389SRichard Trieu M(F3, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3},
17879b45389SRichard Trieu {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3});
17979b45389SRichard Trieu // expected-error@-2 {{too many arguments provided}}
18079b45389SRichard Trieu // expected-error@-3 {{use of undeclared identifier}}
1817aa72185SRichard Trieu // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}}
18279b45389SRichard Trieu }
183