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