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