p1-11.cpp revision 42963612a4187b55685b7f75489c11abd3fa100e
1// RUN: %clang_cc1 -std=c++11 %s -verify 2 3namespace std { 4 typedef decltype(nullptr) nullptr_t; 5} 6 7template<int *ip> struct IP { // expected-note 4 {{template parameter is declared here}} 8 IP<ip> *ip2; 9}; 10 11constexpr std::nullptr_t get_nullptr() { return nullptr; } 12 13constexpr std::nullptr_t np = nullptr; 14 15std::nullptr_t nonconst_np; 16 17IP<0> ip0; // expected-error{{null non-type template argument must be cast to template parameter type 'int *'}} 18IP<(0)> ip1; // expected-error{{null non-type template argument must be cast to template parameter type 'int *'}} 19IP<nullptr> ip2; 20IP<get_nullptr()> ip3; 21IP<(int*)0> ip4; 22IP<np> ip5; 23IP<nonconst_np> ip5; // expected-error{{non-type template argument for template parameter of pointer type 'int *' must have its address taken}} 24IP<(float*)0> ip6; // expected-error{{null non-type template argument of type 'float *' does not match template parameter of type 'int *'}} 25 26struct X { }; 27template<int X::*pm> struct PM { // expected-note 2 {{template parameter is declared here}} 28 PM<pm> *pm2; 29}; 30 31PM<0> pm0; // expected-error{{null non-type template argument must be cast to template parameter type 'int X::*'}} 32PM<(0)> pm1; // expected-error{{null non-type template argument must be cast to template parameter type 'int X::*'}} 33PM<nullptr> pm2; 34PM<get_nullptr()> pm3; 35PM<(int X::*)0> pm4; 36PM<np> pm5; 37 38template<int (X::*pmf)(int)> struct PMF { // expected-note 2 {{template parameter is declared here}} 39 PMF<pmf> *pmf2; 40}; 41 42PMF<0> pmf0; // expected-error{{null non-type template argument must be cast to template parameter type 'int (X::*)(int)'}} 43PMF<(0)> pmf1; // expected-error{{null non-type template argument must be cast to template parameter type 'int (X::*)(int)'}} 44PMF<nullptr> pmf2; 45PMF<get_nullptr()> pmf3; 46PMF<(int (X::*)(int))0> pmf4; 47PMF<np> pmf5; 48 49 50template<std::nullptr_t np> struct NP { // expected-note 2{{template parameter is declared here}} 51 NP<np> *np2; 52}; 53 54NP<nullptr> np1; 55NP<np> np2; 56NP<get_nullptr()> np3; 57NP<0> np4; // expected-error{{null non-type template argument must be cast to template parameter type 'std::nullptr_t' (aka 'nullptr_t')}} 58constexpr int i = 7; 59NP<i> np5; // expected-error{{non-type template argument of type 'const int' cannot be converted to a value of type 'std::nullptr_t'}} 60