183 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s2// RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s3namespace std {4 template <class X>5 class initializer_list {6 public: const X *a, *b;7 initializer_list();8 };9}10 11class Foo {12public:13 Foo();14 Foo(std::initializer_list<int>);15 bool operator==(const Foo);16 Foo operator+(const Foo);17};18 19#define EQ(x,y) (void)(x == y) // expected-note 6{{defined here}}20void test_EQ() {21 Foo F;22 F = Foo{1,2};23 24 EQ(F,F);25 EQ(F,Foo());26 EQ(F,Foo({1,2,3}));27 EQ(Foo({1,2,3}),F);28 EQ((Foo{1,2,3}),(Foo{1,2,3}));29 EQ(F, F + F);30 EQ(F, Foo({1,2,3}) + Foo({1,2,3}));31 EQ(F, (Foo{1,2,3} + Foo{1,2,3}));32 33 EQ(F,Foo{1,2,3});34 // expected-error@-1 {{too many arguments provided}}35 // expected-note@-2 {{parentheses are required}}36 EQ(Foo{1,2,3},F);37 // expected-error@-1 {{too many arguments provided}}38 // expected-note@-2 {{parentheses are required}}39 EQ(Foo{1,2,3},Foo{1,2,3});40 // expected-error@-1 {{too many arguments provided}}41 // expected-note@-2 {{parentheses are required}}42 43 EQ(Foo{1,2,3} + Foo{1,2,3}, F);44 // expected-error@-1 {{too many arguments provided}}45 // expected-note@-2 {{parentheses are required}}46 EQ(F, Foo({1,2,3}) + Foo{1,2,3});47 // expected-error@-1 {{too many arguments provided}}48 // expected-note@-2 {{parentheses are required}}49 EQ(F, Foo{1,2,3} + Foo{1,2,3});50 // expected-error@-1 {{too many arguments provided}}51 // expected-note@-2 {{parentheses are required}}52}53 54// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:8-33:8}:"("55// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{33:18-33:18}:")"56 57// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:6-36:6}:"("58// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{36:16-36:16}:")"59 60// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:6-39:6}:"("61// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:16-39:16}:")"62// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:17-39:17}:"("63// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{39:27-39:27}:")"64 65// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:6-43:6}:"("66// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{43:29-43:29}:")"67 68// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:9-46:9}:"("69// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{46:34-46:34}:")"70 71// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:9-49:9}:"("72// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{49:32-49:32}:")"73 74#define NE(x,y) (void)(x != y) // expected-note 6{{defined here}}75// Operator != isn't defined. This tests that the corrected macro arguments76// are used in the macro expansion.77void test_NE() {78 Foo F;79 80 NE(F,F);81 // expected-error@-1 {{invalid operands}}82 NE(F,Foo());83 // expected-error@-1 {{invalid operands}}84 NE(F,Foo({1,2,3}));85 // expected-error@-1 {{invalid operands}}86 NE((Foo{1,2,3}),(Foo{1,2,3}));87 // expected-error@-1 {{invalid operands}}88 89 NE(F,Foo{1,2,3});90 // expected-error@-1 {{too many arguments provided}}91 // expected-note@-2 {{parentheses are required}}92 // expected-error@-3 {{invalid operands}}93 NE(Foo{1,2,3},F);94 // expected-error@-1 {{too many arguments provided}}95 // expected-note@-2 {{parentheses are required}}96 // expected-error@-3 {{invalid operands}}97 NE(Foo{1,2,3},Foo{1,2,3});98 // expected-error@-1 {{too many arguments provided}}99 // expected-note@-2 {{parentheses are required}}100 // expected-error@-3 {{invalid operands}}101 102 NE(Foo{1,2,3} + Foo{1,2,3}, F);103 // expected-error@-1 {{too many arguments provided}}104 // expected-note@-2 {{parentheses are required}}105 // expected-error@-3 {{invalid operands}}106 NE(F, Foo({1,2,3}) + Foo{1,2,3});107 // expected-error@-1 {{too many arguments provided}}108 // expected-note@-2 {{parentheses are required}}109 // expected-error@-3 {{invalid operands}}110 NE(F, Foo{1,2,3} + Foo{1,2,3});111 // expected-error@-1 {{too many arguments provided}}112 // expected-note@-2 {{parentheses are required}}113 // expected-error@-3 {{invalid operands}}114}115 116// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:8-89:8}:"("117// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{89:18-89:18}:")"118 119// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:6-93:6}:"("120// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{93:16-93:16}:")"121 122// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:6-97:6}:"("123// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:16-97:16}:")"124// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:17-97:17}:"("125// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{97:27-97:27}:")"126 127// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:6-102:6}:"("128// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{102:29-102:29}:")"129 130// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:9-106:9}:"("131// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{106:34-106:34}:")"132 133// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:9-110:9}:"("134// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")"135 136#define INIT(var, init) Foo var = init; // expected-note 3{{defined here}}137// Can't use an initializer list as a macro argument. The commas in the list138// will be interpretted as argument separaters and adding parenthesis will139// make it no longer an initializer list.140void test() {141 INIT(a, Foo());142 INIT(b, Foo({1, 2, 3}));143 INIT(c, Foo());144 145 INIT(d, Foo{1, 2, 3});146 // expected-error@-1 {{too many arguments provided}}147 // expected-note@-2 {{parentheses are required}}148 149 // Can't be fixed by parentheses.150 INIT(e, {1, 2, 3});151 // expected-error@-1 {{too many arguments provided}}152 // expected-error@-2 {{use of undeclared identifier}}153 // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}154 155 // Can't be fixed by parentheses.156 INIT(e, {1, 2, 3} + {1, 2, 3});157 // expected-error@-1 {{too many arguments provided}}158 // expected-error@-2 {{use of undeclared identifier}}159 // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}}160}161 162// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"("163// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")"164 165#define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \166 Foo name = a + b + c + d + e + f + g + h + i + j + k + l;167// expected-note@-2 2{{defined here}}168void test2() {169 M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(),170 Foo(), Foo(), Foo(), Foo(), Foo(), Foo());171 172 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},173 Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3}, Foo{1,2,3});174 // expected-error@-2 {{too many arguments provided}}175 // expected-note@-3 {{parentheses are required}}176 177 M(F3, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3},178 {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3});179 // expected-error@-2 {{too many arguments provided}}180 // expected-error@-3 {{use of undeclared identifier}}181 // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}}182}183