1 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s |
2 | |
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}} |
10 | } |
11 | }; |
12 | |
13 | template struct ImaginaryLiteral0<_Complex float>; |
14 | template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}} |
15 | |
16 | // --------------------------------------------------------------------- |
17 | // Compound assignment operator |
18 | // --------------------------------------------------------------------- |
19 | namespace N1 { |
20 | struct X { }; |
21 | |
22 | int& operator+=(X&, int); // expected-note{{candidate}} |
23 | } |
24 | |
25 | namespace 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 | |
36 | namespace N3 { |
37 | struct Y : public N1::X { |
38 | short& operator+=(long); // expected-note{{candidate}} |
39 | }; |
40 | } |
41 | |
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}} |
47 | |
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; |
55 | } |
56 | }; |
57 | |
58 | template struct Conditional0<int, int, int>; |
59 | |
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; |
69 | t + 12; // expected-error{{invalid operands}} |
70 | }); |
71 | } |
72 | }; |
73 | |
74 | template struct StatementExpr0<int>; |
75 | template struct StatementExpr0<N1::X>; // expected-note{{instantiation}} |
76 | |
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}} |
84 | } |
85 | }; |
86 | |
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}} |
90 | |
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); |
102 | } |
103 | }; |
104 | |
105 | template struct VaArg0<int>; |
106 | |
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 *}} |
115 | } |
116 | }; |
117 | |
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}} |
121 | |
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); |
130 | } |
131 | }; |
132 | |
133 | template struct VaArg2<int>; |
134 | |
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}} |
143 | } |
144 | }; |
145 | |
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}} |
149 | |