15940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
21675c5031fccc69b838973f1c53719716cecc7c7Rafael Espindola// RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
35940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieunamespace std {
45940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  template <class X>
55940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  class initializer_list {
65940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu    public:
75940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu    initializer_list();
85940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  };
95940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu}
105940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
115940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieuclass Foo {
125940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieupublic:
135940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  Foo();
145940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  Foo(std::initializer_list<int>);
155940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  bool operator==(const Foo);
165940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  Foo operator+(const Foo);
175940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu};
185940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
195940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu#define EQ(x,y) (void)(x == y)  // expected-note 6{{defined here}}
205940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieuvoid test_EQ() {
215940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  Foo F;
225940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  F = Foo{1,2};
235940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
245940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F,F);
255940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F,Foo());
265940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F,Foo({1,2,3}));
275940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(Foo({1,2,3}),F);
285940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ((Foo{1,2,3}),(Foo{1,2,3}));
295940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F, F + F);
305940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F, Foo({1,2,3}) + Foo({1,2,3}));
315940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F, (Foo{1,2,3} + Foo{1,2,3}));
325940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
335940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F,Foo{1,2,3});
345940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
355940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
365940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(Foo{1,2,3},F);
375940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
385940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
395940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(Foo{1,2,3},Foo{1,2,3});
405940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
415940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
425940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
435940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(Foo{1,2,3} + Foo{1,2,3}, F);
445940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
455940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
465940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F, Foo({1,2,3}) + Foo{1,2,3});
475940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
485940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
495940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  EQ(F, Foo{1,2,3} + Foo{1,2,3});
505940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
515940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
525940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu}
535940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
545940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:8-33:8}:"("
555940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:18-33:18}:")"
565940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
575940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:6-36:6}:"("
585940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:16-36:16}:")"
595940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
605940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:6-39:6}:"("
615940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:16-39:16}:")"
625940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:17-39:17}:"("
635940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:27-39:27}:")"
645940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
655940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:6-43:6}:"("
665940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:29-43:29}:")"
675940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
685940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:9-46:9}:"("
695940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:34-46:34}:")"
705940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
715940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:9-49:9}:"("
725940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:32-49:32}:")"
735940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
745940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu#define NE(x,y) (void)(x != y)  // expected-note 6{{defined here}}
755940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// Operator != isn't defined.  This tests that the corrected macro arguments
765940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// are used in the macro expansion.
775940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieuvoid test_NE() {
785940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  Foo F;
795940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
805940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(F,F);
815940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{invalid operands}}
825940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(F,Foo());
835940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{invalid operands}}
845940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(F,Foo({1,2,3}));
855940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{invalid operands}}
865940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE((Foo{1,2,3}),(Foo{1,2,3}));
875940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{invalid operands}}
885940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
895940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(F,Foo{1,2,3});
905940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
915940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
925940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{invalid operands}}
935940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(Foo{1,2,3},F);
945940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
955940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
965940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{invalid operands}}
975940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(Foo{1,2,3},Foo{1,2,3});
985940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
995940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
1005940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{invalid operands}}
1015940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1025940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(Foo{1,2,3} + Foo{1,2,3}, F);
1035940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
1045940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
1055940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{invalid operands}}
1065940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(F, Foo({1,2,3}) + Foo{1,2,3});
1075940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
1085940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
1095940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{invalid operands}}
1105940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  NE(F, Foo{1,2,3} + Foo{1,2,3});
1115940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
1125940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
1135940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{invalid operands}}
1145940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu}
1155940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1165940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:8-89:8}:"("
1175940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:18-89:18}:")"
1185940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1195940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:6-93:6}:"("
1205940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:16-93:16}:")"
1215940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1225940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:6-97:6}:"("
1235940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:16-97:16}:")"
1245940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:17-97:17}:"("
1255940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:27-97:27}:")"
1265940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1275940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:6-102:6}:"("
1285940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:29-102:29}:")"
1295940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1305940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:9-106:9}:"("
1315940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:34-106:34}:")"
1325940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1335940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:9-110:9}:"("
1345940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")"
1355940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1365940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu#define INIT(var, init) Foo var = init; // expected-note 3{{defined here}}
1375940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// Can't use an initializer list as a macro argument.  The commas in the list
1385940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// will be interpretted as argument separaters and adding parenthesis will
1395940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// make it no longer an initializer list.
1405940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieuvoid test() {
1415940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  INIT(a, Foo());
1425940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  INIT(b, Foo({1, 2, 3}));
1435940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  INIT(c, Foo());
1445940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1455940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  INIT(d, Foo{1, 2, 3});
1465940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
1475940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-2 {{parentheses are required}}
1485940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1495940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // Can't be fixed by parentheses.
1505940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  INIT(e, {1, 2, 3});
1515940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
1525940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-2 {{use of undeclared identifier}}
153679efe14c65492c74eaa6dc98671abcdbfac8da8Richard Trieu  // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}
1545940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1555940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // Can't be fixed by parentheses.
1565940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  INIT(e, {1, 2, 3} + {1, 2, 3});
1575940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-1 {{too many arguments provided}}
1585940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-2 {{use of undeclared identifier}}
159679efe14c65492c74eaa6dc98671abcdbfac8da8Richard Trieu  // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}
1605940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu}
1615940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1625940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"("
1635940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")"
1645940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1655940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu#define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \
1665940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  Foo name = a + b + c + d + e + f + g + h + i + j + k + l;
1675940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu// expected-note@-2 2{{defined here}}
1685940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieuvoid test2() {
1695940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(),
1705940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu        Foo(), Foo(), Foo(), Foo(), Foo(), Foo());
1715940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1725940bf33061844c9a61d4d5c1230df9cf9e90342Richard 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},
1735940bf33061844c9a61d4d5c1230df9cf9e90342Richard 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});
1745940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-2 {{too many arguments provided}}
1755940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-note@-3 {{parentheses are required}}
1765940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu
1775940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  M(F3, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3},
1785940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu        {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3});
1795940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-2 {{too many arguments provided}}
1805940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu  // expected-error@-3 {{use of undeclared identifier}}
181679efe14c65492c74eaa6dc98671abcdbfac8da8Richard Trieu  // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}}
1825940bf33061844c9a61d4d5c1230df9cf9e90342Richard Trieu}
183