1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 // RUN: not %clang_cc1 -std=c++11 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s 3 namespace std { 4 template <class X> 5 class initializer_list { 6 public: 7 initializer_list(); 8 }; 9 } 10 11 class Foo { 12 public: 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}} 20 void 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 arguments 76 // are used in the macro expansion. 77 void 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 list 138 // will be interpretted as argument separaters and adding parenthesis will 139 // make it no longer an initializer list. 140 void 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}} 168 void 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