instantiate-expr-3.cpp revision a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1
14a95134918f5492e363a44868e3473299e0562ceDouglas Gregor// RUN: clang-cc -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) { 6683f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor (void)({ if (t) t = t + 17; }); // expected-error{{invalid}} 6783f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor } 6883f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor}; 6983f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregor 7083f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregortemplate struct StatementExpr0<int>; 7183f412bc91ba89622a6670ec8b1406e65a144ebaDouglas Gregortemplate struct StatementExpr0<N1::X>; // expected-note{{instantiation}} 72b4245188f28d3942f42380a803755acabe4f3aecDouglas Gregor 73b4245188f28d3942f42380a803755acabe4f3aecDouglas Gregor// --------------------------------------------------------------------- 74602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor// __builtin_shufflevector 75602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor// --------------------------------------------------------------------- 76602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregortypedef __attribute__(( ext_vector_type(2) )) double double2; 77dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor 78602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregortemplate<typename T, typename U, int N, int M> 79602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregorstruct ShuffleVector0 { 80602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor void f(T t, U u, double2 a, double2 b) { 81602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor (void)__builtin_shufflevector(t, u, N, M); // expected-error{{index}} 82602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor (void)__builtin_shufflevector(a, b, N, M); 83602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor (void)__builtin_shufflevector(a, b, 2, 1); 84602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor } 85602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor}; 86602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregor 87602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregortemplate struct ShuffleVector0<double2, double2, 2, 1>; 88602173d78446cdf7bb072514d997dc4dae2de1b4Douglas Gregortemplate struct ShuffleVector0<double2, double2, 4, 3>; // expected-note{{instantiation}} 89dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor 90dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor// --------------------------------------------------------------------- 91dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor// __builtin_choose_expr 92dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor// --------------------------------------------------------------------- 93dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate<bool Cond, typename T, typename U, typename Result> 94dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregorstruct Choose0 { 95dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor void f(T t, U u) { 96dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}} 97dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor } 98dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor}; 99dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregor 100dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate struct Choose0<true, int, float, int&>; 101dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate struct Choose0<false, int, float, float&>; 102dd4ae3f16a09719220806cc1e0f2a16ddcc5fa24Douglas Gregortemplate struct Choose0<true, int, float, float&>; // expected-note{{instantiation}} 10325990971b88779a28de14657560bf589e35e4743Douglas Gregor 10425990971b88779a28de14657560bf589e35e4743Douglas Gregor// --------------------------------------------------------------------- 105a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor// __builtin_va_arg 10625990971b88779a28de14657560bf589e35e4743Douglas Gregor// --------------------------------------------------------------------- 10725990971b88779a28de14657560bf589e35e4743Douglas Gregortemplate<typename ArgType> 10825990971b88779a28de14657560bf589e35e4743Douglas Gregorstruct VaArg0 { 10925990971b88779a28de14657560bf589e35e4743Douglas Gregor void f(int n, ...) { 11025990971b88779a28de14657560bf589e35e4743Douglas Gregor __builtin_va_list va; 11125990971b88779a28de14657560bf589e35e4743Douglas Gregor __builtin_va_start(va, n); 11225990971b88779a28de14657560bf589e35e4743Douglas Gregor for (int i = 0; i != n; ++i) 11325990971b88779a28de14657560bf589e35e4743Douglas Gregor (void)__builtin_va_arg(va, ArgType); 11425990971b88779a28de14657560bf589e35e4743Douglas Gregor __builtin_va_end(va); 11525990971b88779a28de14657560bf589e35e4743Douglas Gregor } 11625990971b88779a28de14657560bf589e35e4743Douglas Gregor}; 11725990971b88779a28de14657560bf589e35e4743Douglas Gregor 11825990971b88779a28de14657560bf589e35e4743Douglas Gregortemplate struct VaArg0<int>; 119a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor 120a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor// --------------------------------------------------------------------- 121a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor// Vector element expressions 122a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor// --------------------------------------------------------------------- 123a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor#if 0 124a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor// Not supported until we have full support for MemberExpr. 125a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregortypedef __attribute__(( ext_vector_type(2) )) double double2; 126a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregortypedef __attribute__(( ext_vector_type(4) )) double double4; 127a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor 128a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregortemplate<typename T, typename U> 129a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregorstruct VectorElem0 { 130a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor void f(T t, U u) { 131a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor t.xy = u.zw; 132a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor } 133a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor}; 134a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor 135a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregortemplate struct VectorElem0<double2, double4>; 136a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregortemplate struct VectorElem0<double4, double4>; 137a9a9775dbc6fb3d7b32c4470bf38dd0d844958d1Douglas Gregor#endif 138