[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / SemaTemplate / instantiate-expr-3.cpp
blob689fd22ea44841266ecbba81a56ce54585e1fba6
1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s
3 // ---------------------------------------------------------------------
4 // Imaginary literals
5 // ---------------------------------------------------------------------
6 template<typename T>
7 struct ImaginaryLiteral0 {
8 void f(T &x) {
9 x = 3.0I; // expected-error{{incompatible type}}
13 template struct ImaginaryLiteral0<_Complex float>;
14 template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}}
16 // ---------------------------------------------------------------------
17 // Compound assignment operator
18 // ---------------------------------------------------------------------
19 namespace N1 {
20 struct X { };
22 int& operator+=(X&, int); // expected-note{{candidate}}
25 namespace N2 {
26 long& operator+=(N1::X&, long);
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}}
36 namespace N3 {
37 struct Y : public N1::X {
38 short& operator+=(long); // expected-note{{candidate}}
42 template struct N2::PlusEquals0<N1::X, int, int&>;
43 template struct N2::PlusEquals0<N1::X, long, long&>;
44 template struct N2::PlusEquals0<N3::Y, long, short&>;
45 template struct N2::PlusEquals0<int, int, int&>;
46 template struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}}
48 // ---------------------------------------------------------------------
49 // Conditional operator
50 // ---------------------------------------------------------------------
51 template<typename T, typename U, typename Result>
52 struct Conditional0 {
53 void f(T t, U u) {
54 Result result = t? : u;
58 template struct Conditional0<int, int, int>;
60 // ---------------------------------------------------------------------
61 // Statement expressions
62 // ---------------------------------------------------------------------
63 template<typename T>
64 struct StatementExpr0 {
65 void f(T t) {
66 (void)({
67 if (t) // expected-error{{contextually convertible}}
68 t = t + 17; // expected-error {{invalid operands to binary expression ('N1::X' and 'int')}}
69 t + 12; // expected-error{{invalid operands}}
70 });
74 template struct StatementExpr0<int>;
75 template struct StatementExpr0<N1::X>; // expected-note{{instantiation}}
77 // ---------------------------------------------------------------------
78 // __builtin_choose_expr
79 // ---------------------------------------------------------------------
80 template<bool Cond, typename T, typename U, typename Result>
81 struct Choose0 {
82 void f(T t, U u) {
83 Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}}
87 template struct Choose0<true, int, float, int&>;
88 template struct Choose0<false, int, float, float&>;
89 template struct Choose0<true, int, float, float&>; // expected-note{{instantiation}}
91 // ---------------------------------------------------------------------
92 // __builtin_va_arg
93 // ---------------------------------------------------------------------
94 template<typename ArgType>
95 struct 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);
105 template struct VaArg0<int>;
107 template<typename VaList, typename ArgType>
108 struct VaArg1 {
109 void f(int n, ...) {
110 VaList va;
111 __builtin_va_start(va, n); // expected-error{{int}} expected-error{{char *}}
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}} expected-error{{char *}}
118 template struct VaArg1<__builtin_va_list, int>;
119 template struct VaArg1<__builtin_ms_va_list, int>; // expected-note{{instantiation}}
120 template struct VaArg1<int, int>; // expected-note{{instantiation}}
122 template<typename ArgType>
123 struct VaArg2 {
124 void __attribute__((ms_abi)) f(int n, ...) {
125 __builtin_ms_va_list va;
126 __builtin_ms_va_start(va, n);
127 for (int i = 0; i != n; ++i)
128 (void)__builtin_va_arg(va, ArgType);
129 __builtin_ms_va_end(va);
133 template struct VaArg2<int>;
135 template<typename VaList, typename ArgType>
136 struct VaArg3 {
137 void __attribute__((ms_abi)) f(int n, ...) {
138 VaList va;
139 __builtin_ms_va_start(va, n); // expected-error{{int}} expected-error{{__va_list_tag}}
140 for (int i = 0; i != n; ++i)
141 (void)__builtin_va_arg(va, ArgType); // expected-error{{int}}
142 __builtin_ms_va_end(va); // expected-error{{int}} expected-error{{__va_list_tag}}
146 template struct VaArg3<__builtin_ms_va_list, int>;
147 template struct VaArg3<__builtin_va_list, int>; // expected-note{{instantiation}}
148 template struct VaArg3<int, int>; // expected-note{{instantiation}}