blob: 69d2fe715d81d2f337501dfa2de18b361802a574 [file] [log] [blame]
Douglas Gregord8ac4362009-05-18 22:38:38 +00001// RUN: clang-cc -fsyntax-only -verify %s
2
Douglas Gregord5f3a0f2009-05-19 20:13:50 +00003// ---------------------------------------------------------------------
4// Imaginary literals
5// ---------------------------------------------------------------------
Douglas Gregord8ac4362009-05-18 22:38:38 +00006template<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}}
Douglas Gregor6731c312009-05-19 20:02:01 +000015
Douglas Gregord5f3a0f2009-05-19 20:13:50 +000016// ---------------------------------------------------------------------
17// Compound assignment operator
18// ---------------------------------------------------------------------
Douglas Gregor6731c312009-05-19 20:02:01 +000019namespace 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}}
Douglas Gregord5f3a0f2009-05-19 20:13:50 +000047
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>;
Douglas Gregorcd938172009-05-19 20:31:21 +000059
60// ---------------------------------------------------------------------
61// Statement expressions
62// ---------------------------------------------------------------------
63template<typename T>
64struct StatementExpr0 {
65 void f(T t) {
66 (void)({ if (t) t = t + 17; }); // expected-error{{invalid}}
67 }
68};
69
70template struct StatementExpr0<int>;
71template struct StatementExpr0<N1::X>; // expected-note{{instantiation}}
Douglas Gregordc241b42009-05-19 20:55:31 +000072
73// ---------------------------------------------------------------------
Douglas Gregorcde01732009-05-19 22:10:17 +000074// __builtin_shufflevector
75// ---------------------------------------------------------------------
76typedef __attribute__(( ext_vector_type(2) )) double double2;
Douglas Gregorc9ecc572009-05-19 22:43:30 +000077
Douglas Gregorcde01732009-05-19 22:10:17 +000078template<typename T, typename U, int N, int M>
79struct ShuffleVector0 {
80 void f(T t, U u, double2 a, double2 b) {
81 (void)__builtin_shufflevector(t, u, N, M); // expected-error{{index}}
82 (void)__builtin_shufflevector(a, b, N, M);
83 (void)__builtin_shufflevector(a, b, 2, 1);
84 }
85};
86
87template struct ShuffleVector0<double2, double2, 2, 1>;
88template struct ShuffleVector0<double2, double2, 4, 3>; // expected-note{{instantiation}}
Douglas Gregorc9ecc572009-05-19 22:43:30 +000089
90// ---------------------------------------------------------------------
91// __builtin_choose_expr
92// ---------------------------------------------------------------------
93template<bool Cond, typename T, typename U, typename Result>
94struct Choose0 {
95 void f(T t, U u) {
96 Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}}
97 }
98};
99
100template struct Choose0<true, int, float, int&>;
101template struct Choose0<false, int, float, float&>;
102template struct Choose0<true, int, float, float&>; // expected-note{{instantiation}}
Douglas Gregordd027302009-05-19 23:10:31 +0000103
104// ---------------------------------------------------------------------
Douglas Gregor05295192009-05-19 23:29:16 +0000105// __builtin_va_arg
Douglas Gregordd027302009-05-19 23:10:31 +0000106// ---------------------------------------------------------------------
107template<typename ArgType>
108struct VaArg0 {
109 void f(int n, ...) {
110 __builtin_va_list va;
111 __builtin_va_start(va, n);
112 for (int i = 0; i != n; ++i)
113 (void)__builtin_va_arg(va, ArgType);
114 __builtin_va_end(va);
115 }
116};
117
118template struct VaArg0<int>;
Douglas Gregor05295192009-05-19 23:29:16 +0000119
Douglas Gregor96cff592009-05-20 18:50:16 +0000120template<typename VaList, typename ArgType>
121struct VaArg1 {
122 void f(int n, ...) {
123 VaList va;
Douglas Gregor0db22722009-05-20 20:30:46 +0000124 __builtin_va_start(va, n); // expected-error{{int}}
Douglas Gregor96cff592009-05-20 18:50:16 +0000125 for (int i = 0; i != n; ++i)
126 (void)__builtin_va_arg(va, ArgType);
127 __builtin_va_end(va);
128 }
129};
130
131template struct VaArg1<__builtin_va_list, int>;
132template struct VaArg1<int, int>; // expected-note{{instantiation}}
133
Douglas Gregor05295192009-05-19 23:29:16 +0000134// ---------------------------------------------------------------------
135// Vector element expressions
136// ---------------------------------------------------------------------
137#if 0
138// Not supported until we have full support for MemberExpr.
139typedef __attribute__(( ext_vector_type(2) )) double double2;
140typedef __attribute__(( ext_vector_type(4) )) double double4;
141
142template<typename T, typename U>
143struct VectorElem0 {
144 void f(T t, U u) {
145 t.xy = u.zw;
146 }
147};
148
149template struct VectorElem0<double2, double4>;
150template struct VectorElem0<double4, double4>;
151#endif