diff options
Diffstat (limited to 'test/SemaCXX/cxx98-compat.cpp')
-rw-r--r-- | test/SemaCXX/cxx98-compat.cpp | 86 |
1 files changed, 79 insertions, 7 deletions
diff --git a/test/SemaCXX/cxx98-compat.cpp b/test/SemaCXX/cxx98-compat.cpp index 7d36770..9690638 100644 --- a/test/SemaCXX/cxx98-compat.cpp +++ b/test/SemaCXX/cxx98-compat.cpp @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -verify %s -// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s +// RUN: %clang_cc1 -fsyntax-only -std=c++1y -Wc++98-compat -verify %s -DCXX1YCOMPAT namespace std { struct type_info; @@ -73,7 +73,7 @@ int InitList(int i = {}) { // expected-warning {{generalized initializer lists a Ctor c2 = { 3.0, 4l }; // expected-warning {{constructor call from initializer list is incompatible with C++98}} InitListCtor ilc = { true, false }; // expected-warning {{initialization of initializer_list object is incompatible with C++98}} const int &r = { 0 }; // expected-warning {{reference initialized from initializer list is incompatible with C++98}} - struct { int a; const int &r; } rr = { 0, {{0}} }; // expected-warning {{reference initialized from initializer list is incompatible with C++98}} + struct { int a; const int &r; } rr = { 0, {0} }; // expected-warning {{reference initialized from initializer list is incompatible with C++98}} return { 0 }; // expected-warning {{generalized initializer lists are incompatible with C++98}} } struct DelayedDefaultArgumentParseInitList { @@ -147,16 +147,12 @@ bool no_except_expr = noexcept(1 + 1); // expected-warning {{noexcept expression void *null = nullptr; // expected-warning {{'nullptr' is incompatible with C++98}} static_assert(true, "!"); // expected-warning {{static_assert declarations are incompatible with C++98}} -// FIXME: Reintroduce this test if support for inheriting constructors is -// implemented. -#if 0 struct InhCtorBase { InhCtorBase(int); }; struct InhCtorDerived : InhCtorBase { - using InhCtorBase::InhCtorBase; // xpected-warning {{inheriting constructors are incompatible with C++98}} + using InhCtorBase::InhCtorBase; // expected-warning {{inheriting constructors are incompatible with C++98}} }; -#endif struct FriendMember { static void MemberFn(); @@ -382,3 +378,79 @@ namespace rdar11736429 { X x; // expected-warning{{union member 'x' with a non-trivial constructor is incompatible with C++98}} }; } + +template<typename T> T var = T(10); +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template<typename T> T* var<T*> = new T(); +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template<> int var<int> = 10; +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template int var<int>; +float fvar = var<float>; + +class A { + template<typename T> static T var = T(10); +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + + template<typename T> static T* var<T*> = new T(); +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +}; + +struct B { template<typename T> static T v; }; +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template<typename T> T B::v = T(); +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template<typename T> T* B::v<T*> = new T(); +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template<> int B::v<int> = 10; +#ifdef CXX1YCOMPAT +// expected-warning@-2 {{variable templates are incompatible with C++ standards before C++1y}} +#else +// expected-warning@-4 {{variable templates are a C++1y extension}} +#endif + +template int B::v<int>; +float fsvar = B::v<float>; + +#ifdef CXX1YCOMPAT +int digit_seps = 123'456; // expected-warning {{digit separators are incompatible with C++ standards before C++1y}} +#endif |