diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CXX/temp/temp.spec/temp.expl.spec/p2.cpp | 49 | ||||
-rw-r--r-- | test/Parser/cxx-template-decl.cpp | 9 |
2 files changed, 50 insertions, 8 deletions
diff --git a/test/CXX/temp/temp.spec/temp.expl.spec/p2.cpp b/test/CXX/temp/temp.spec/temp.expl.spec/p2.cpp index 438c41159a..0ba95d875a 100644 --- a/test/CXX/temp/temp.spec/temp.expl.spec/p2.cpp +++ b/test/CXX/temp/temp.spec/temp.expl.spec/p2.cpp @@ -55,7 +55,7 @@ struct X0 { // expected-note 2{{here}} t = 17; } - struct Inner : public T { }; + struct Inner : public T { }; // expected-note 3{{here}} template<typename U> struct InnerTemplate : public T { }; @@ -115,6 +115,8 @@ namespace N0 { template<> long X0<long>::member = 17; template<> float X0<float>::member; + + template<> double X0<double>::member; } NonDefaultConstructible &get_static_member() { @@ -125,14 +127,51 @@ template<> int N0::X0<int>::member; // expected-error{{originally}} template<> float N0::X0<float>::member = 3.14f; -#if 0 -// FIXME: update the remainder of this test to check for scopes properly. +namespace N1 { + template<> double N0::X0<double>::member = 3.14; // expected-error{{not in a namespace enclosing}} +} + // -- member class of a class template +namespace N0 { + + template<> + struct X0<void*>::Inner { }; + + template<> + struct X0<int>::Inner { }; + + template<> + struct X0<unsigned>::Inner; + + template<> + struct X0<float>::Inner; + + template<> + struct X0<double>::Inner; // expected-note{{forward declaration}} +} + template<> -struct X0<void*>::Inner { }; +struct N0::X0<long>::Inner { }; // expected-error{{originally}} -X0<void*>::Inner inner0; +template<> +struct N0::X0<float>::Inner { }; + +namespace N1 { + template<> + struct N0::X0<unsigned>::Inner { }; // expected-error{{member class specialization}} + template<> + struct N0::X0<unsigned long>::Inner { }; // expected-error{{member class specialization}} +}; + +N0::X0<void*>::Inner inner0; +N0::X0<int>::Inner inner1; +N0::X0<long>::Inner inner2; +N0::X0<float>::Inner inner3; +N0::X0<double>::Inner inner4; // expected-error{{incomplete}} + +#if 0 +// FIXME: update the remainder of this test to check for scopes properly. // -- member class template of a class template template<> template<> diff --git a/test/Parser/cxx-template-decl.cpp b/test/Parser/cxx-template-decl.cpp index 7f1ff3dc31..9309b72a55 100644 --- a/test/Parser/cxx-template-decl.cpp +++ b/test/Parser/cxx-template-decl.cpp @@ -7,9 +7,12 @@ template x; // expected-error {{C++ requires a type specifier for al export template x; // expected-error {{expected '<' after 'template'}} export template<class T> class x0; // expected-note {{exported templates are unsupported}} template < ; // expected-error {{parse error}} expected-error {{declaration does not declare anything}} -template <template X> struct Err1; // expected-error {{expected '<' after 'template'}} -template <template <typename> > struct Err2; // expected-error {{expected 'class' before '>'}} -template <template <typename> Foo> struct Err3; // expected-error {{expected 'class' before 'Foo'}} +template <template X> struct Err1; // expected-error {{expected '<' after 'template'}} \ +// expected-error{{extraneous}} +template <template <typename> > struct Err2; // expected-error {{expected 'class' before '>'}} \ +// expected-error{{extraneous}} +template <template <typename> Foo> struct Err3; // expected-error {{expected 'class' before 'Foo'}} \ +// expected-error{{extraneous}} // Template function declarations template <typename T> void foo(); |