blob: 91b0c6e765088e339612ef6a20dc3b1ab64fdeb6 [file] [log] [blame]
Douglas Gregor171dcdb2010-10-13 18:27:55 +00001// RUN: %clang_cc1 -fsyntax-only -std=c++98 -Wconversion -verify %s
Douglas Gregor6ae5e662009-02-10 23:36:10 +00002template<int N> struct A; // expected-note 5{{template parameter is declared here}}
Douglas Gregor8b642592009-02-10 00:53:15 +00003
4A<0> *a0;
5
Richard Smith4b6ebe32012-12-19 03:15:32 +00006A<int()> *a1; // expected-error{{template argument for non-type template parameter is treated as function type 'int ()'}}
Douglas Gregor8b642592009-02-10 00:53:15 +00007
Douglas Gregor39a8de12009-02-25 19:37:18 +00008A<int> *a2; // expected-error{{template argument for non-type template parameter must be an expression}}
Douglas Gregor8b642592009-02-10 00:53:15 +00009
Douglas Gregorb3df1382011-10-12 19:26:40 +000010A<1 >> 2> *a3; // expected-warning{{use of right-shift operator ('>>') in template argument will require parentheses in C++11}}
Douglas Gregor8b642592009-02-10 00:53:15 +000011
Douglas Gregor6ae5e662009-02-10 23:36:10 +000012// C++ [temp.arg.nontype]p5:
Douglas Gregor788cd062009-11-11 01:00:40 +000013A<A> *a4; // expected-error{{must be an expression}}
Douglas Gregor6ae5e662009-02-10 23:36:10 +000014
15enum E { Enumerator = 17 };
Douglas Gregor39a8de12009-02-25 19:37:18 +000016A<E> *a5; // expected-error{{template argument for non-type template parameter must be an expression}}
Douglas Gregor6ae5e662009-02-10 23:36:10 +000017template<E Value> struct A1; // expected-note{{template parameter is declared here}}
18A1<Enumerator> *a6; // okay
John McCall7c2342d2010-03-10 11:27:22 +000019A1<17> *a7; // expected-error{{non-type template argument of type 'int' cannot be converted to a value of type 'E'}}
Douglas Gregor6ae5e662009-02-10 23:36:10 +000020
21const long LongValue = 12345678;
22A<LongValue> *a8;
23const short ShortValue = 17;
24A<ShortValue> *a9;
25
26int f(int);
Douglas Gregor39a8de12009-02-25 19:37:18 +000027A<f(17)> *a10; // expected-error{{non-type template argument of type 'int' is not an integral constant expression}}
Douglas Gregor6ae5e662009-02-10 23:36:10 +000028
29class X {
30public:
Douglas Gregora35284b2009-02-11 00:19:33 +000031 X();
Douglas Gregor6ae5e662009-02-10 23:36:10 +000032 X(int, int);
33 operator int() const;
34};
John McCall7c2342d2010-03-10 11:27:22 +000035A<X(17, 42)> *a11; // expected-error{{non-type template argument of type 'X' must have an integral or enumeration type}}
Douglas Gregora35284b2009-02-11 00:19:33 +000036
Douglas Gregora35284b2009-02-11 00:19:33 +000037float f(float);
38
Douglas Gregor1a8cf732010-04-14 23:11:21 +000039float g(float); // expected-note 2{{candidate function}}
40double g(double); // expected-note 2{{candidate function}}
Douglas Gregora35284b2009-02-11 00:19:33 +000041
42int h(int);
43float h2(float);
44
Douglas Gregor1a8cf732010-04-14 23:11:21 +000045template<int fp(int)> struct A3; // expected-note 1{{template parameter is declared here}}
Douglas Gregora35284b2009-02-11 00:19:33 +000046A3<h> *a14_1;
47A3<&h> *a14_2;
48A3<f> *a14_3;
49A3<&f> *a14_4;
Douglas Gregorb7a09262010-04-01 18:32:35 +000050A3<h2> *a14_6; // expected-error{{non-type template argument of type 'float (float)' cannot be converted to a value of type 'int (*)(int)'}}
Douglas Gregor1a8cf732010-04-14 23:11:21 +000051A3<g> *a14_7; // expected-error{{address of overloaded function 'g' does not match required type 'int (int)'}}
Douglas Gregorf684e6e2009-02-11 00:44:29 +000052
53
54struct Y { } y;
55
56volatile X * X_volatile_ptr;
57template<X const &AnX> struct A4; // expected-note 2{{template parameter is declared here}}
Douglas Gregor86a76252010-02-04 17:21:48 +000058X an_X;
Douglas Gregorcc45cb32009-02-11 19:52:55 +000059A4<an_X> *a15_1; // okay
Douglas Gregorb7a09262010-04-01 18:32:35 +000060A4<*X_volatile_ptr> *a15_2; // expected-error{{non-type template argument does not refer to any declaration}}
Chris Lattner0c42bb62010-09-05 00:17:29 +000061A4<y> *15_3; // expected-error{{non-type template parameter of reference type 'const X &' cannot bind to template argument of type 'struct Y'}} \
Douglas Gregor39a8de12009-02-25 19:37:18 +000062 // FIXME: expected-error{{expected unqualified-id}}
Douglas Gregorf684e6e2009-02-11 00:44:29 +000063
Douglas Gregor1a8cf732010-04-14 23:11:21 +000064template<int (&fr)(int)> struct A5; // expected-note{{template parameter is declared here}}
Douglas Gregorb86b0572009-02-11 01:18:59 +000065A5<h> *a16_1;
Douglas Gregorb86b0572009-02-11 01:18:59 +000066A5<f> *a16_3;
Douglas Gregorb7a09262010-04-01 18:32:35 +000067A5<h2> *a16_6; // expected-error{{non-type template parameter of reference type 'int (&)(int)' cannot bind to template argument of type 'float (float)'}}
Douglas Gregor1a8cf732010-04-14 23:11:21 +000068A5<g> *a14_7; // expected-error{{address of overloaded function 'g' does not match required type 'int (int)'}}
Douglas Gregorb86b0572009-02-11 01:18:59 +000069
70struct Z {
71 int foo(int);
72 float bar(float);
73 int bar(int);
74 double baz(double);
Douglas Gregor658bbb52009-02-11 16:16:59 +000075
76 int int_member;
77 float float_member;
David Majnemer255ca712013-10-22 21:56:38 +000078 union {
79 int union_member;
80 };
Douglas Gregorb86b0572009-02-11 01:18:59 +000081};
82template<int (Z::*pmf)(int)> struct A6; // expected-note{{template parameter is declared here}}
83A6<&Z::foo> *a17_1;
84A6<&Z::bar> *a17_2;
Stephen Hines651f13c2014-04-23 16:59:28 -070085A6<&Z::baz> *a17_3; // expected-error-re{{non-type template argument of type 'double (Z::*)(double){{( __attribute__\(\(thiscall\)\))?}}' cannot be converted to a value of type 'int (Z::*)(int){{( __attribute__\(\(thiscall\)\))?}}'}}
Douglas Gregor658bbb52009-02-11 16:16:59 +000086
87
88template<int Z::*pm> struct A7; // expected-note{{template parameter is declared here}}
89template<int Z::*pm> struct A7c;
90A7<&Z::int_member> *a18_1;
91A7c<&Z::int_member> *a18_2;
John McCall7c2342d2010-03-10 11:27:22 +000092A7<&Z::float_member> *a18_3; // expected-error{{non-type template argument of type 'float Z::*' cannot be converted to a value of type 'int Z::*'}}
Abramo Bagnara2c5399f2010-09-13 06:06:58 +000093A7c<(&Z::int_member)> *a18_4; // expected-warning{{address non-type template argument cannot be surrounded by parentheses}}
David Majnemer255ca712013-10-22 21:56:38 +000094A7c<&Z::union_member> *a18_5;
Douglas Gregorf80a9d52009-03-14 00:20:21 +000095
96template<unsigned char C> struct Overflow; // expected-note{{template parameter is declared here}}
97
98Overflow<5> *overflow1; // okay
Eli Friedman29f89f62009-12-23 18:44:58 +000099Overflow<255> *overflow2; // okay
Douglas Gregor1a6e0342010-03-26 02:38:37 +0000100Overflow<256> *overflow3; // expected-warning{{non-type template argument value '256' truncated to '0' for template parameter of type 'unsigned char'}}
Douglas Gregorf80a9d52009-03-14 00:20:21 +0000101
102
103template<unsigned> struct Signedness; // expected-note{{template parameter is declared here}}
104Signedness<10> *signedness1; // okay
Douglas Gregor1a6e0342010-03-26 02:38:37 +0000105Signedness<-10> *signedness2; // expected-warning{{non-type template argument with value '-10' converted to '4294967286' for unsigned template parameter of type 'unsigned int'}}
Douglas Gregor04086782009-05-11 16:52:38 +0000106
Eli Friedman29f89f62009-12-23 18:44:58 +0000107template<signed char C> struct SignedOverflow; // expected-note 3 {{template parameter is declared here}}
108SignedOverflow<1> *signedoverflow1;
109SignedOverflow<-1> *signedoverflow2;
110SignedOverflow<-128> *signedoverflow3;
Douglas Gregor1a6e0342010-03-26 02:38:37 +0000111SignedOverflow<-129> *signedoverflow4; // expected-warning{{non-type template argument value '-129' truncated to '127' for template parameter of type 'signed char'}}
Eli Friedman29f89f62009-12-23 18:44:58 +0000112SignedOverflow<127> *signedoverflow5;
Douglas Gregor1a6e0342010-03-26 02:38:37 +0000113SignedOverflow<128> *signedoverflow6; // expected-warning{{non-type template argument value '128' truncated to '-128' for template parameter of type 'signed char'}}
114SignedOverflow<(unsigned char)128> *signedoverflow7; // expected-warning{{non-type template argument value '128' truncated to '-128' for template parameter of type 'signed char'}}
Eli Friedman29f89f62009-12-23 18:44:58 +0000115
Douglas Gregor04086782009-05-11 16:52:38 +0000116// Check canonicalization of template arguments.
117template<int (*)(int, int)> struct FuncPtr0;
118int func0(int, int);
119extern FuncPtr0<&func0> *fp0;
120template<int (*)(int, int)> struct FuncPtr0;
121extern FuncPtr0<&func0> *fp0;
122int func0(int, int);
123extern FuncPtr0<&func0> *fp0;
124
Douglas Gregor86235412009-11-04 18:18:19 +0000125// PR5350
126namespace ns {
127 template <typename T>
128 struct Foo {
129 static const bool value = true;
130 };
131
132 template <bool b>
133 struct Bar {};
134
135 const bool value = false;
136
137 Bar<bool(ns::Foo<int>::value)> x;
138}
Douglas Gregorff524392009-11-04 21:50:46 +0000139
140// PR5349
141namespace ns {
142 enum E { k };
143
144 template <E e>
145 struct Baz {};
146
147 Baz<k> f1; // This works.
148 Baz<E(0)> f2; // This too.
149 Baz<static_cast<E>(0)> f3; // And this.
150
151 Baz<ns::E(0)> b1; // This doesn't work.
152 Baz<static_cast<ns::E>(0)> b2; // This neither.
153}
154
Douglas Gregord85b5b92009-11-25 22:24:25 +0000155// PR5597
156template<int (*)(float)> struct X0 { };
157
158struct X1 {
159 static int pfunc(float);
160};
161void test_X0_X1() {
162 X0<X1::pfunc> x01;
163}
John McCall645cf442010-02-06 10:23:53 +0000164
165// PR6249
166namespace pr6249 {
167 template<typename T, T (*func)()> T f() {
168 return func();
169 }
170
171 int h();
172 template int f<int, h>();
173}
Douglas Gregor02024a92010-03-28 02:42:43 +0000174
175namespace PR6723 {
Douglas Gregora009b592011-01-07 00:20:55 +0000176 template<unsigned char C> void f(int (&a)[C]); // expected-note {{candidate template ignored}} \
Douglas Gregor5fad9b82011-10-12 20:35:48 +0000177 // expected-note{{substitution failure [with C = '\x00']}}
Douglas Gregor02024a92010-03-28 02:42:43 +0000178 void g() {
179 int arr512[512];
180 f(arr512); // expected-error{{no matching function for call}}
181 f<512>(arr512); // expected-error{{no matching function for call}}
182 }
183}
Douglas Gregor77c13e02010-04-24 18:20:53 +0000184
185// Check that we instantiate declarations whose addresses are taken
186// for non-type template arguments.
187namespace EntityReferenced {
188 template<typename T, void (*)(T)> struct X { };
189
190 template<typename T>
191 struct Y {
192 static void f(T x) {
193 x = 1; // expected-error{{assigning to 'int *' from incompatible type 'int'}}
194 }
195 };
196
197 void g() {
198 typedef X<int*, Y<int*>::f> x; // expected-note{{in instantiation of}}
199 }
200}
Douglas Gregor77e2c672010-04-29 04:55:13 +0000201
202namespace PR6964 {
203 template <typename ,int, int = 9223372036854775807L > // expected-warning 2{{non-type template argument value '9223372036854775807' truncated to '-1' for template parameter of type 'int'}} \
204 // expected-note 2{{template parameter is declared here}}
205 struct as_nview { };
206
207 template <typename Sequence, int I0>
208 struct as_nview<Sequence, I0> // expected-note{{while checking a default template argument used here}}
209 { };
210}
John McCall76672452010-08-19 23:06:02 +0000211
212// rdar://problem/8302138
213namespace test8 {
214 template <int* ip> struct A {
215 int* p;
216 A() : p(ip) {}
217 };
218
219 void test0() {
220 extern int i00;
221 A<&i00> a00;
222 }
223
224 extern int i01;
225 void test1() {
226 A<&i01> a01;
227 }
228
229
230 struct C {
231 int x;
232 char y;
233 double z;
234 };
235
236 template <C* cp> struct B {
237 C* p;
238 B() : p(cp) {}
239 };
240
241 void test2() {
242 extern C c02;
243 B<&c02> b02;
244 }
245
246 extern C c03;
247 void test3() {
248 B<&c03> b03;
249 }
250}
Douglas Gregorb5350412010-10-13 17:22:14 +0000251
252namespace PR8372 {
253 template <int I> void foo() { } // expected-note{{template parameter is declared here}}
254 void bar() { foo <0x80000000> (); } // expected-warning{{non-type template argument value '2147483648' truncated to '-2147483648' for template parameter of type 'int'}}
255}
Chandler Carruth781701c2011-02-19 00:21:00 +0000256
257namespace PR9227 {
258 template <bool B> struct enable_if_bool { };
Kaelyn Uhrainb5c77682013-10-19 00:05:00 +0000259 template <> struct enable_if_bool<true> { typedef int type; }; // expected-note{{'enable_if_bool<true>::type' declared here}}
260 void test_bool() { enable_if_bool<false>::type i; } // expected-error{{enable_if_bool<false>'; did you mean 'enable_if_bool<true>::type'?}}
Chandler Carruth781701c2011-02-19 00:21:00 +0000261
262 template <char C> struct enable_if_char { };
Kaelyn Uhrainb5c77682013-10-19 00:05:00 +0000263 template <> struct enable_if_char<'a'> { typedef int type; }; // expected-note 5{{'enable_if_char<'a'>::type' declared here}}
264 void test_char_0() { enable_if_char<0>::type i; } // expected-error{{enable_if_char<'\x00'>'; did you mean 'enable_if_char<'a'>::type'?}}
265 void test_char_b() { enable_if_char<'b'>::type i; } // expected-error{{enable_if_char<'b'>'; did you mean 'enable_if_char<'a'>::type'?}}
266 void test_char_possibly_negative() { enable_if_char<'\x02'>::type i; } // expected-error{{enable_if_char<'\x02'>'; did you mean 'enable_if_char<'a'>::type'?}}
267 void test_char_single_quote() { enable_if_char<'\''>::type i; } // expected-error{{enable_if_char<'\''>'; did you mean 'enable_if_char<'a'>::type'?}}
268 void test_char_backslash() { enable_if_char<'\\'>::type i; } // expected-error{{enable_if_char<'\\'>'; did you mean 'enable_if_char<'a'>::type'?}}
Chandler Carruth781701c2011-02-19 00:21:00 +0000269}
Douglas Gregor6b63f552011-08-09 01:55:14 +0000270
271namespace PR10579 {
272 namespace fcppt
273 {
274 namespace container
275 {
276 namespace bitfield
277 {
278
279 template<
280 typename Enum,
281 Enum Size
282 >
283 class basic;
284
285 template<
286 typename Enum,
287 Enum Size
288 >
289 class basic
290 {
291 public:
292 basic()
293 {
294 }
295 };
296
297 }
298 }
299 }
300
301 namespace
302 {
303
304 namespace testenum
305 {
306 enum type
307 {
308 foo,
309 bar,
310 size
311 };
312 }
313
314 }
315
316 int main()
317 {
318 typedef fcppt::container::bitfield::basic<
319 testenum::type,
320 testenum::size
321 > bitfield_foo;
322
323 bitfield_foo obj;
324 }
325
326}
Eli Friedman7b2f51c2011-08-26 20:28:17 +0000327
328template <int& I> struct PR10766 { static int *ip; };
329template <int& I> int* PR10766<I>::ip = &I;
Douglas Gregorb9df75f2013-01-16 00:52:15 +0000330
331namespace rdar13000548 {
David Blaikie98b879a2013-02-27 22:10:37 +0000332 template<typename R, typename U, R F>
333 U f() { return &F; } // expected-error{{cannot take the address of an rvalue of type 'int (*)(int)'}} expected-error{{cannot take the address of an rvalue of type 'int *'}}
Douglas Gregorb9df75f2013-01-16 00:52:15 +0000334
335 int g(int);
David Blaikie98b879a2013-02-27 22:10:37 +0000336 int y[3];
Douglas Gregorb9df75f2013-01-16 00:52:15 +0000337 void test()
338 {
David Blaikie98b879a2013-02-27 22:10:37 +0000339 f<int(int), int (*)(int), g>(); // expected-note{{in instantiation of}}
340 f<int[3], int*, y>(); // expected-note{{in instantiation of}}
Douglas Gregorb9df75f2013-01-16 00:52:15 +0000341 }
342
343}
Douglas Gregor79bef7a2013-05-03 23:44:54 +0000344
345namespace rdar13806270 {
346 template <unsigned N> class X { };
347 const unsigned value = 32;
348 struct Y {
349 X<value + 1> x;
350 };
351 void foo() {}
352}
David Majnemerd7b48552013-10-26 05:02:13 +0000353
354namespace PR17696 {
355 struct a {
356 union {
357 int i;
358 };
359 };
360
361 template <int (a::*p)> struct b : a {
362 b() { this->*p = 0; }
363 };
364
365 b<&a::i> c; // okay
366}