temp_arg_nontype.cpp revision 77e2c67411084c47b1cf511a191b31adf38662ba
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -std=c++98 -verify %s
26ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregortemplate<int N> struct A; // expected-note 5{{template parameter is declared here}}
38b642592a35167a3780074e78674e0bece87c40cDouglas Gregor
48b642592a35167a3780074e78674e0bece87c40cDouglas GregorA<0> *a0;
58b642592a35167a3780074e78674e0bece87c40cDouglas Gregor
67c94c4bb7b875dc1a2b23f77f1ed8013cf94abdbArgyrios KyrtzidisA<int()> *a1; // expected-error{{template argument for non-type template parameter is treated as type 'int ()'}}
78b642592a35167a3780074e78674e0bece87c40cDouglas Gregor
839a8de10c18365bde7062d8959b7ed525449c561Douglas GregorA<int> *a2; // expected-error{{template argument for non-type template parameter must be an expression}}
98b642592a35167a3780074e78674e0bece87c40cDouglas Gregor
104b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas GregorA<1 >> 2> *a3; // expected-warning{{use of right-shift operator ('>>') in template argument will require parentheses in C++0x}}
118b642592a35167a3780074e78674e0bece87c40cDouglas Gregor
126ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor// C++ [temp.arg.nontype]p5:
13788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas GregorA<A> *a4; // expected-error{{must be an expression}}
146ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor
156ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregorenum E { Enumerator = 17 };
1639a8de10c18365bde7062d8959b7ed525449c561Douglas GregorA<E> *a5; // expected-error{{template argument for non-type template parameter must be an expression}}
176ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregortemplate<E Value> struct A1; // expected-note{{template parameter is declared here}}
186ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas GregorA1<Enumerator> *a6; // okay
197c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallA1<17> *a7; // expected-error{{non-type template argument of type 'int' cannot be converted to a value of type 'E'}}
206ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor
216ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregorconst long LongValue = 12345678;
226ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas GregorA<LongValue> *a8;
236ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregorconst short ShortValue = 17;
246ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas GregorA<ShortValue> *a9;
256ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor
266ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregorint f(int);
2739a8de10c18365bde7062d8959b7ed525449c561Douglas GregorA<f(17)> *a10; // expected-error{{non-type template argument of type 'int' is not an integral constant expression}}
286ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor
296ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregorclass X {
306ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregorpublic:
31a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregor  X();
326ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor  X(int, int);
336ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor  operator int() const;
346ae5e6649f5d01a1b593f4db755bfcb42e095700Douglas Gregor};
357c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallA<X(17, 42)> *a11; // expected-error{{non-type template argument of type 'X' must have an integral or enumeration type}}
36a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregor
37a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregorfloat f(float);
38a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregor
391a8cf73a825ef35917eede448817237b5fd47b05Douglas Gregorfloat g(float); // expected-note 2{{candidate function}}
401a8cf73a825ef35917eede448817237b5fd47b05Douglas Gregordouble g(double); // expected-note 2{{candidate function}}
41a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregor
42a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregorint h(int);
43a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregorfloat h2(float);
44a35284bba5db7a6179d70fcce8fbe66481058698Douglas Gregor
451a8cf73a825ef35917eede448817237b5fd47b05Douglas Gregortemplate<int fp(int)> struct A3; // expected-note 1{{template parameter is declared here}}
46a35284bba5db7a6179d70fcce8fbe66481058698Douglas GregorA3<h> *a14_1;
47a35284bba5db7a6179d70fcce8fbe66481058698Douglas GregorA3<&h> *a14_2;
48a35284bba5db7a6179d70fcce8fbe66481058698Douglas GregorA3<f> *a14_3;
49a35284bba5db7a6179d70fcce8fbe66481058698Douglas GregorA3<&f> *a14_4;
50b7a09260204f2079e0f998bf7ee52b95122a4c5dDouglas GregorA3<h2> *a14_6;  // expected-error{{non-type template argument of type 'float (float)' cannot be converted to a value of type 'int (*)(int)'}}
511a8cf73a825ef35917eede448817237b5fd47b05Douglas GregorA3<g> *a14_7; // expected-error{{address of overloaded function 'g' does not match required type 'int (int)'}}
52f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregor
53f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregor
54f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregorstruct Y { } y;
55f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregor
56f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregorvolatile X * X_volatile_ptr;
57f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregortemplate<X const &AnX> struct A4; // expected-note 2{{template parameter is declared here}}
5886a7625062abbd40fffa186f2f5d305cc89615b8Douglas GregorX an_X;
59cc45cb3630b42c5245e26593e385097c220bc859Douglas GregorA4<an_X> *a15_1; // okay
60b7a09260204f2079e0f998bf7ee52b95122a4c5dDouglas GregorA4<*X_volatile_ptr> *a15_2; // expected-error{{non-type template argument does not refer to any declaration}}
617c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallA4<y> *15_3; //  expected-error{{non-type template parameter of reference type 'X const &' cannot bind to template argument of type 'struct Y'}} \
6239a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor            // FIXME: expected-error{{expected unqualified-id}}
63f684e6e793a336f52138a2609b207e6eef3c3022Douglas Gregor
641a8cf73a825ef35917eede448817237b5fd47b05Douglas Gregortemplate<int (&fr)(int)> struct A5; // expected-note{{template parameter is declared here}}
65b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas GregorA5<h> *a16_1;
66b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas GregorA5<f> *a16_3;
67b7a09260204f2079e0f998bf7ee52b95122a4c5dDouglas GregorA5<h2> *a16_6;  // expected-error{{non-type template parameter of reference type 'int (&)(int)' cannot bind to template argument of type 'float (float)'}}
681a8cf73a825ef35917eede448817237b5fd47b05Douglas GregorA5<g> *a14_7; // expected-error{{address of overloaded function 'g' does not match required type 'int (int)'}}
69b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregor
70b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregorstruct Z {
71b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregor  int foo(int);
72b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregor  float bar(float);
73b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregor  int bar(int);
74b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregor  double baz(double);
75658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregor
76658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregor  int int_member;
77658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregor  float float_member;
78b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregor};
79b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas Gregortemplate<int (Z::*pmf)(int)> struct A6; // expected-note{{template parameter is declared here}}
80b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas GregorA6<&Z::foo> *a17_1;
81b86b0579c5805c8ecaedd2d676e06bf8c2bf7f79Douglas GregorA6<&Z::bar> *a17_2;
827c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallA6<&Z::baz> *a17_3; // expected-error{{non-type template argument of type 'double (Z::*)(double)' cannot be converted to a value of type 'int (Z::*)(int)'}}
83658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregor
84658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregor
85658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregortemplate<int Z::*pm> struct A7;  // expected-note{{template parameter is declared here}}
86658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas Gregortemplate<int Z::*pm> struct A7c;
87658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas GregorA7<&Z::int_member> *a18_1;
88658bbb5e8072ccd68b5ddc299d1b868aa047a746Douglas GregorA7c<&Z::int_member> *a18_2;
897c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallA7<&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::*'}}
9039a8de10c18365bde7062d8959b7ed525449c561Douglas GregorA7c<(&Z::int_member)> *a18_3; // expected-error{{non-type template argument cannot be surrounded by parentheses}}
91f80a9d5c2ccc465211178223799217f7a42774aeDouglas Gregor
92f80a9d5c2ccc465211178223799217f7a42774aeDouglas Gregortemplate<unsigned char C> struct Overflow; // expected-note{{template parameter is declared here}}
93f80a9d5c2ccc465211178223799217f7a42774aeDouglas Gregor
94f80a9d5c2ccc465211178223799217f7a42774aeDouglas GregorOverflow<5> *overflow1; // okay
9529f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli FriedmanOverflow<255> *overflow2; // okay
961a6e03457ebafd6ac523cdcf5d6b6f411ea08772Douglas GregorOverflow<256> *overflow3; // expected-warning{{non-type template argument value '256' truncated to '0' for template parameter of type 'unsigned char'}}
97f80a9d5c2ccc465211178223799217f7a42774aeDouglas Gregor
98f80a9d5c2ccc465211178223799217f7a42774aeDouglas Gregor
99f80a9d5c2ccc465211178223799217f7a42774aeDouglas Gregortemplate<unsigned> struct Signedness; // expected-note{{template parameter is declared here}}
100f80a9d5c2ccc465211178223799217f7a42774aeDouglas GregorSignedness<10> *signedness1; // okay
1011a6e03457ebafd6ac523cdcf5d6b6f411ea08772Douglas GregorSignedness<-10> *signedness2; // expected-warning{{non-type template argument with value '-10' converted to '4294967286' for unsigned template parameter of type 'unsigned int'}}
102040867836278659d02baa18e044bd996155ec3b5Douglas Gregor
10329f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli Friedmantemplate<signed char C> struct SignedOverflow; // expected-note 3 {{template parameter is declared here}}
10429f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli FriedmanSignedOverflow<1> *signedoverflow1;
10529f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli FriedmanSignedOverflow<-1> *signedoverflow2;
10629f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli FriedmanSignedOverflow<-128> *signedoverflow3;
1071a6e03457ebafd6ac523cdcf5d6b6f411ea08772Douglas GregorSignedOverflow<-129> *signedoverflow4; // expected-warning{{non-type template argument value '-129' truncated to '127' for template parameter of type 'signed char'}}
10829f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli FriedmanSignedOverflow<127> *signedoverflow5;
1091a6e03457ebafd6ac523cdcf5d6b6f411ea08772Douglas GregorSignedOverflow<128> *signedoverflow6; // expected-warning{{non-type template argument value '128' truncated to '-128' for template parameter of type 'signed char'}}
1101a6e03457ebafd6ac523cdcf5d6b6f411ea08772Douglas GregorSignedOverflow<(unsigned char)128> *signedoverflow7; // expected-warning{{non-type template argument value '128' truncated to '-128' for template parameter of type 'signed char'}}
11129f89f6be93b2f5c7a2b43877cf2555d03aa92a6Eli Friedman
112040867836278659d02baa18e044bd996155ec3b5Douglas Gregor// Check canonicalization of template arguments.
113040867836278659d02baa18e044bd996155ec3b5Douglas Gregortemplate<int (*)(int, int)> struct FuncPtr0;
114040867836278659d02baa18e044bd996155ec3b5Douglas Gregorint func0(int, int);
115040867836278659d02baa18e044bd996155ec3b5Douglas Gregorextern FuncPtr0<&func0> *fp0;
116040867836278659d02baa18e044bd996155ec3b5Douglas Gregortemplate<int (*)(int, int)> struct FuncPtr0;
117040867836278659d02baa18e044bd996155ec3b5Douglas Gregorextern FuncPtr0<&func0> *fp0;
118040867836278659d02baa18e044bd996155ec3b5Douglas Gregorint func0(int, int);
119040867836278659d02baa18e044bd996155ec3b5Douglas Gregorextern FuncPtr0<&func0> *fp0;
120040867836278659d02baa18e044bd996155ec3b5Douglas Gregor
121862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor// PR5350
122862354188764f4a20be21d103bc2abd074ad048aDouglas Gregornamespace ns {
123862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  template <typename T>
124862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  struct Foo {
125862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor    static const bool value = true;
126862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  };
127862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor
128862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  template <bool b>
129862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  struct Bar {};
130862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor
131862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  const bool value = false;
132862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor
133862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor  Bar<bool(ns::Foo<int>::value)> x;
134862354188764f4a20be21d103bc2abd074ad048aDouglas Gregor}
135ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor
136ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor// PR5349
137ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregornamespace ns {
138ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  enum E { k };
139ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor
140ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  template <E e>
141ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  struct Baz  {};
142ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor
143ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  Baz<k> f1;  // This works.
144ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  Baz<E(0)> f2;  // This too.
145ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  Baz<static_cast<E>(0)> f3;  // And this.
146ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor
147ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  Baz<ns::E(0)> b1;  // This doesn't work.
148ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor  Baz<static_cast<ns::E>(0)> b2;  // This neither.
149ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor}
150ff5243981e2f6fb4a11ab7b81bf7accc226f2647Douglas Gregor
151d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregor// PR5597
152d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregortemplate<int (*)(float)> struct X0 { };
153d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregor
154d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregorstruct X1 {
155d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregor    static int pfunc(float);
156d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregor};
157d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregorvoid test_X0_X1() {
158d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregor  X0<X1::pfunc> x01;
159d85b5b9b8fcf53906d9a61649b3657ca0d902017Douglas Gregor}
160645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall
161645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall// PR6249
162645cf44cc34371c808743e5e7c19bb41ff593ca0John McCallnamespace pr6249 {
163645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall  template<typename T, T (*func)()> T f() {
164645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall    return func();
165645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall  }
166645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall
167645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall  int h();
168645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall  template int f<int, h>();
169645cf44cc34371c808743e5e7c19bb41ff593ca0John McCall}
17002024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor
17102024a9f0d8e6c898de276193af604c42ee41269Douglas Gregornamespace PR6723 {
17202024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor  template<unsigned char C> void f(int (&a)[C]); // expected-note 2{{candidate template ignored}}
17302024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor  void g() {
17402024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor    int arr512[512];
17502024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor    f(arr512); // expected-error{{no matching function for call}}
17602024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor    f<512>(arr512); // expected-error{{no matching function for call}}
17702024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor  }
17802024a9f0d8e6c898de276193af604c42ee41269Douglas Gregor}
17977c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor
18077c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor// Check that we instantiate declarations whose addresses are taken
18177c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor// for non-type template arguments.
18277c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregornamespace EntityReferenced {
18377c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor  template<typename T, void (*)(T)> struct X { };
18477c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor
18577c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor  template<typename T>
18677c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor  struct Y {
18777c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor    static void f(T x) {
18877c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor      x = 1; // expected-error{{assigning to 'int *' from incompatible type 'int'}}
18977c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor    }
19077c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor  };
19177c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor
19277c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor  void g() {
19377c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor    typedef X<int*, Y<int*>::f> x; // expected-note{{in instantiation of}}
19477c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor  }
19577c13e07314422c6e76eda1bd1c7d83181b7e526Douglas Gregor}
19677e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor
19777e2c67411084c47b1cf511a191b31adf38662baDouglas Gregornamespace PR6964 {
19877e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor  template <typename ,int, int = 9223372036854775807L > // expected-warning 2{{non-type template argument value '9223372036854775807' truncated to '-1' for template parameter of type 'int'}} \
19977e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor  // expected-note 2{{template parameter is declared here}}
20077e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor  struct as_nview { };
20177e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor
20277e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor  template <typename Sequence, int I0>
20377e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor  struct as_nview<Sequence, I0>  // expected-note{{while checking a default template argument used here}}
20477e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor  { };
20577e2c67411084c47b1cf511a191b31adf38662baDouglas Gregor}
206