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