1397f32712369bfed739fe3cb180604b472b41942Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu -std=c++98 %s
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu -std=c++11 %s
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -triple=x86_64-linux-gnu %s -DCPP11ONLY
5548028b3ca15926c6883357e111b47bbc56a4761Chandler Carruth
6b4051e7047a0085f0679257386ff183aed3e5162Richard Smith// C++11 [temp.arg.nontype]p1:
7038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//
8038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   A template-argument for a non-type, non-template template-parameter shall
9038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   be one of:
10038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   -- an integral constant expression; or
11038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   -- the name of a non-type template-parameter ; or
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#ifndef CPP11ONLY
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
14038cc399940deefc0f55aad8be97312a7390e2adChandler Carruthnamespace non_type_tmpl_param {
15038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int N> struct X0 { X0(); };
16038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int N> X0<N>::X0() { }
17038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int* N> struct X1 { X1(); };
18038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int* N> X1<N>::X1() { }
19038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int& N> struct X3 { X3(); };
20038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int& N> X3<N>::X3() { }
21038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int (*F)(int)> struct X4 { X4(); };
22038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int (*F)(int)> X4<F>::X4() { }
23038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <typename T, int (T::* M)(int)> struct X5 { X5(); };
24038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <typename T, int (T::* M)(int)> X5<T, M>::X5() { }
25038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth}
26038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth
27b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//   -- a constant expression that designates the address of an object with
28b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//      static storage duration and external or internal linkage or a function
29b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//      with external or internal linkage, including function templates and
30b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//      function template-ids, but excluting non-static class members, expressed
31b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//      (ignoring parentheses) as & id-expression, except that the & may be
32b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//      omitted if the name refers to a function or array and shall be omitted
33b4051e7047a0085f0679257386ff183aed3e5162Richard Smith//      if the corresopnding template-parameter is a reference; or
34038cc399940deefc0f55aad8be97312a7390e2adChandler Carruthnamespace addr_of_obj_or_func {
35099791143ba548bf0a228da0d268b463a3507929David Majnemer  template <int* p> struct X0 { }; // expected-note 5{{here}}
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus >= 201103L
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 2{{template parameter is declared here}}
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <int (*fp)(int)> struct X1 { };
41b4051e7047a0085f0679257386ff183aed3e5162Richard Smith  template <int &p> struct X2 { }; // expected-note 4{{here}}
42b4051e7047a0085f0679257386ff183aed3e5162Richard Smith  template <const int &p> struct X2k { }; // expected-note {{here}}
43b4051e7047a0085f0679257386ff183aed3e5162Richard Smith  template <int (&fp)(int)> struct X3 { }; // expected-note 4{{here}}
44038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth
45038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  int i = 42;
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus >= 201103L
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 {{declared here}}
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
50038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  int iarr[10];
51038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  int f(int i);
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const int ki = 9;
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 5{{non-type template argument refers to object here}}
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __thread int ti = 100; // expected-note {{here}}
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 {{here}}
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static int f_internal(int);
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 4{{non-type template argument refers to function here}}
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
67038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  template <typename T> T f_tmpl(T t);
68099791143ba548bf0a228da0d268b463a3507929David Majnemer  struct S { union { int NonStaticMember; }; };
69b4051e7047a0085f0679257386ff183aed3e5162Richard Smith
70038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  void test() {
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X0<i> x0a;
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-2 {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{non-type template argument of type 'int' is not a constant expression}}
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-note@-5 {{read of non-const variable 'i' is not allowed in a constant expression}}
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
78b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X0<&i> x0a_addr;
79038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth    X0<iarr> x0b;
80b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X0<&iarr> x0b_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X0<ki> x0c; // expected-error {{must have its address taken}}
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X0<&ki> x0c_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X0<&ti> x0d_addr;
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-2 {{non-type template argument refers to thread-local object}}
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{non-type template argument of type 'int *' is not a constant expression}}
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
98b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<f> x1a;
99b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<&f> x1a_addr;
100b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<f_tmpl> x1b;
101b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<&f_tmpl> x1b_addr;
102b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<f_tmpl<int> > x1c;
103b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<&f_tmpl<int> > x1c_addr;
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X1<f_internal> x1d;
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X1<&f_internal> x1d_addr;
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
114b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X2<i> x2a;
115b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X2<&i> x2a_addr; // expected-error {{address taken}}
116b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X2<iarr> x2b; // expected-error {{cannot bind to template argument of type 'int [10]'}}
117b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X2<&iarr> x2b_addr; // expected-error {{address taken}}
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X2<ki> x2c; // expected-error {{ignores qualifiers}}
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X2k<ki> x2kc;
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X2k<&ki> x2kc_addr; // expected-error {{address taken}}
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
133b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X2<ti> x2d_addr; // expected-error {{refers to thread-local object}}
134b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X3<f> x3a;
135b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X3<&f> x3a_addr; // expected-error {{address taken}}
136b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X3<f_tmpl> x3b;
137b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X3<&f_tmpl> x3b_addr; // expected-error {{address taken}}
138b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X3<f_tmpl<int> > x3c;
139b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X3<&f_tmpl<int> > x3c_addr; // expected-error {{address taken}}
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X3<f_internal> x3d;
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X3<&f_internal> x3d_addr; // expected-error {{address taken}}
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-warning@-2 {{internal linkage is a C++11 extension}}
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    int n;
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-note@-2 {{non-type template argument refers to object here}}
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-note@-4 {{declared here}}
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    X0<&n> x0_no_linkage;
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-2 {{non-type template argument refers to object 'n' that does not have linkage}}
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-error@-4 {{non-type template argument of type 'int *' is not a constant expression}}
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expected-note@-5 {{pointer to 'n' is not a constant expression}}
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
164b4051e7047a0085f0679257386ff183aed3e5162Richard Smith
165b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    struct Local { static int f() {} }; // expected-note {{here}}
166b4051e7047a0085f0679257386ff183aed3e5162Richard Smith    X1<&Local::f> x1_no_linkage; // expected-error {{non-type template argument refers to function 'f' that does not have linkage}}
167099791143ba548bf0a228da0d268b463a3507929David Majnemer    X0<&S::NonStaticMember> x0_non_static; // expected-error {{non-static data member}}
168038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  }
169038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth}
170038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth
171038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   -- a constant expression that evaluates to a null pointer value (4.10); or
172038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   -- a constant expression that evaluates to a null member pointer value
173038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//      (4.11); or
174038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth//   -- a pointer to member expressed as described in 5.3.1.
175548028b3ca15926c6883357e111b47bbc56a4761Chandler Carruth
176038cc399940deefc0f55aad8be97312a7390e2adChandler Carruthnamespace bad_args {
177b7a09260204f2079e0f998bf7ee52b95122a4c5dDouglas Gregor  template <int* N> struct X0 { }; // expected-note 2{{template parameter is declared here}}
178038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  int i = 42;
179038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  X0<&i + 2> x0a; // expected-error{{non-type template argument does not refer to any declaration}}
180038cc399940deefc0f55aad8be97312a7390e2adChandler Carruth  int* iptr = &i;
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus >= 201103L
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-2 {{declared here}}
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  X0<iptr> x0b;
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-error@-2 {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-error@-4 {{non-type template argument of type 'int *' is not a constant expression}}
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expected-note@-5 {{read of non-constexpr variable 'iptr' is not allowed in a constant expression}}
1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
192548028b3ca15926c6883357e111b47bbc56a4761Chandler Carruth}
19387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif // CPP11ONLY
19487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace default_args {
19687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#ifdef CPP11ONLY
19787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace lambdas {
1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate<int I = ([] { return 5; }())> //expected-error {{constant expression}}
19987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f();
20087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
20187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif // CPP11ONLY
20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
204