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