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