1*67e74705SXin Li // RUN: %clang_cc1 --std=c++1y -fsyntax-only -verify %s 2*67e74705SXin Li // RUN: cp %s %t 3*67e74705SXin Li // RUN: not %clang_cc1 --std=c++1y -x c++ -fixit %t -DFIXING 4*67e74705SXin Li // RUN: %clang_cc1 --std=c++1y -x c++ %t -DFIXING 5*67e74705SXin Li 6*67e74705SXin Li template<typename T> 7*67e74705SXin Li T pi = T(3.1415926535897932385); // expected-note {{template is declared here}} 8*67e74705SXin Li 9*67e74705SXin Li template int pi<int>; 10*67e74705SXin Li 11*67e74705SXin Li #ifndef FIXING 12*67e74705SXin Li template float pi<>; // expected-error {{too few template arguments for template 'pi'}} 13*67e74705SXin Li template double pi_var0; // expected-error {{explicit instantiation of 'pi_var0' does not refer to a function template, variable template, member function, member class, or static data member}} 14*67e74705SXin Li #endif 15*67e74705SXin Li 16*67e74705SXin Li // Should recover as if definition 17*67e74705SXin Li template double pi_var = 5; // expected-error {{variable cannot be defined in an explicit instantiation; if this declaration is meant to be a variable definition, remove the 'template' keyword}} 18*67e74705SXin Li #ifndef FIXING 19*67e74705SXin Li template<typename T> 20*67e74705SXin Li T pi0 = T(3.1415926535897932385); // expected-note {{previous definition is here}} 21*67e74705SXin Li 22*67e74705SXin Li template int pi0 = 10; // expected-error {{variable cannot be defined in an explicit instantiation; if this declaration is meant to be a variable definition, remove the 'template' keyword}} \ 23*67e74705SXin Li expected-error{{redefinition of 'pi0' as different kind of symbol}} 24*67e74705SXin Li #endif 25*67e74705SXin Li 26*67e74705SXin Li template<typename T> 27*67e74705SXin Li T pi1 = T(3.1415926535897932385); // expected-note 0-2 {{here}} 28*67e74705SXin Li 29*67e74705SXin Li // Should recover as if specialization 30*67e74705SXin Li template float pi1<float> = 1.0; // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} 31*67e74705SXin Li #ifndef FIXING 32*67e74705SXin Li namespace expected_global { 33*67e74705SXin Li template<> double pi1<double> = 1.5; // expected-error {{variable template specialization of 'pi1' must originally be declared in the global scope}} 34*67e74705SXin Li template int pi1<int> = 10; // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} \ 35*67e74705SXin Li expected-error {{variable template specialization of 'pi1' must originally be declared in the global scope}} 36*67e74705SXin Li } 37*67e74705SXin Li #endif 38