13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 24a95134918f5492e363a44868e3473299e0562ceDouglas Gregor 30816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// --------------------------------------------------------------------- 40816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// Imaginary literals 50816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// --------------------------------------------------------------------- 64a95134918f5492e363a44868e3473299e0562ceDouglas Gregortemplate<typename T> 74a95134918f5492e363a44868e3473299e0562ceDouglas Gregorstruct ImaginaryLiteral0 { 84a95134918f5492e363a44868e3473299e0562ceDouglas Gregor void f(T &x) { 94a95134918f5492e363a44868e3473299e0562ceDouglas Gregor x = 3.0I; // expected-error{{incompatible type}} 104a95134918f5492e363a44868e3473299e0562ceDouglas Gregor } 114a95134918f5492e363a44868e3473299e0562ceDouglas Gregor}; 124a95134918f5492e363a44868e3473299e0562ceDouglas Gregor 134a95134918f5492e363a44868e3473299e0562ceDouglas Gregortemplate struct ImaginaryLiteral0<_Complex float>; 144a95134918f5492e363a44868e3473299e0562ceDouglas Gregortemplate struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}} 15e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor 160816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// --------------------------------------------------------------------- 170816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// Compound assignment operator 180816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// --------------------------------------------------------------------- 19e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregornamespace N1 { 20e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor struct X { }; 21e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor 22e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor int& operator+=(X&, int); // expected-note{{candidate}} 23e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor} 24e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor 25e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregornamespace N2 { 26e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor long& operator+=(N1::X&, long); // expected-note{{candidate}} 27e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor 28e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor template<typename T, typename U, typename Result> 29e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor struct PlusEquals0 { 30e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor void f(T t, U u) { 31e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor Result r = t += u; // expected-error{{ambiguous}} 32e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor } 33e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor }; 34e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor} 35e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor 36e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregornamespace N3 { 37e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor struct Y : public N1::X { 38e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor short& operator+=(long); // expected-note{{candidate}} 39e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor }; 40e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor} 41e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregor 42e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregortemplate struct N2::PlusEquals0<N1::X, int, int&>; 43e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregortemplate struct N2::PlusEquals0<N1::X, long, long&>; 44e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregortemplate struct N2::PlusEquals0<N3::Y, long, short&>; 45e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregortemplate struct N2::PlusEquals0<int, int, int&>; 46e88fde32a316c47959ae0c522467a36d8a1d0dfeDouglas Gregortemplate struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}} 470816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor 480816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// --------------------------------------------------------------------- 490816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// Conditional operator 500816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor// --------------------------------------------------------------------- 510816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregortemplate<typename T, typename U, typename Result> 520816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregorstruct Conditional0 { 530816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor void f(T t, U u) { 540816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor Result result = t? : u; 550816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor } 560816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor}; 570816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregor 580816e827cf2c9c7b1bbc10c91a1060504e8ac6f4Douglas Gregortemplate struct Conditional0<int, int, int>; 5983f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor 6083f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor// --------------------------------------------------------------------- 6183f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor// Statement expressions 6283f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor// --------------------------------------------------------------------- 6383f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregortemplate<typename T> 6483f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregorstruct StatementExpr0 { 6583f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor void f(T t) { 667ce323c99954cff6060c412ccceaaa9504804761John McCall (void)({ 677ce323c99954cff6060c412ccceaaa9504804761John McCall if (t) // expected-error{{contextually convertible}} 687ce323c99954cff6060c412ccceaaa9504804761John McCall t = t + 17; 697ce323c99954cff6060c412ccceaaa9504804761John McCall t + 12; // expected-error{{invalid operands}} 707ce323c99954cff6060c412ccceaaa9504804761John McCall }); 7183f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor } 7283f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor}; 7383f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor 7483f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregortemplate struct StatementExpr0<int>; 7583f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregortemplate struct StatementExpr0<N1::X>; // expected-note{{instantiation}} 76b4245188f28d3942f42380a803755acabe4f3aecDouglas Gregor 77b4245188f28d3942f42380a803755acabe4f3aecDouglas Gregor// --------------------------------------------------------------------- 78dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor// __builtin_choose_expr 79dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor// --------------------------------------------------------------------- 80dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate<bool Cond, typename T, typename U, typename Result> 81dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregorstruct Choose0 { 82dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor void f(T t, U u) { 83dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}} 84dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor } 85dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor}; 86dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor 87dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate struct Choose0<true, int, float, int&>; 88dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate struct Choose0<false, int, float, float&>; 89dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate struct Choose0<true, int, float, float&>; // expected-note{{instantiation}} 9025990971b88779a28de14657560bf589e35e4743Douglas Gregor 9125990971b88779a28de14657560bf589e35e4743Douglas Gregor// --------------------------------------------------------------------- 92a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor// __builtin_va_arg 9325990971b88779a28de14657560bf589e35e4743Douglas Gregor// --------------------------------------------------------------------- 9425990971b88779a28de14657560bf589e35e4743Douglas Gregortemplate<typename ArgType> 9525990971b88779a28de14657560bf589e35e4743Douglas Gregorstruct VaArg0 { 9625990971b88779a28de14657560bf589e35e4743Douglas Gregor void f(int n, ...) { 9725990971b88779a28de14657560bf589e35e4743Douglas Gregor __builtin_va_list va; 9825990971b88779a28de14657560bf589e35e4743Douglas Gregor __builtin_va_start(va, n); 9925990971b88779a28de14657560bf589e35e4743Douglas Gregor for (int i = 0; i != n; ++i) 10025990971b88779a28de14657560bf589e35e4743Douglas Gregor (void)__builtin_va_arg(va, ArgType); 10125990971b88779a28de14657560bf589e35e4743Douglas Gregor __builtin_va_end(va); 10225990971b88779a28de14657560bf589e35e4743Douglas Gregor } 10325990971b88779a28de14657560bf589e35e4743Douglas Gregor}; 10425990971b88779a28de14657560bf589e35e4743Douglas Gregor 10525990971b88779a28de14657560bf589e35e4743Douglas Gregortemplate struct VaArg0<int>; 106a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor 107df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregortemplate<typename VaList, typename ArgType> 108df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregorstruct VaArg1 { 109df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregor void f(int n, ...) { 110df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregor VaList va; 1111adf43e716879234d51dcae63ebcccff7e1566ecDouglas Gregor __builtin_va_start(va, n); // expected-error{{int}} 112df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregor for (int i = 0; i != n; ++i) 1137ce323c99954cff6060c412ccceaaa9504804761John McCall (void)__builtin_va_arg(va, ArgType); // expected-error{{int}} 1147ce323c99954cff6060c412ccceaaa9504804761John McCall __builtin_va_end(va); // expected-error{{int}} 115df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregor } 116df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregor}; 117df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregor 118df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregortemplate struct VaArg1<__builtin_va_list, int>; 119df6396d4ff3c061b2afce75ec50e73958a0e544cDouglas Gregortemplate struct VaArg1<int, int>; // expected-note{{instantiation}} 120