1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -Wsign-conversion %s 23201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 33201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl// C++ rules for ?: are a lot stricter than C rules, and have to take into 43201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl// account more conversion options. 550d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith// This test runs in C++11 mode for the contextual conversion of the condition. 63201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 73201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct ToBool { explicit operator bool(); }; 83201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 93201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct B; 108dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregorstruct A { 118dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor A(); 128dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor A(const B&); // expected-note 2 {{candidate constructor}} 138dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor}; 141d31833450e6d2947a33cb0840d87661d92eec07John McCallstruct B { operator A() const; }; // expected-note 2 {{candidate function}} 153201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct I { operator int(); }; 163201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct J { operator I(); }; 173201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct K { operator double(); }; 183201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redltypedef void (*vfn)(); 193201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct F { operator vfn(); }; 203201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct G { operator vfn(); }; 213201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 223201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct Base { 233201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl int trick(); 243201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A trick() const; 2576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl void fn1(); 2676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl}; 2776458501a8963fa11b91c9337a487de6871169b4Sebastian Redlstruct Derived : Base { 2876458501a8963fa11b91c9337a487de6871169b4Sebastian Redl void fn2(); 293201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl}; 303201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct Convertible { operator Base&(); }; 316b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCallstruct Priv : private Base {}; // expected-note 4 {{declared private here}} 323201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct Mid : Base {}; 333201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct Fin : Mid, Derived {}; 3476458501a8963fa11b91c9337a487de6871169b4Sebastian Redltypedef void (Derived::*DFnPtr)(); 3576458501a8963fa11b91c9337a487de6871169b4Sebastian Redlstruct ToMemPtr { operator DFnPtr(); }; 363201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 373201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct BadDerived; 383201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct BadBase { operator BadDerived&(); }; 393201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct BadDerived : BadBase {}; 403201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 413201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct Fields { 423201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl int i1, i2, b1 : 3, b2 : 3; 433201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl}; 449bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redlstruct MixedFields { 459bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl int i; 469bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl volatile int vi; 479bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl const int ci; 489bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl const volatile int cvi; 499bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl}; 509bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redlstruct MixedFieldsDerived : MixedFields { 519bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl}; 523201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 533201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlenum Enum { EVal }; 543201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 553201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlstruct Ambig { 561d31833450e6d2947a33cb0840d87661d92eec07John McCall operator short(); // expected-note 2 {{candidate function}} 571d31833450e6d2947a33cb0840d87661d92eec07John McCall operator signed char(); // expected-note 2 {{candidate function}} 583201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl}; 593201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 60654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikiestruct Abstract { 61654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie virtual ~Abstract() = 0; // expected-note {{unimplemented pure virtual method '~Abstract' in 'Abstract'}} 62654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie}; 63654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie 64654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikiestruct Derived1: Abstract { 65654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie}; 66654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie 67654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikiestruct Derived2: Abstract { 68654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie}; 69654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie 703201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlvoid test() 713201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl{ 723201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // This function tests C++0x 5.16 733201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 743201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p1 (contextually convert to bool) 753201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl int i1 = ToBool() ? 0 : 1; 763201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 773201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p2 (one or both void, and throwing) 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Fields flds; 793201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? throw 0 : throw 1; 803201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? test() : throw 1; 813201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? throw 0 : test(); 823201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? test() : test(); 833201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? throw 0 : 0; 843201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? 0 : throw 0; 85c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer i1 = i1 ? (throw 0) : 0; 86c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer i1 = i1 ? 0 : (throw 0); 873201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? 0 : test(); // expected-error {{right operand to ? is void, but left operand is of type 'int'}} 883201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? test() : 0; // expected-error {{left operand to ? is void, but right operand is of type 'int'}} 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (i1 ? throw 0 : i1) = 0; 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (i1 ? i1 : throw 0) = 0; 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (i1 ? (throw 0) : i1) = 0; 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (i1 ? i1 : (throw 0)) = 0; 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (i1 ? (void)(throw 0) : i1) = 0; // expected-error {{left operand to ? is void, but right operand is of type 'int'}} 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (i1 ? i1 : (void)(throw 0)) = 0; // expected-error {{right operand to ? is void, but left operand is of type 'int'}} 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &throwRef1 = (i1 ? flds.i1 : throw 0); 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &throwRef2 = (i1 ? throw 0 : flds.i1); 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &throwRef3 = (i1 ? flds.b1 : throw 0); // expected-error {{non-const reference cannot bind to bit-field}} 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &throwRef4 = (i1 ? throw 0 : flds.b1); // expected-error {{non-const reference cannot bind to bit-field}} 993201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1003201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p3 (one or both class type, convert to each other) 1013201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // b1 (lvalues) 1023201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl Base base; 1033201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl Derived derived; 1043201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl Convertible conv; 10576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar1 = i1 ? base : derived; 10676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar2 = i1 ? derived : base; 10776458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar3 = i1 ? base : conv; 10876458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar4 = i1 ? conv : base; 1093201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // these are ambiguous 1103201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl BadBase bb; 1113201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl BadDerived bd; 1127c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? bb : bd); // expected-error {{conditional expression is ambiguous; 'BadBase' can be converted to 'BadDerived' and vice versa}} 1133201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (void)(i1 ? bd : bb); // expected-error {{conditional expression is ambiguous}} 1143201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // curiously enough (and a defect?), these are not 1153201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // for rvalues, hierarchy takes precedence over other conversions 1163201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (void)(i1 ? BadBase() : BadDerived()); 1173201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (void)(i1 ? BadDerived() : BadBase()); 1183201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1193201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // b2.1 (hierarchy stuff) 1207984de35644701c0d94336da7f2215d4c26d9f5bRichard Smith extern const Base constret(); 1217984de35644701c0d94336da7f2215d4c26d9f5bRichard Smith extern const Derived constder(); 1223201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // should use const overload 1233201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a1((i1 ? constret() : Base()).trick()); 1243201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a2((i1 ? Base() : constret()).trick()); 1253201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a3((i1 ? constret() : Derived()).trick()); 1263201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a4((i1 ? Derived() : constret()).trick()); 1273201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // should use non-const overload 1283201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Base() : Base()).trick(); 1293201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Base() : Base()).trick(); 1303201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Base() : Derived()).trick(); 1313201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Derived() : Base()).trick(); 1323201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // should fail: const lost 1330c42bb653dc40b1caae010618831e320af824b18Chris Lattner (void)(i1 ? Base() : constder()); // expected-error {{incompatible operand types ('Base' and 'const Derived')}} 1340c42bb653dc40b1caae010618831e320af824b18Chris Lattner (void)(i1 ? constder() : Base()); // expected-error {{incompatible operand types ('const Derived' and 'Base')}} 13578eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl 13678eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl Priv priv; 13778eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl Fin fin; 1386b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? Base() : Priv()); // expected-error{{private base class}} 1396b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? Priv() : Base()); // expected-error{{private base class}} 1407c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? Base() : Fin()); // expected-error{{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1417c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? Fin() : Base()); // expected-error{{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1426b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? base : priv); // expected-error {{private base class}} 1436b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? priv : base); // expected-error {{private base class}} 1447c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? base : fin); // expected-error {{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1457c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? fin : base); // expected-error {{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1463201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1473201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // b2.2 (non-hierarchy) 1483201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? I() : i1; 1493201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? i1 : I(); 1503201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl I i2(i1 ? I() : J()); 1513201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl I i3(i1 ? J() : I()); 1523201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // "the type [it] woud have if E2 were converted to an rvalue" 1533201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl vfn pfn = i1 ? F() : test; 1543201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl pfn = i1 ? test : F(); 1557c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? A() : B()); // expected-error {{conversion from 'B' to 'A' is ambiguous}} 1567c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? B() : A()); // expected-error {{conversion from 'B' to 'A' is ambiguous}} 1577c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? 1 : Ambig()); // expected-error {{conversion from 'Ambig' to 'int' is ambiguous}} 1587c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? Ambig() : 1); // expected-error {{conversion from 'Ambig' to 'int' is ambiguous}} 15976458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // By the way, this isn't an lvalue: 1603fa3feab35096b608f1d79bb541798b37a55e7b9Richard Smith &(i1 ? i1 : i2); // expected-error {{cannot take the address of an rvalue}} 1613201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1623201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p4 (lvalue, same type) 16376458501a8963fa11b91c9337a487de6871169b4Sebastian Redl int &ir1 = i1 ? flds.i1 : flds.i2; 16476458501a8963fa11b91c9337a487de6871169b4Sebastian Redl (i1 ? flds.b1 : flds.i2) = 0; 16576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl (i1 ? flds.i1 : flds.b2) = 0; 16676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl (i1 ? flds.b1 : flds.b2) = 0; 1673201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1683201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p5 (conversion to built-in types) 1693201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // GCC 4.3 fails these 1703201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl double d1 = i1 ? I() : K(); 1713201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl pfn = i1 ? F() : G(); 17276458501a8963fa11b91c9337a487de6871169b4Sebastian Redl DFnPtr pfm; 17378eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl pfm = i1 ? DFnPtr() : &Base::fn1; 17478eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl pfm = i1 ? &Base::fn1 : DFnPtr(); 1753201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1763201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p6 (final conversions) 1773201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? i1 : ir1; 1783201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl int *pi1 = i1 ? &i1 : 0; 1793201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl pi1 = i1 ? 0 : &i1; 180a2936be04fb800d93a0a8d3358f35c7b3b2ded16John McCall i1 = i1 ? i1 : EVal; 181a2936be04fb800d93a0a8d3358f35c7b3b2ded16John McCall i1 = i1 ? EVal : i1; 1823201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl d1 = i1 ? 'c' : 4.0; 1833201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl d1 = i1 ? 4.0 : 'c'; 184d1bd7fc4cd88f8790c56620d22560e19717f468aSebastian Redl Base *pb = i1 ? (Base*)0 : (Derived*)0; 185d1bd7fc4cd88f8790c56620d22560e19717f468aSebastian Redl pb = i1 ? (Derived*)0 : (Base*)0; 1869bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? &Base::fn1 : &Derived::fn2; 1879bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? &Derived::fn2 : &Base::fn1; 1889bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? &Derived::fn2 : 0; 1899bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? 0 : &Derived::fn2; 1909bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl const int (MixedFieldsDerived::*mp1) = 1919bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl i1 ? &MixedFields::ci : &MixedFieldsDerived::i; 1929bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl const volatile int (MixedFields::*mp2) = 1939bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl i1 ? &MixedFields::ci : &MixedFields::cvi; 19420b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor (void)(i1 ? &MixedFields::ci : &MixedFields::vi); 19576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // Conversion of primitives does not result in an lvalue. 1963fa3feab35096b608f1d79bb541798b37a55e7b9Richard Smith &(i1 ? i1 : d1); // expected-error {{cannot take the address of an rvalue}} 19776458501a8963fa11b91c9337a487de6871169b4Sebastian Redl 1981d524c3dde58e4402aab4165e85e9ae6f15f5023Anders Carlsson (void)&(i1 ? flds.b1 : flds.i1); // expected-error {{address of bit-field requested}} 1991d524c3dde58e4402aab4165e85e9ae6f15f5023Anders Carlsson (void)&(i1 ? flds.i1 : flds.b1); // expected-error {{address of bit-field requested}} 2001d524c3dde58e4402aab4165e85e9ae6f15f5023Anders Carlsson 201b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall 202b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall unsigned long test0 = 5; 2035254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? (long) test0 : test0; // expected-warning {{operand of ? changes signedness: 'long' to 'unsigned long'}} 2045254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? (int) test0 : test0; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 2055254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? (short) test0 : test0; // expected-warning {{operand of ? changes signedness: 'short' to 'unsigned long'}} 2065254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test0 : (long) test0; // expected-warning {{operand of ? changes signedness: 'long' to 'unsigned long'}} 2075254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test0 : (int) test0; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 2085254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test0 : (short) test0; // expected-warning {{operand of ? changes signedness: 'short' to 'unsigned long'}} 209b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? test0 : (long) 10; 210b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? test0 : (int) 10; 211b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? test0 : (short) 10; 212b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? (long) 10 : test0; 213b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? (int) 10 : test0; 214b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? (short) 10 : test0; 215b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall 2165254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu int test1; 217b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? EVal : test0; 2185254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test1 = test0 ? EVal : (int) test0; 2195254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu 2205254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? EVal : test1; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 2215254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test1 : EVal; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 2225254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu 2235254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test1 = test0 ? EVal : (int) test0; 2245254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test1 = test0 ? (int) test0 : EVal; 225b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall 2263201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // Note the thing that this does not test: since DR446, various situations 2273201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // *must* create a separate temporary copy of class objects. This can only 2283201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // be properly tested at runtime, though. 229654f1d508cbc9553f4931b340dfa19b453f72ebdDavid Blaikie 230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Abstract &abstract1 = true ? static_cast<const Abstract&>(Derived1()) : Derived2(); // expected-error {{allocating an object of abstract class type 'const Abstract'}} 231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Abstract &abstract2 = true ? static_cast<const Abstract&>(Derived1()) : throw 3; // ok 2323201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl} 2330fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor 2340fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregornamespace PR6595 { 2354712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor struct OtherString { 2364712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor OtherString(); 2374712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor OtherString(const char*); 2384712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor }; 2394712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor 2400fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor struct String { 2410fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor String(const char *); 2424712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor String(const OtherString&); 2430fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor operator const char*() const; 2440fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor }; 2450fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor 2464712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor void f(bool Cond, String S, OtherString OS) { 2470fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? S : ""); 2480fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? "" : S); 2490fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor const char a[1] = {'a'}; 2500fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? S : a); 2510fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? a : S); 2524712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor (void)(Cond? OS : S); 2530fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor } 2540fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor} 2552f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2562f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregornamespace PR6757 { 2572f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Foo1 { 2582f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Foo1(); 2592f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Foo1(const Foo1&); 2602f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor }; 2612f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2622f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Foo2 { }; 2632f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2642f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Foo3 { 2652f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Foo3(); 2663fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Foo3(Foo3&); // expected-note{{would lose const qualifier}} 2672f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor }; 2682f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2692f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Bar { 2702f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor operator const Foo1&() const; 2712f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor operator const Foo2&() const; 2722f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor operator const Foo3&() const; 2732f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor }; 2742f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2752f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor void f() { 2762f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor (void)(true ? Bar() : Foo1()); // okay 2772f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor (void)(true ? Bar() : Foo2()); // okay 2783fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor (void)(true ? Bar() : Foo3()); // expected-error{{no viable constructor copying temporary}} 2792f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 2802f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor} 281323ed74658bc8375278eabf074b4777458376540John McCall 282323ed74658bc8375278eabf074b4777458376540John McCall// Reduced from selfhost. 283323ed74658bc8375278eabf074b4777458376540John McCallnamespace test1 { 284323ed74658bc8375278eabf074b4777458376540John McCall struct A { 285323ed74658bc8375278eabf074b4777458376540John McCall enum Foo { 286323ed74658bc8375278eabf074b4777458376540John McCall fa, fb, fc, fd, fe, ff 287323ed74658bc8375278eabf074b4777458376540John McCall }; 288323ed74658bc8375278eabf074b4777458376540John McCall 289323ed74658bc8375278eabf074b4777458376540John McCall Foo x(); 290323ed74658bc8375278eabf074b4777458376540John McCall }; 291323ed74658bc8375278eabf074b4777458376540John McCall 292323ed74658bc8375278eabf074b4777458376540John McCall void foo(int); 293323ed74658bc8375278eabf074b4777458376540John McCall 294323ed74658bc8375278eabf074b4777458376540John McCall void test(A *a) { 295323ed74658bc8375278eabf074b4777458376540John McCall foo(a ? a->x() : 0); 296323ed74658bc8375278eabf074b4777458376540John McCall } 297323ed74658bc8375278eabf074b4777458376540John McCall} 298b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 299b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregornamespace rdar7998817 { 300b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor class X { 301b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X(X&); // expected-note{{declared private here}} 302b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 303b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor struct ref { }; 304b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 305b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor public: 306b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X(); 307b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X(ref); 308b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 309b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor operator ref(); 310b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor }; 311b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 312b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor void f(bool B) { 313b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X x; 314b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor (void)(B? x // expected-error{{calling a private constructor of class 'rdar7998817::X'}} 315b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor : X()); 316b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor } 317b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor} 3185291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3195291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregornamespace PR7598 { 3205291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor enum Enum { 3215291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor v = 1, 3225291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor }; 3235291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3245495f37302f7c82192dab1ce8d9c9fe76ed0ee37Chandler Carruth const Enum g() { 3255291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor return v; 3265291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor } 3275291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3285495f37302f7c82192dab1ce8d9c9fe76ed0ee37Chandler Carruth const volatile Enum g2() { 329de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor return v; 330de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor } 331de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor 3325291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor void f() { 3335291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor const Enum v2 = v; 3345291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor Enum e = false ? g() : v; 3355291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor Enum e2 = false ? v2 : v; 336de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor Enum e3 = false ? g2() : v; 3375291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor } 3385291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3395291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor} 34082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 34182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruthnamespace PR9236 { 34282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth#define NULL 0L 34382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth void f() { 3447ef932429ed0edcc5e4bf44e516f5f4be6a8a03fChandler Carruth int i; 34582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? A() : NULL); // expected-error{{non-pointer operand type 'A' incompatible with NULL}} 34682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? NULL : A()); // expected-error{{non-pointer operand type 'A' incompatible with NULL}} 34782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? 0 : A()); // expected-error{{incompatible operand types}} 34882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? nullptr : A()); // expected-error{{non-pointer operand type 'A' incompatible with nullptr}} 3497ef932429ed0edcc5e4bf44e516f5f4be6a8a03fChandler Carruth (void)(true ? nullptr : i); // expected-error{{non-pointer operand type 'int' incompatible with nullptr}} 35082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? __null : A()); // expected-error{{non-pointer operand type 'A' incompatible with NULL}} 35182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? (void*)0 : A()); // expected-error{{incompatible operand types}} 35282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth } 35382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth} 35450d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith 35550d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smithnamespace DR587 { 35650d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith template<typename T> 35750d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith const T *f(bool b) { 35850d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith static T t1 = T(); 35950d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith static const T t2 = T(); 36050d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith return &(b ? t1 : t2); 36150d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith } 36250d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith struct S {}; 36350d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith template const int *f(bool); 36450d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith template const S *f(bool); 36550d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith 36650d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith extern bool b; 36750d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith int i = 0; 36850d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith const int ci = 0; 36950d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith volatile int vi = 0; 37050d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith const volatile int cvi = 0; 37150d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith 37250d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith const int &cir = b ? i : ci; 37350d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith volatile int &vir = b ? vi : i; 37450d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith const volatile int &cvir1 = b ? ci : cvi; 37550d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith const volatile int &cvir2 = b ? cvi : vi; 37650d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith 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'}} 37750d61c8ccfc633b13cdf594ea3cd3a217076debeRichard Smith} 378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR17052 { 380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X { 381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int i_; 382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool b_; 383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &test() { return b_ ? i_ : throw 1; } 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 387