blob: 820ee38e3eabae2ee8957496100542057fe899c7 [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-pc-linux-gnu
Douglas Gregora0e500d2009-03-12 16:53:44 +00002template<int I, int J>
3struct Bitfields {
4 int simple : I; // expected-error{{bit-field 'simple' has zero width}}
5 int parens : (J);
6};
7
8void test_Bitfields(Bitfields<0, 5> *b) {
9 (void)sizeof(Bitfields<10, 5>);
John McCall7c2342d2010-03-10 11:27:22 +000010 (void)sizeof(Bitfields<0, 1>); // expected-note{{in instantiation of template class 'Bitfields<0, 1>' requested here}}
Douglas Gregora0e500d2009-03-12 16:53:44 +000011}
Douglas Gregordf032512009-03-12 22:46:12 +000012
13template<int I, int J>
14struct BitfieldPlus {
15 int bitfield : I + J; // expected-error{{bit-field 'bitfield' has zero width}}
16};
17
18void test_BitfieldPlus() {
19 (void)sizeof(BitfieldPlus<0, 1>);
John McCall7c2342d2010-03-10 11:27:22 +000020 (void)sizeof(BitfieldPlus<-5, 5>); // expected-note{{in instantiation of template class 'BitfieldPlus<-5, 5>' requested here}}
Douglas Gregordf032512009-03-12 22:46:12 +000021}
22
23template<int I, int J>
24struct BitfieldMinus {
25 int bitfield : I - J; // expected-error{{bit-field 'bitfield' has negative width (-1)}} \
26 // expected-error{{bit-field 'bitfield' has zero width}}
27};
28
29void test_BitfieldMinus() {
30 (void)sizeof(BitfieldMinus<5, 1>);
John McCall7c2342d2010-03-10 11:27:22 +000031 (void)sizeof(BitfieldMinus<0, 1>); // expected-note{{in instantiation of template class 'BitfieldMinus<0, 1>' requested here}}
32 (void)sizeof(BitfieldMinus<5, 5>); // expected-note{{in instantiation of template class 'BitfieldMinus<5, 5>' requested here}}
Douglas Gregordf032512009-03-12 22:46:12 +000033}
34
35template<int I, int J>
36struct BitfieldDivide {
Richard Smith244ee7b2012-01-15 03:51:30 +000037 int bitfield : I / J; // expected-error{{expression is not an integral constant expression}} \
Chris Lattnercb329c52010-01-12 21:30:55 +000038 // expected-note{{division by zero}}
Douglas Gregordf032512009-03-12 22:46:12 +000039};
40
41void test_BitfieldDivide() {
42 (void)sizeof(BitfieldDivide<5, 1>);
John McCall7c2342d2010-03-10 11:27:22 +000043 (void)sizeof(BitfieldDivide<5, 0>); // expected-note{{in instantiation of template class 'BitfieldDivide<5, 0>' requested here}}
Douglas Gregordf032512009-03-12 22:46:12 +000044}
Douglas Gregorba498172009-03-13 21:01:28 +000045
46template<typename T, T I, int J>
47struct BitfieldDep {
48 int bitfield : I + J;
49};
50
51void test_BitfieldDep() {
52 (void)sizeof(BitfieldDep<int, 1, 5>);
53}
54
Douglas Gregorbc736fc2009-03-13 23:49:33 +000055template<int I>
56struct BitfieldNeg {
57 int bitfield : (-I); // expected-error{{bit-field 'bitfield' has negative width (-5)}}
58};
59
60template<typename T, T I>
61struct BitfieldNeg2 {
62 int bitfield : (-I); // expected-error{{bit-field 'bitfield' has negative width (-5)}}
63};
64
65void test_BitfieldNeg() {
66 (void)sizeof(BitfieldNeg<-5>); // okay
John McCall7c2342d2010-03-10 11:27:22 +000067 (void)sizeof(BitfieldNeg<5>); // expected-note{{in instantiation of template class 'BitfieldNeg<5>' requested here}}
Douglas Gregorbc736fc2009-03-13 23:49:33 +000068 (void)sizeof(BitfieldNeg2<int, -5>); // okay
John McCall7c2342d2010-03-10 11:27:22 +000069 (void)sizeof(BitfieldNeg2<int, 5>); // expected-note{{in instantiation of template class 'BitfieldNeg2<int, 5>' requested here}}
Douglas Gregorbc736fc2009-03-13 23:49:33 +000070}
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +000071
72template<typename T>
73void increment(T &x) {
74 (void)++x;
75}
76
77struct Incrementable {
78 Incrementable &operator++();
79};
80
81void test_increment(Incrementable inc) {
82 increment(inc);
83}
84
85template<typename T>
86void add(const T &x) {
87 (void)(x + x);
88}
89
Douglas Gregordc81c882010-02-05 05:15:43 +000090namespace PR6237 {
91 template <typename T>
92 void f(T t) {
93 t++;
94 }
95
96 struct B { };
97 B operator++(B &, int);
98
99 template void f(B);
100}
101
Douglas Gregor6ca7cfb2009-11-05 00:51:44 +0000102struct Addable {
103 Addable operator+(const Addable&) const;
104};
105
106void test_add(Addable &a) {
107 add(a);
108}
Douglas Gregor668d6d92009-12-13 20:44:55 +0000109
110struct CallOperator {
111 int &operator()(int);
112 double &operator()(double);
113};
114
115template<typename Result, typename F, typename Arg1>
116Result test_call_operator(F f, Arg1 arg1) {
117 // PR5266: non-dependent invocations of a function call operator.
118 CallOperator call_op;
119 int &ir = call_op(17);
120 return f(arg1);
121}
122
123void test_call_operator(CallOperator call_op, int i, double d) {
124 int &ir = test_call_operator<int&>(call_op, i);
125 double &dr = test_call_operator<double&>(call_op, d);
126}
Anders Carlssonb2e90ac2010-01-24 05:50:37 +0000127
128template<typename T>
129void test_asm(T t) {
Simon Atanasyand95e95e2012-05-22 11:03:10 +0000130 asm ("nop" : "=r"(*t) : "r"(*t)); // expected-error {{indirection requires pointer operand ('int' invalid)}}
Anders Carlssonb2e90ac2010-01-24 05:50:37 +0000131}
132
133void test_asm() {
134 int* a;
135 test_asm(a);
136
137 int b;
138 test_asm(b); // expected-note {{in instantiation of function template specialization 'test_asm<int>' requested here}}
139}
Douglas Gregorc845aad2010-02-26 00:01:57 +0000140
141namespace PR6424 {
142 template<int I> struct X {
143 X() {
144 int *ip = I; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}}
145 }
146 };
147
148 template<int> struct Y {
149 typedef X<7> X7;
150
151 void f() { X7(); } // expected-note{{instantiation}}
152 };
153
154 template void Y<3>::f();
Douglas Gregor1af74512010-02-26 00:38:10 +0000155
156 template<int I>
157 struct X2 {
158 void *operator new(__SIZE_TYPE__) {
159 int *ip = I; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}}
160 return ip;
161 }
162 };
163
164 template<int> struct Y2 {
165 typedef X2<7> X;
166 void f() {
167 new X(); // expected-note{{instantiation of}}
168 }
169 };
Douglas Gregor4e8ea0b2011-10-18 02:43:19 +0000170
Douglas Gregor1af74512010-02-26 00:38:10 +0000171 template void Y2<3>::f();
Douglas Gregor4e8ea0b2011-10-18 02:43:19 +0000172
173 template<typename T>
174 void rdar10283928(int count) {
175 (void)new char[count]();
176 }
177
178 template void rdar10283928<int>(int);
Douglas Gregorc845aad2010-02-26 00:01:57 +0000179}
Eli Friedmanf45b3572011-09-14 19:20:00 +0000180
181namespace PR10864 {
182 template<typename T> class Vals {};
183 template<> class Vals<int> { public: static const int i = 1; };
184 template<> class Vals<float> { public: static const double i; };
185 template<typename T> void test_asm_tied(T o) {
186 __asm("addl $1, %0" : "=r" (o) : "0"(Vals<T>::i)); // expected-error {{input with type 'double' matching output with type 'float'}}
187 }
188 void test_asm_tied() {
189 test_asm_tied(1);
190 test_asm_tied(1.f); // expected-note {{instantiation of}}
191 }
192}