conditional-expr.cpp revision 762bb9d0ad20320b9f97a841dce57ba5e8e48b07
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. 53201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl// This test runs in C++0x 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 603201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redlvoid test() 613201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl{ 623201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // This function tests C++0x 5.16 633201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 643201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p1 (contextually convert to bool) 653201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl int i1 = ToBool() ? 0 : 1; 663201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 673201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p2 (one or both void, and throwing) 683201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? throw 0 : throw 1; 693201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? test() : throw 1; 703201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? throw 0 : test(); 713201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? test() : test(); 723201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? throw 0 : 0; 733201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? 0 : throw 0; 743201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? 0 : test(); // expected-error {{right operand to ? is void, but left operand is of type 'int'}} 753201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 ? test() : 0; // expected-error {{left operand to ? is void, but right operand is of type 'int'}} 763201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (i1 ? throw 0 : i1) = 0; // expected-error {{expression is not assignable}} 773201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (i1 ? i1 : throw 0) = 0; // expected-error {{expression is not assignable}} 783201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 793201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p3 (one or both class type, convert to each other) 803201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // b1 (lvalues) 813201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl Base base; 823201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl Derived derived; 833201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl Convertible conv; 8476458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar1 = i1 ? base : derived; 8576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar2 = i1 ? derived : base; 8676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar3 = i1 ? base : conv; 8776458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Base &bar4 = i1 ? conv : base; 883201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // these are ambiguous 893201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl BadBase bb; 903201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl BadDerived bd; 917c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? bb : bd); // expected-error {{conditional expression is ambiguous; 'BadBase' can be converted to 'BadDerived' and vice versa}} 923201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (void)(i1 ? bd : bb); // expected-error {{conditional expression is ambiguous}} 933201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // curiously enough (and a defect?), these are not 943201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // for rvalues, hierarchy takes precedence over other conversions 953201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (void)(i1 ? BadBase() : BadDerived()); 963201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl (void)(i1 ? BadDerived() : BadBase()); 973201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 983201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // b2.1 (hierarchy stuff) 993201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl const Base constret(); 1003201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl const Derived constder(); 1013201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // should use const overload 1023201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a1((i1 ? constret() : Base()).trick()); 1033201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a2((i1 ? Base() : constret()).trick()); 1043201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a3((i1 ? constret() : Derived()).trick()); 1053201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl A a4((i1 ? Derived() : constret()).trick()); 1063201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // should use non-const overload 1073201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Base() : Base()).trick(); 1083201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Base() : Base()).trick(); 1093201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Base() : Derived()).trick(); 1103201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = (i1 ? Derived() : Base()).trick(); 1113201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // should fail: const lost 1120c42bb653dc40b1caae010618831e320af824b18Chris Lattner (void)(i1 ? Base() : constder()); // expected-error {{incompatible operand types ('Base' and 'const Derived')}} 1130c42bb653dc40b1caae010618831e320af824b18Chris Lattner (void)(i1 ? constder() : Base()); // expected-error {{incompatible operand types ('const Derived' and 'Base')}} 11478eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl 11578eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl Priv priv; 11678eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl Fin fin; 1176b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? Base() : Priv()); // expected-error{{private base class}} 1186b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? Priv() : Base()); // expected-error{{private base class}} 1197c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? Base() : Fin()); // expected-error{{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1207c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? Fin() : Base()); // expected-error{{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1216b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? base : priv); // expected-error {{private base class}} 1226b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall (void)(i1 ? priv : base); // expected-error {{private base class}} 1237c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? base : fin); // expected-error {{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1247c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? fin : base); // expected-error {{ambiguous conversion from derived class 'Fin' to base class 'Base':}} 1253201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1263201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // b2.2 (non-hierarchy) 1273201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? I() : i1; 1283201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? i1 : I(); 1293201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl I i2(i1 ? I() : J()); 1303201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl I i3(i1 ? J() : I()); 1313201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // "the type [it] woud have if E2 were converted to an rvalue" 1323201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl vfn pfn = i1 ? F() : test; 1333201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl pfn = i1 ? test : F(); 1347c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? A() : B()); // expected-error {{conversion from 'B' to 'A' is ambiguous}} 1357c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? B() : A()); // expected-error {{conversion from 'B' to 'A' is ambiguous}} 1367c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? 1 : Ambig()); // expected-error {{conversion from 'Ambig' to 'int' is ambiguous}} 1377c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall (void)(i1 ? Ambig() : 1); // expected-error {{conversion from 'Ambig' to 'int' is ambiguous}} 13876458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // By the way, this isn't an lvalue: 13976458501a8963fa11b91c9337a487de6871169b4Sebastian Redl &(i1 ? i1 : i2); // expected-error {{address expression must be an lvalue or a function designator}} 1403201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1413201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p4 (lvalue, same type) 14276458501a8963fa11b91c9337a487de6871169b4Sebastian Redl Fields flds; 14376458501a8963fa11b91c9337a487de6871169b4Sebastian Redl int &ir1 = i1 ? flds.i1 : flds.i2; 14476458501a8963fa11b91c9337a487de6871169b4Sebastian Redl (i1 ? flds.b1 : flds.i2) = 0; 14576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl (i1 ? flds.i1 : flds.b2) = 0; 14676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl (i1 ? flds.b1 : flds.b2) = 0; 1473201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1483201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p5 (conversion to built-in types) 1493201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // GCC 4.3 fails these 1503201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl double d1 = i1 ? I() : K(); 1513201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl pfn = i1 ? F() : G(); 15276458501a8963fa11b91c9337a487de6871169b4Sebastian Redl DFnPtr pfm; 15378eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl pfm = i1 ? DFnPtr() : &Base::fn1; 15478eb874222b7653edf7182d0d899d717d5c592c1Sebastian Redl pfm = i1 ? &Base::fn1 : DFnPtr(); 1553201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl 1563201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // p6 (final conversions) 1573201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl i1 = i1 ? i1 : ir1; 1583201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl int *pi1 = i1 ? &i1 : 0; 1593201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl pi1 = i1 ? 0 : &i1; 160a2936be04fb800d93a0a8d3358f35c7b3b2ded16John McCall i1 = i1 ? i1 : EVal; 161a2936be04fb800d93a0a8d3358f35c7b3b2ded16John McCall i1 = i1 ? EVal : i1; 1623201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl d1 = i1 ? 'c' : 4.0; 1633201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl d1 = i1 ? 4.0 : 'c'; 164d1bd7fc4cd88f8790c56620d22560e19717f468aSebastian Redl Base *pb = i1 ? (Base*)0 : (Derived*)0; 165d1bd7fc4cd88f8790c56620d22560e19717f468aSebastian Redl pb = i1 ? (Derived*)0 : (Base*)0; 1669bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? &Base::fn1 : &Derived::fn2; 1679bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? &Derived::fn2 : &Base::fn1; 1689bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? &Derived::fn2 : 0; 1699bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl pfm = i1 ? 0 : &Derived::fn2; 1709bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl const int (MixedFieldsDerived::*mp1) = 1719bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl i1 ? &MixedFields::ci : &MixedFieldsDerived::i; 1729bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl const volatile int (MixedFields::*mp2) = 1739bebfadb807aba0bc272197aff1cb4b2284c00a6Sebastian Redl i1 ? &MixedFields::ci : &MixedFields::cvi; 17420b3e9918cf7d7845c920baabc4fb2f1ac0ee1d2Douglas Gregor (void)(i1 ? &MixedFields::ci : &MixedFields::vi); 17576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // Conversion of primitives does not result in an lvalue. 17676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl &(i1 ? i1 : d1); // expected-error {{address expression must be an lvalue or a function designator}} 17776458501a8963fa11b91c9337a487de6871169b4Sebastian Redl 1781d524c3dde58e4402aab4165e85e9ae6f15f5023Anders Carlsson (void)&(i1 ? flds.b1 : flds.i1); // expected-error {{address of bit-field requested}} 1791d524c3dde58e4402aab4165e85e9ae6f15f5023Anders Carlsson (void)&(i1 ? flds.i1 : flds.b1); // expected-error {{address of bit-field requested}} 1801d524c3dde58e4402aab4165e85e9ae6f15f5023Anders Carlsson 181b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall 182b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall unsigned long test0 = 5; 1835254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? (long) test0 : test0; // expected-warning {{operand of ? changes signedness: 'long' to 'unsigned long'}} 1845254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? (int) test0 : test0; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 1855254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? (short) test0 : test0; // expected-warning {{operand of ? changes signedness: 'short' to 'unsigned long'}} 1865254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test0 : (long) test0; // expected-warning {{operand of ? changes signedness: 'long' to 'unsigned long'}} 1875254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test0 : (int) test0; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 1885254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test0 : (short) test0; // expected-warning {{operand of ? changes signedness: 'short' to 'unsigned long'}} 189b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? test0 : (long) 10; 190b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? test0 : (int) 10; 191b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? test0 : (short) 10; 192b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? (long) 10 : test0; 193b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? (int) 10 : test0; 194b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? (short) 10 : test0; 195b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall 1965254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu int test1; 197b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall test0 = test0 ? EVal : test0; 1985254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test1 = test0 ? EVal : (int) test0; 1995254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu 2005254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? EVal : test1; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 2015254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test0 = test0 ? test1 : EVal; // expected-warning {{operand of ? changes signedness: 'int' to 'unsigned long'}} 2025254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu 2035254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test1 = test0 ? EVal : (int) test0; 2045254161b269829b74e7a9379b1bdfa27de72d7ccRichard Trieu test1 = test0 ? (int) test0 : EVal; 205b13c87f0c9705d91d5a3e134be9934c9ad531071John McCall 2063201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // Note the thing that this does not test: since DR446, various situations 2073201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // *must* create a separate temporary copy of class objects. This can only 2083201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl // be properly tested at runtime, though. 2093201f6beec688ab9fe8750527e28f52d5420e22dSebastian Redl} 2100fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor 2110fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregornamespace PR6595 { 2124712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor struct OtherString { 2134712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor OtherString(); 2144712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor OtherString(const char*); 2154712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor }; 2164712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor 2170fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor struct String { 2180fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor String(const char *); 2194712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor String(const OtherString&); 2200fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor operator const char*() const; 2210fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor }; 2220fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor 2234712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor void f(bool Cond, String S, OtherString OS) { 2240fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? S : ""); 2250fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? "" : S); 2260fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor const char a[1] = {'a'}; 2270fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? S : a); 2280fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor (void)(Cond? a : S); 2294712c02c1550a72612c07f5aaee455dcd8273b96Douglas Gregor (void)(Cond? OS : S); 2300fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor } 2310fd8ff73630adab9a33123f23ef62fcf5c3cf326Douglas Gregor} 2322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2332f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregornamespace PR6757 { 2342f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Foo1 { 2352f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Foo1(); 2362f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Foo1(const Foo1&); 2372f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor }; 2382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2392f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Foo2 { }; 2402f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2412f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Foo3 { 2422f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor Foo3(); 2433fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor Foo3(Foo3&); // expected-note{{would lose const qualifier}} 2442f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor }; 2452f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2462f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor struct Bar { 2472f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor operator const Foo1&() const; 2482f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor operator const Foo2&() const; 2492f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor operator const Foo3&() const; 2502f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor }; 2512f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 2522f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor void f() { 2532f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor (void)(true ? Bar() : Foo1()); // okay 2542f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor (void)(true ? Bar() : Foo2()); // okay 2553fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor (void)(true ? Bar() : Foo3()); // expected-error{{no viable constructor copying temporary}} 2562f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 2572f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor} 258323ed74658bc8375278eabf074b4777458376540John McCall 259323ed74658bc8375278eabf074b4777458376540John McCall// Reduced from selfhost. 260323ed74658bc8375278eabf074b4777458376540John McCallnamespace test1 { 261323ed74658bc8375278eabf074b4777458376540John McCall struct A { 262323ed74658bc8375278eabf074b4777458376540John McCall enum Foo { 263323ed74658bc8375278eabf074b4777458376540John McCall fa, fb, fc, fd, fe, ff 264323ed74658bc8375278eabf074b4777458376540John McCall }; 265323ed74658bc8375278eabf074b4777458376540John McCall 266323ed74658bc8375278eabf074b4777458376540John McCall Foo x(); 267323ed74658bc8375278eabf074b4777458376540John McCall }; 268323ed74658bc8375278eabf074b4777458376540John McCall 269323ed74658bc8375278eabf074b4777458376540John McCall void foo(int); 270323ed74658bc8375278eabf074b4777458376540John McCall 271323ed74658bc8375278eabf074b4777458376540John McCall void test(A *a) { 272323ed74658bc8375278eabf074b4777458376540John McCall foo(a ? a->x() : 0); 273323ed74658bc8375278eabf074b4777458376540John McCall } 274323ed74658bc8375278eabf074b4777458376540John McCall} 275b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 276b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregornamespace rdar7998817 { 277b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor class X { 278b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X(X&); // expected-note{{declared private here}} 279b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 280b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor struct ref { }; 281b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 282b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor public: 283b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X(); 284b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X(ref); 285b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 286b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor operator ref(); 287b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor }; 288b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor 289b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor void f(bool B) { 290b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor X x; 291b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor (void)(B? x // expected-error{{calling a private constructor of class 'rdar7998817::X'}} 292b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor : X()); 293b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor } 294b65a45835afcc93fa99e22b14b4c9734c261d831Douglas Gregor} 2955291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 2965291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregornamespace PR7598 { 2975291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor enum Enum { 2985291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor v = 1, 2995291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor }; 3005291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3015495f37302f7c82192dab1ce8d9c9fe76ed0ee37Chandler Carruth const Enum g() { 3025291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor return v; 3035291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor } 3045291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3055495f37302f7c82192dab1ce8d9c9fe76ed0ee37Chandler Carruth const volatile Enum g2() { 306de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor return v; 307de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor } 308de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor 3095291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor void f() { 3105291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor const Enum v2 = v; 3115291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor Enum e = false ? g() : v; 3125291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor Enum e2 = false ? v2 : v; 313de80ec1fa947855d2e53722a8cd71367ff513481Douglas Gregor Enum e3 = false ? g2() : v; 3145291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor } 3155291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 3165291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor} 31782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 31882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruthnamespace PR9236 { 31982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth#define NULL 0L 32082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth void f() { 3217ef932429ed0edcc5e4bf44e516f5f4be6a8a03fChandler Carruth int i; 32282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? A() : NULL); // expected-error{{non-pointer operand type 'A' incompatible with NULL}} 32382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? NULL : A()); // expected-error{{non-pointer operand type 'A' incompatible with NULL}} 32482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? 0 : A()); // expected-error{{incompatible operand types}} 32582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? nullptr : A()); // expected-error{{non-pointer operand type 'A' incompatible with nullptr}} 3267ef932429ed0edcc5e4bf44e516f5f4be6a8a03fChandler Carruth (void)(true ? nullptr : i); // expected-error{{non-pointer operand type 'int' incompatible with nullptr}} 32782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? __null : A()); // expected-error{{non-pointer operand type 'A' incompatible with NULL}} 32882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth (void)(true ? (void*)0 : A()); // expected-error{{incompatible operand types}} 32982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth } 33082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth} 331