1// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu %s
2
3// C++11 [temp.arg.nontype]p1:
4//
5//   A template-argument for a non-type, non-template template-parameter shall
6//   be one of:
7//   -- an integral constant expression; or
8//   -- the name of a non-type template-parameter ; or
9namespace non_type_tmpl_param {
10  template <int N> struct X0 { X0(); };
11  template <int N> X0<N>::X0() { }
12  template <int* N> struct X1 { X1(); };
13  template <int* N> X1<N>::X1() { }
14  template <int& N> struct X3 { X3(); };
15  template <int& N> X3<N>::X3() { }
16  template <int (*F)(int)> struct X4 { X4(); };
17  template <int (*F)(int)> X4<F>::X4() { }
18  template <typename T, int (T::* M)(int)> struct X5 { X5(); };
19  template <typename T, int (T::* M)(int)> X5<T, M>::X5() { }
20}
21
22//   -- a constant expression that designates the address of an object with
23//      static storage duration and external or internal linkage or a function
24//      with external or internal linkage, including function templates and
25//      function template-ids, but excluting non-static class members, expressed
26//      (ignoring parentheses) as & id-expression, except that the & may be
27//      omitted if the name refers to a function or array and shall be omitted
28//      if the corresopnding template-parameter is a reference; or
29namespace addr_of_obj_or_func {
30  template <int* p> struct X0 { }; // expected-note 5{{here}}
31  template <int (*fp)(int)> struct X1 { };
32  template <int &p> struct X2 { }; // expected-note 4{{here}}
33  template <const int &p> struct X2k { }; // expected-note {{here}}
34  template <int (&fp)(int)> struct X3 { }; // expected-note 4{{here}}
35
36  int i = 42;
37  int iarr[10];
38  int f(int i);
39  const int ki = 9; // expected-note 5{{here}}
40  __thread int ti = 100; // expected-note 2{{here}}
41  static int f_internal(int); // expected-note 4{{here}}
42  template <typename T> T f_tmpl(T t);
43  struct S { union { int NonStaticMember; }; };
44
45  void test() {
46    X0<i> x0a; // expected-error {{must have its address taken}}
47    X0<&i> x0a_addr;
48    X0<iarr> x0b;
49    X0<&iarr> x0b_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
50    X0<ki> x0c; // expected-error {{must have its address taken}} expected-warning {{internal linkage is a C++11 extension}}
51    X0<&ki> x0c_addr; // expected-error {{cannot be converted to a value of type 'int *'}} expected-warning {{internal linkage is a C++11 extension}}
52    X0<&ti> x0d_addr; // expected-error {{refers to thread-local object}}
53    X1<f> x1a;
54    X1<&f> x1a_addr;
55    X1<f_tmpl> x1b;
56    X1<&f_tmpl> x1b_addr;
57    X1<f_tmpl<int> > x1c;
58    X1<&f_tmpl<int> > x1c_addr;
59    X1<f_internal> x1d; // expected-warning {{internal linkage is a C++11 extension}}
60    X1<&f_internal> x1d_addr; // expected-warning {{internal linkage is a C++11 extension}}
61    X2<i> x2a;
62    X2<&i> x2a_addr; // expected-error {{address taken}}
63    X2<iarr> x2b; // expected-error {{cannot bind to template argument of type 'int [10]'}}
64    X2<&iarr> x2b_addr; // expected-error {{address taken}}
65    X2<ki> x2c; // expected-error {{ignores qualifiers}} expected-warning {{internal linkage is a C++11 extension}}
66    X2k<ki> x2kc; // expected-warning {{internal linkage is a C++11 extension}}
67    X2k<&ki> x2kc_addr; // expected-error {{address taken}} expected-warning {{internal linkage is a C++11 extension}}
68    X2<ti> x2d_addr; // expected-error {{refers to thread-local object}}
69    X3<f> x3a;
70    X3<&f> x3a_addr; // expected-error {{address taken}}
71    X3<f_tmpl> x3b;
72    X3<&f_tmpl> x3b_addr; // expected-error {{address taken}}
73    X3<f_tmpl<int> > x3c;
74    X3<&f_tmpl<int> > x3c_addr; // expected-error {{address taken}}
75    X3<f_internal> x3d; // expected-warning {{internal linkage is a C++11 extension}}
76    X3<&f_internal> x3d_addr; // expected-error {{address taken}} expected-warning {{internal linkage is a C++11 extension}}
77
78    int n; // expected-note {{here}}
79    X0<&n> x0_no_linkage; // expected-error {{non-type template argument refers to object 'n' that does not have linkage}}
80    struct Local { static int f() {} }; // expected-note {{here}}
81    X1<&Local::f> x1_no_linkage; // expected-error {{non-type template argument refers to function 'f' that does not have linkage}}
82    X0<&S::NonStaticMember> x0_non_static; // expected-error {{non-static data member}}
83  }
84}
85
86//   -- a constant expression that evaluates to a null pointer value (4.10); or
87//   -- a constant expression that evaluates to a null member pointer value
88//      (4.11); or
89//   -- a pointer to member expressed as described in 5.3.1.
90
91namespace bad_args {
92  template <int* N> struct X0 { }; // expected-note 2{{template parameter is declared here}}
93  int i = 42;
94  X0<&i + 2> x0a; // expected-error{{non-type template argument does not refer to any declaration}}
95  int* iptr = &i;
96  X0<iptr> x0b; // expected-error{{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
97}
98