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}}
test_EQ()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.
test_NE()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.
test()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}}
test2()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