xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-expr-3.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li // ---------------------------------------------------------------------
4*67e74705SXin Li // Imaginary literals
5*67e74705SXin Li // ---------------------------------------------------------------------
6*67e74705SXin Li template<typename T>
7*67e74705SXin Li struct ImaginaryLiteral0 {
fImaginaryLiteral08*67e74705SXin Li   void f(T &x) {
9*67e74705SXin Li     x = 3.0I; // expected-error{{incompatible type}}
10*67e74705SXin Li   }
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li template struct ImaginaryLiteral0<_Complex float>;
14*67e74705SXin Li template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}}
15*67e74705SXin Li 
16*67e74705SXin Li // ---------------------------------------------------------------------
17*67e74705SXin Li // Compound assignment operator
18*67e74705SXin Li // ---------------------------------------------------------------------
19*67e74705SXin Li namespace N1 {
20*67e74705SXin Li   struct X { };
21*67e74705SXin Li 
22*67e74705SXin Li   int& operator+=(X&, int); // expected-note{{candidate}}
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li namespace N2 {
26*67e74705SXin Li   long& operator+=(N1::X&, long); // expected-note{{candidate}}
27*67e74705SXin Li 
28*67e74705SXin Li   template<typename T, typename U, typename Result>
29*67e74705SXin Li   struct PlusEquals0 {
fN2::PlusEquals030*67e74705SXin Li     void f(T t, U u) {
31*67e74705SXin Li       Result r = t += u; // expected-error{{ambiguous}}
32*67e74705SXin Li     }
33*67e74705SXin Li   };
34*67e74705SXin Li }
35*67e74705SXin Li 
36*67e74705SXin Li namespace N3 {
37*67e74705SXin Li   struct Y : public N1::X {
38*67e74705SXin Li     short& operator+=(long); // expected-note{{candidate}}
39*67e74705SXin Li   };
40*67e74705SXin Li }
41*67e74705SXin Li 
42*67e74705SXin Li template struct N2::PlusEquals0<N1::X, int, int&>;
43*67e74705SXin Li template struct N2::PlusEquals0<N1::X, long, long&>;
44*67e74705SXin Li template struct N2::PlusEquals0<N3::Y, long, short&>;
45*67e74705SXin Li template struct N2::PlusEquals0<int, int, int&>;
46*67e74705SXin Li template struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}}
47*67e74705SXin Li 
48*67e74705SXin Li // ---------------------------------------------------------------------
49*67e74705SXin Li // Conditional operator
50*67e74705SXin Li // ---------------------------------------------------------------------
51*67e74705SXin Li template<typename T, typename U, typename Result>
52*67e74705SXin Li struct Conditional0 {
fConditional053*67e74705SXin Li   void f(T t, U u) {
54*67e74705SXin Li     Result result = t? : u;
55*67e74705SXin Li   }
56*67e74705SXin Li };
57*67e74705SXin Li 
58*67e74705SXin Li template struct Conditional0<int, int, int>;
59*67e74705SXin Li 
60*67e74705SXin Li // ---------------------------------------------------------------------
61*67e74705SXin Li // Statement expressions
62*67e74705SXin Li // ---------------------------------------------------------------------
63*67e74705SXin Li template<typename T>
64*67e74705SXin Li struct StatementExpr0 {
fStatementExpr065*67e74705SXin Li   void f(T t) {
66*67e74705SXin Li     (void)({
67*67e74705SXin Li         if (t) // expected-error{{contextually convertible}}
68*67e74705SXin Li           t = t + 17;
69*67e74705SXin Li         t + 12; // expected-error{{invalid operands}}
70*67e74705SXin Li       });
71*67e74705SXin Li   }
72*67e74705SXin Li };
73*67e74705SXin Li 
74*67e74705SXin Li template struct StatementExpr0<int>;
75*67e74705SXin Li template struct StatementExpr0<N1::X>; // expected-note{{instantiation}}
76*67e74705SXin Li 
77*67e74705SXin Li // ---------------------------------------------------------------------
78*67e74705SXin Li // __builtin_choose_expr
79*67e74705SXin Li // ---------------------------------------------------------------------
80*67e74705SXin Li template<bool Cond, typename T, typename U, typename Result>
81*67e74705SXin Li struct Choose0 {
fChoose082*67e74705SXin Li   void f(T t, U u) {
83*67e74705SXin Li     Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}}
84*67e74705SXin Li   }
85*67e74705SXin Li };
86*67e74705SXin Li 
87*67e74705SXin Li template struct Choose0<true, int, float, int&>;
88*67e74705SXin Li template struct Choose0<false, int, float, float&>;
89*67e74705SXin Li template struct Choose0<true, int, float, float&>; // expected-note{{instantiation}}
90*67e74705SXin Li 
91*67e74705SXin Li // ---------------------------------------------------------------------
92*67e74705SXin Li // __builtin_va_arg
93*67e74705SXin Li // ---------------------------------------------------------------------
94*67e74705SXin Li template<typename ArgType>
95*67e74705SXin Li struct VaArg0 {
fVaArg096*67e74705SXin Li   void f(int n, ...) {
97*67e74705SXin Li     __builtin_va_list va;
98*67e74705SXin Li     __builtin_va_start(va, n);
99*67e74705SXin Li     for (int i = 0; i != n; ++i)
100*67e74705SXin Li       (void)__builtin_va_arg(va, ArgType);
101*67e74705SXin Li     __builtin_va_end(va);
102*67e74705SXin Li   }
103*67e74705SXin Li };
104*67e74705SXin Li 
105*67e74705SXin Li template struct VaArg0<int>;
106*67e74705SXin Li 
107*67e74705SXin Li template<typename VaList, typename ArgType>
108*67e74705SXin Li struct VaArg1 {
fVaArg1109*67e74705SXin Li   void f(int n, ...) {
110*67e74705SXin Li     VaList va;
111*67e74705SXin Li     __builtin_va_start(va, n); // expected-error{{int}} expected-error{{char *}}
112*67e74705SXin Li     for (int i = 0; i != n; ++i)
113*67e74705SXin Li       (void)__builtin_va_arg(va, ArgType); // expected-error{{int}}
114*67e74705SXin Li     __builtin_va_end(va); // expected-error{{int}} expected-error{{char *}}
115*67e74705SXin Li   }
116*67e74705SXin Li };
117*67e74705SXin Li 
118*67e74705SXin Li template struct VaArg1<__builtin_va_list, int>;
119*67e74705SXin Li template struct VaArg1<__builtin_ms_va_list, int>; // expected-note{{instantiation}}
120*67e74705SXin Li template struct VaArg1<int, int>; // expected-note{{instantiation}}
121*67e74705SXin Li 
122*67e74705SXin Li template<typename ArgType>
123*67e74705SXin Li struct VaArg2 {
fVaArg2124*67e74705SXin Li   void __attribute__((ms_abi)) f(int n, ...) {
125*67e74705SXin Li     __builtin_ms_va_list va;
126*67e74705SXin Li     __builtin_ms_va_start(va, n);
127*67e74705SXin Li     for (int i = 0; i != n; ++i)
128*67e74705SXin Li       (void)__builtin_va_arg(va, ArgType);
129*67e74705SXin Li     __builtin_ms_va_end(va);
130*67e74705SXin Li   }
131*67e74705SXin Li };
132*67e74705SXin Li 
133*67e74705SXin Li template struct VaArg2<int>;
134*67e74705SXin Li 
135*67e74705SXin Li template<typename VaList, typename ArgType>
136*67e74705SXin Li struct VaArg3 {
fVaArg3137*67e74705SXin Li   void __attribute__((ms_abi)) f(int n, ...) {
138*67e74705SXin Li     VaList va;
139*67e74705SXin Li     __builtin_ms_va_start(va, n); // expected-error{{int}} expected-error{{__va_list_tag}}
140*67e74705SXin Li     for (int i = 0; i != n; ++i)
141*67e74705SXin Li       (void)__builtin_va_arg(va, ArgType); // expected-error{{int}}
142*67e74705SXin Li     __builtin_ms_va_end(va); // expected-error{{int}} expected-error{{__va_list_tag}}
143*67e74705SXin Li   }
144*67e74705SXin Li };
145*67e74705SXin Li 
146*67e74705SXin Li template struct VaArg3<__builtin_ms_va_list, int>;
147*67e74705SXin Li template struct VaArg3<__builtin_va_list, int>; // expected-note{{instantiation}}
148*67e74705SXin Li template struct VaArg3<int, int>; // expected-note{{instantiation}}
149