1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3// ---------------------------------------------------------------------
4// Imaginary literals
5// ---------------------------------------------------------------------
6template<typename T>
7struct ImaginaryLiteral0 {
8  void f(T &x) {
9    x = 3.0I; // expected-error{{incompatible type}}
10  }
11};
12
13template struct ImaginaryLiteral0<_Complex float>;
14template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}}
15
16// ---------------------------------------------------------------------
17// Compound assignment operator
18// ---------------------------------------------------------------------
19namespace N1 {
20  struct X { };
21
22  int& operator+=(X&, int); // expected-note{{candidate}}
23}
24
25namespace N2 {
26  long& operator+=(N1::X&, long); // expected-note{{candidate}}
27
28  template<typename T, typename U, typename Result>
29  struct PlusEquals0 {
30    void f(T t, U u) {
31      Result r = t += u; // expected-error{{ambiguous}}
32    }
33  };
34}
35
36namespace N3 {
37  struct Y : public N1::X {
38    short& operator+=(long); // expected-note{{candidate}}
39  };
40}
41
42template struct N2::PlusEquals0<N1::X, int, int&>;
43template struct N2::PlusEquals0<N1::X, long, long&>;
44template struct N2::PlusEquals0<N3::Y, long, short&>;
45template struct N2::PlusEquals0<int, int, int&>;
46template struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}}
47
48// ---------------------------------------------------------------------
49// Conditional operator
50// ---------------------------------------------------------------------
51template<typename T, typename U, typename Result>
52struct Conditional0 {
53  void f(T t, U u) {
54    Result result = t? : u;
55  }
56};
57
58template struct Conditional0<int, int, int>;
59
60// ---------------------------------------------------------------------
61// Statement expressions
62// ---------------------------------------------------------------------
63template<typename T>
64struct StatementExpr0 {
65  void f(T t) {
66    (void)({
67        if (t) // expected-error{{contextually convertible}}
68          t = t + 17;
69        t + 12; // expected-error{{invalid operands}}
70      });
71  }
72};
73
74template struct StatementExpr0<int>;
75template struct StatementExpr0<N1::X>; // expected-note{{instantiation}}
76
77// ---------------------------------------------------------------------
78// __builtin_choose_expr
79// ---------------------------------------------------------------------
80template<bool Cond, typename T, typename U, typename Result>
81struct Choose0 {
82  void f(T t, U u) {
83    Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}}
84  }
85};
86
87template struct Choose0<true, int, float, int&>;
88template struct Choose0<false, int, float, float&>;
89template struct Choose0<true, int, float, float&>; // expected-note{{instantiation}}
90
91// ---------------------------------------------------------------------
92// __builtin_va_arg
93// ---------------------------------------------------------------------
94template<typename ArgType>
95struct VaArg0 {
96  void f(int n, ...) {
97    __builtin_va_list va;
98    __builtin_va_start(va, n);
99    for (int i = 0; i != n; ++i)
100      (void)__builtin_va_arg(va, ArgType);
101    __builtin_va_end(va);
102  }
103};
104
105template struct VaArg0<int>;
106
107template<typename VaList, typename ArgType>
108struct VaArg1 {
109  void f(int n, ...) {
110    VaList va;
111    __builtin_va_start(va, n); // expected-error{{int}}
112    for (int i = 0; i != n; ++i)
113      (void)__builtin_va_arg(va, ArgType); // expected-error{{int}}
114    __builtin_va_end(va); // expected-error{{int}}
115  }
116};
117
118template struct VaArg1<__builtin_va_list, int>;
119template struct VaArg1<int, int>; // expected-note{{instantiation}}
120