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