diff options
Diffstat (limited to 'test/CXX/temp/temp.param/p2.cpp')
| -rw-r--r-- | test/CXX/temp/temp.param/p2.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/test/CXX/temp/temp.param/p2.cpp b/test/CXX/temp/temp.param/p2.cpp index 4eca05774ab5c..20e0b8ef35f8b 100644 --- a/test/CXX/temp/temp.param/p2.cpp +++ b/test/CXX/temp/temp.param/p2.cpp @@ -1,5 +1,6 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s -// expected-no-diagnostics +// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -DCPP11 +// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s -DCPP17 // There is no semantic difference between class and typename in a // template-parameter. typename followed by an unqualified-id names a @@ -13,7 +14,31 @@ template<typename T, typename T::type Value> struct Y0; template<typename T, typename X<T>::type Value> struct Y1; // A storage class shall not be specified in a template-parameter declaration. -template<static int Value> struct Z; // FIXME: expect an error +template<static int Value> struct Z; //expected-error{{invalid declaration specifier}} +template<typedef int Value> struct Z0; //expected-error{{invalid declaration specifier}} +template<extern inline int Value> struct Z0; //expected-error2{{invalid declaration specifier}} +template<virtual int Value> struct Z0; //expected-error{{invalid declaration specifier}} +template<explicit int Value> struct Z0; //expected-error{{invalid declaration specifier}} +template<inline int Value> struct Z0; //expected-error{{invalid declaration specifier}} +template<extern int> struct Z0; //expected-error{{invalid declaration specifier}} +template<static int> struct Z0; //expected-error{{invalid declaration specifier}} +template<explicit int Value> struct Z0; //expected-error{{invalid declaration specifier}} +template<mutable int> struct Z0; //expected-error{{invalid declaration specifier}} + +template<const int> struct Z0; // OK +template<volatile int> struct Z0; // OK + + + +#ifdef CPP11 +template<thread_local int> struct Z0; //expected-error{{invalid declaration specifier}} +template<constexpr int> struct Z0; //expected-error{{invalid declaration specifier}} + +#endif + +#ifdef CPP17 +template<auto> struct Z1; // OK +#endif // Make sure that we properly disambiguate non-type template parameters that // start with 'class'. |
