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
5 class initializer_list
{
14 Foo(std::initializer_list
<int>);
15 bool operator==(const Foo
);
16 Foo
operator+(const Foo
);
19 #define EQ(x,y) (void)(x == y) // expected-note 6{{defined here}}
28 EQ((Foo
{1,2,3}),(Foo
{1,2,3}));
30 EQ(F
, Foo({1,2,3}) + Foo({1,2,3}));
31 EQ(F
, (Foo
{1,2,3} + Foo
{1,2,3}));
34 // expected-error@-1 {{too many arguments provided}}
35 // expected-note@-2 {{parentheses are required}}
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}}
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}}
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}:")"
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}:")"
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}:")"
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}:")"
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}:")"
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}:")"
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.
81 // expected-error@-1 {{invalid operands}}
83 // expected-error@-1 {{invalid operands}}
85 // expected-error@-1 {{invalid operands}}
86 NE((Foo
{1,2,3}),(Foo
{1,2,3}));
87 // expected-error@-1 {{invalid operands}}
90 // expected-error@-1 {{too many arguments provided}}
91 // expected-note@-2 {{parentheses are required}}
92 // expected-error@-3 {{invalid operands}}
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}}
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}}
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}:")"
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}:")"
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}:")"
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}:")"
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}:")"
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}:")"
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.
142 INIT(b
, Foo({1, 2, 3}));
145 INIT(d
, Foo
{1, 2, 3});
146 // expected-error@-1 {{too many arguments provided}}
147 // expected-note@-2 {{parentheses are required}}
149 // Can't be fixed by parentheses.
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}}
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}}
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}:")"
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}}
169 M(F1
, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(),
170 Foo(), Foo(), Foo(), Foo(), Foo(), Foo());
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}}
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}}