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