1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify=expected,expected-cxx11 -std=c++11 -Wsign-conversion %s
2 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify=expected,expected-cxx11 -std=c++11 -Wsign-conversion %s -fexperimental-new-constant-interpreter
3 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify=expected,expected-cxx17 -std=c++17 -Wsign-conversion %s
4 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify=expected,expected-cxx17 -std=c++17 -Wsign-conversion %s -fexperimental-new-constant-interpreter
6 // C++ rules for ?: are a lot stricter than C rules, and have to take into
7 // account more conversion options.
8 // This test runs in C++11 mode for the contextual conversion of the condition.
10 struct ToBool
{ explicit operator bool(); };
15 A(const B
&); // expected-note 2 {{candidate constructor}}
17 struct B
{ operator A() const; }; // expected-note 2 {{candidate function}}
18 struct I
{ operator int(); };
19 struct J
{ operator I(); };
20 struct K
{ operator double(); };
21 typedef void (*vfn
)();
22 struct F
{ operator vfn(); };
23 struct G
{ operator vfn(); };
30 struct Derived
: Base
{
33 struct Convertible
{ operator Base
&(); };
34 struct Priv
: private Base
{}; // expected-note 4 {{declared private here}}
36 struct Fin
: Mid
, Derived
{};
37 typedef void (Derived::*DFnPtr
)();
38 struct ToMemPtr
{ operator DFnPtr(); };
41 struct BadBase
{ operator BadDerived
&(); };
42 struct BadDerived
: BadBase
{};
45 int i1
, i2
, b1
: 3, b2
: 3;
51 const volatile int cvi
;
53 struct MixedFieldsDerived
: MixedFields
{
59 operator short(); // expected-note 2 {{candidate function}}
60 operator signed char(); // expected-note 2 {{candidate function}}
64 virtual ~Abstract() = 0; // expected-note {{unimplemented pure virtual method '~Abstract' in 'Abstract'}}
67 struct Derived1
: Abstract
{
70 struct Derived2
: Abstract
{
75 // This function tests C++0x 5.16
77 // p1 (contextually convert to bool)
78 int i1
= ToBool() ? 0 : 1;
80 // p2 (one or both void, and throwing)
82 i1
? throw 0 : throw 1;
83 i1
? test() : throw 1;
84 i1
? throw 0 : test();
86 i1
= i1
? throw 0 : 0;
87 i1
= i1
? 0 : throw 0;
88 i1
= i1
? (throw 0) : 0;
89 i1
= i1
? 0 : (throw 0);
90 i1
? 0 : test(); // expected-error {{right operand to ? is void, but left operand is of type 'int'}}
91 i1
? test() : 0; // expected-error {{left operand to ? is void, but right operand is of type 'int'}}
92 (i1
? throw 0 : i1
) = 0;
93 (i1
? i1
: throw 0) = 0;
94 (i1
? (throw 0) : i1
) = 0;
95 (i1
? i1
: (throw 0)) = 0;
96 (i1
? (void)(throw 0) : i1
) = 0; // expected-error {{left operand to ? is void, but right operand is of type 'int'}}
97 (i1
? i1
: (void)(throw 0)) = 0; // expected-error {{right operand to ? is void, but left operand is of type 'int'}}
98 int &throwRef1
= (i1
? flds
.i1
: throw 0);
99 int &throwRef2
= (i1
? throw 0 : flds
.i1
);
100 int &throwRef3
= (i1
? flds
.b1
: throw 0); // expected-error {{non-const reference cannot bind to bit-field}}
101 int &throwRef4
= (i1
? throw 0 : flds
.b1
); // expected-error {{non-const reference cannot bind to bit-field}}
103 // p3 (one or both class type, convert to each other)
108 Base
&bar1
= i1
? base
: derived
;
109 Base
&bar2
= i1
? derived
: base
;
110 Base
&bar3
= i1
? base
: conv
;
111 Base
&bar4
= i1
? conv
: base
;
112 // these are ambiguous
115 (void)(i1
? bb
: bd
); // expected-error {{conditional expression is ambiguous; 'BadBase' can be converted to 'BadDerived' and vice versa}}
116 (void)(i1
? bd
: bb
); // expected-error {{conditional expression is ambiguous}}
117 // curiously enough (and a defect?), these are not
118 // for rvalues, hierarchy takes precedence over other conversions
119 (void)(i1
? BadBase() : BadDerived());
120 (void)(i1
? BadDerived() : BadBase());
122 // b2.1 (hierarchy stuff)
123 extern const Base
constret();
124 extern const Derived
constder();
125 // should use const overload
126 A
a1((i1
? constret() : Base()).trick());
127 A
a2((i1
? Base() : constret()).trick());
128 A
a3((i1
? constret() : Derived()).trick());
129 A
a4((i1
? Derived() : constret()).trick());
130 // should use non-const overload
131 i1
= (i1
? Base() : Base()).trick();
132 i1
= (i1
? Base() : Base()).trick();
133 i1
= (i1
? Base() : Derived()).trick();
134 i1
= (i1
? Derived() : Base()).trick();
135 // should fail: const lost
136 (void)(i1
? Base() : constder()); // expected-error {{incompatible operand types ('Base' and 'const Derived')}}
137 (void)(i1
? constder() : Base()); // expected-error {{incompatible operand types ('const Derived' and 'Base')}}
141 (void)(i1
? Base() : Priv()); // expected-error{{private base class}}
142 (void)(i1
? Priv() : Base()); // expected-error{{private base class}}
143 (void)(i1
? Base() : Fin()); // expected-error{{ambiguous conversion from derived class 'Fin' to base class 'Base':}}
144 (void)(i1
? Fin() : Base()); // expected-error{{ambiguous conversion from derived class 'Fin' to base class 'Base':}}
145 (void)(i1
? base
: priv
); // expected-error {{private base class}}
146 (void)(i1
? priv
: base
); // expected-error {{private base class}}
147 (void)(i1
? base
: fin
); // expected-error {{ambiguous conversion from derived class 'Fin' to base class 'Base':}}
148 (void)(i1
? fin
: base
); // expected-error {{ambiguous conversion from derived class 'Fin' to base class 'Base':}}
150 // b2.2 (non-hierarchy)
153 I
i2(i1
? I() : J());
154 I
i3(i1
? J() : I());
155 // "the type [it] would have if E2 were converted to an rvalue"
156 vfn pfn
= i1
? F() : test
;
157 pfn
= i1
? test
: F();
158 (void)(i1
? A() : B()); // expected-error {{conversion from 'B' to 'A' is ambiguous}}
159 (void)(i1
? B() : A()); // expected-error {{conversion from 'B' to 'A' is ambiguous}}
160 (void)(i1
? 1 : Ambig()); // expected-error {{conversion from 'Ambig' to 'int' is ambiguous}}
161 (void)(i1
? Ambig() : 1); // expected-error {{conversion from 'Ambig' to 'int' is ambiguous}}
162 // By the way, this isn't an lvalue:
163 &(i1
? i1
: i2
); // expected-error {{cannot take the address of an rvalue}}
165 // p4 (lvalue, same type)
166 int &ir1
= i1
? flds
.i1
: flds
.i2
;
167 (i1
? flds
.b1
: flds
.i2
) = 0;
168 (i1
? flds
.i1
: flds
.b2
) = 0;
169 (i1
? flds
.b1
: flds
.b2
) = 0;
171 // p5 (conversion to built-in types)
172 // GCC 4.3 fails these
173 double d1
= i1
? I() : K();
174 pfn
= i1
? F() : G();
176 pfm
= i1
? DFnPtr() : &Base::fn1
;
177 pfm
= i1
? &Base::fn1
: DFnPtr();
179 // p6 (final conversions)
181 int *pi1
= i1
? &i1
: 0;
187 Base
*pb
= i1
? (Base
*)0 : (Derived
*)0;
188 pb
= i1
? (Derived
*)0 : (Base
*)0;
189 pfm
= i1
? &Base::fn1
: &Derived::fn2
;
190 pfm
= i1
? &Derived::fn2
: &Base::fn1
;
191 pfm
= i1
? &Derived::fn2
: 0;
192 pfm
= i1
? 0 : &Derived::fn2
;
193 const int (MixedFieldsDerived::*mp1
) =
194 i1
? &MixedFields::ci
: &MixedFieldsDerived::i
;
195 const volatile int (MixedFields::*mp2
) =
196 i1
? &MixedFields::ci
: &MixedFields::cvi
;
197 (void)(i1
? &MixedFields::ci
: &MixedFields::vi
);
198 // Conversion of primitives does not result in an lvalue.
199 &(i1
? i1
: d1
); // expected-error {{cannot take the address of an rvalue}}
201 (void)&(i1
? flds
.b1
: flds
.i1
); // expected-error {{address of bit-field requested}}
202 (void)&(i1
? flds
.i1
: flds
.b1
); // expected-error {{address of bit-field requested}}
205 unsigned long test0
= 5;
206 test0
= test0
? (long) test0
: test0
; // expected-warning {{operand of ? changes signedness: 'long' to 'unsigned long'}}
207 test0
= test0
? (int) test0
: test0
; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}}
208 test0
= test0
? (short) test0
: test0
; // expected-warning {{operand of ? changes signedness: 'short' to 'unsigned long'}}
209 test0
= test0
? test0
: (long) test0
; // expected-warning {{operand of ? changes signedness: 'long' to 'unsigned long'}}
210 test0
= test0
? test0
: (int) test0
; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}}
211 test0
= test0
? test0
: (short) test0
; // expected-warning {{operand of ? changes signedness: 'short' to 'unsigned long'}}
212 test0
= test0
? test0
: (long) 10;
213 test0
= test0
? test0
: (int) 10;
214 test0
= test0
? test0
: (short) 10;
215 test0
= test0
? (long) 10 : test0
;
216 test0
= test0
? (int) 10 : test0
;
217 test0
= test0
? (short) 10 : test0
;
220 test0
= test0
? EVal
: test0
;
221 test1
= test0
? EVal
: (int) test0
;
223 test0
= test0
? EVal
: test1
; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}}
224 test0
= test0
? test1
: EVal
; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}}
226 test1
= test0
? EVal
: (int) test0
;
227 test1
= test0
? (int) test0
: EVal
;
229 // Note the thing that this does not test: since DR446, various situations
230 // *must* create a separate temporary copy of class objects. This can only
231 // be properly tested at runtime, though.
233 const Abstract
&abstract1
= true ? static_cast<const Abstract
&>(Derived1()) : Derived2(); // expected-error {{allocating an object of abstract class type 'const Abstract'}}
234 const Abstract
&abstract2
= true ? static_cast<const Abstract
&>(Derived1()) : throw 3;
240 OtherString(const char*);
244 String(const char *);
245 String(const OtherString
&);
246 operator const char*() const;
249 void f(bool Cond
, String S
, OtherString OS
) {
250 (void)(Cond
? S
: "");
251 (void)(Cond
? "" : S
);
252 const char a
[1] = {'a'};
255 (void)(Cond
? OS
: S
);
268 Foo3(); // expected-note{{requires 0 arguments}}
269 Foo3(Foo3
&); // expected-note{{would lose const qualifier}}
273 operator const Foo1
&() const;
274 operator const Foo2
&() const;
275 operator const Foo3
&() const;
279 (void)(true ? Bar() : Foo1()); // okay
280 (void)(true ? Bar() : Foo2()); // okay
281 (void)(true ? Bar() : Foo3()); // expected-error{{no viable constructor copying temporary}}
285 // Reduced from selfhost.
289 fa
, fb
, fc
, fd
, fe
, ff
302 namespace rdar7998817
{
304 X(X
&); // expected-note{{declared private here}}
317 (void)(B
? x
// expected-error{{calling a private constructor of class 'rdar7998817::X'}}
331 const volatile Enum
g2() {
337 Enum e
= false ? g() : v
;
338 Enum e2
= false ? v2
: v
;
339 Enum e3
= false ? g2() : v
;
348 (void)(true ? A() : NULL
); // expected-error{{non-pointer operand type 'A' incompatible with NULL}}
349 (void)(true ? NULL
: A()); // expected-error{{non-pointer operand type 'A' incompatible with NULL}}
350 (void)(true ? 0 : A()); // expected-error{{incompatible operand types}}
351 (void)(true ? nullptr : A()); // expected-error{{non-pointer operand type 'A' incompatible with nullptr}}
352 (void)(true ? nullptr : i
); // expected-error{{non-pointer operand type 'int' incompatible with nullptr}}
353 (void)(true ? __null
: A()); // expected-error{{non-pointer operand type 'A' incompatible with NULL}}
354 (void)(true ? (void*)0 : A()); // expected-error{{incompatible operand types}}
362 static const T t2
= T();
363 return &(b
? t1
: t2
);
366 template const int *f(bool);
367 template const S
*f(bool);
373 const volatile int cvi
= 0;
375 const int &cir
= b
? i
: ci
;
376 volatile int &vir
= b
? vi
: i
;
377 const volatile int &cvir1
= b
? ci
: cvi
;
378 const volatile int &cvir2
= b
? cvi
: vi
;
379 const volatile int &cvir3
= b
? ci
: vi
; // expected-error{{volatile lvalue reference to type 'const volatile int' cannot bind to a temporary of type 'int'}}
387 int &test() { return b_
? i_
: throw 1; }
393 struct Derived
: Base
{};
396 typedef decltype(true ? static_cast<Base
&&>(b
) : static_cast<Derived
&&>(d
)) x
;
400 namespace lifetime_extension
{
402 struct B
: A
{ B(); ~B(); };
403 struct C
: A
{ C(); ~C(); };
406 A
&&r
= b
? static_cast<A
&&>(B()) : static_cast<A
&&>(C());
410 void f_indirect(bool b
) {
411 D d
= b
? D
{B()} // expected-cxx11-warning {{temporary whose address is used as value of local variable 'd' will be destroyed at the end of the full-expression}}
412 : D
{C()}; // expected-cxx11-warning {{temporary whose address is used as value of local variable 'd' will be destroyed at the end of the full-expression}}
417 // expected-error@+4{{expected ':'}}
418 // expected-note@+3{{to match this '?'}}
419 // expected-warning@+2{{variable 'b' is uninitialized}}
420 // expected-error@+1 2 {{expected ';' after top level declarator}}
421 int a
long b
= a
= b
? throw 0 1
426 long c
= a
= b
? throw 0 : 1;
427 long d
= a
= b
? 1 : throw 0;
428 // expected-error@+1 {{assigning to 'int' from incompatible type 'void'}}
429 long e
= a
= b
? throw 0 : throw 1;
431 } // namespace PR46484
435 (true ? throw 0 : 0) <= 0; // expected-warning {{relational comparison result unused}}
436 (false ? 0 : throw 0) <= 0; // expected-warning {{relational comparison result unused}}