From: Richard Smith Date: Tue, 8 Mar 2016 00:40:32 +0000 (+0000) Subject: Define __has_cpp_attribute(fallthrough) to a more reasonable value. (What year is... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=570d62ad3d3c7ba4329f11af36a23bf125e0d653;p=clang Define __has_cpp_attribute(fallthrough) to a more reasonable value. (What year is it?!) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262887 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index 391d042681..496e395197 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -742,7 +742,7 @@ def ExtVectorType : Attr { } def FallThrough : StmtAttr { - let Spellings = [CXX11<"", "fallthrough", 201503>, + let Spellings = [CXX11<"", "fallthrough", 201603>, CXX11<"clang", "fallthrough">]; // let Subjects = [NullStmt]; let Documentation = [FallthroughDocs]; diff --git a/test/Preprocessor/has_attribute.cpp b/test/Preprocessor/has_attribute.cpp index 1ab45020b4..2cfa005fb0 100644 --- a/test/Preprocessor/has_attribute.cpp +++ b/test/Preprocessor/has_attribute.cpp @@ -52,6 +52,16 @@ int has_cxx14_deprecated_vers(); #endif +// CHECK: has_cxx1z_nodiscard +#if __has_cpp_attribute(nodiscard) == 201603 + int has_cxx1z_nodiscard(); +#endif + +// CHECK: has_cxx1z_fallthrough +#if __has_cpp_attribute(fallthrough) == 201603 + int has_cxx1z_fallthrough(); +#endif + // CHECK: has_declspec_uuid #if __has_declspec_attribute(uuid) int has_declspec_uuid(); diff --git a/test/SemaCXX/nodiscard.cpp b/test/SemaCXX/nodiscard.cpp index e53cf9bb06..4eb004c67d 100644 --- a/test/SemaCXX/nodiscard.cpp +++ b/test/SemaCXX/nodiscard.cpp @@ -1,9 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -std=c++1z -verify -Wc++1z-extensions %s // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify -DEXT -Wc++1z-extensions %s -#if !defined(EXT) -static_assert(__has_cpp_attribute(nodiscard) == 201603); - struct [[nodiscard]] S {}; S get_s(); S& get_s_ref(); @@ -28,6 +25,10 @@ void f() { [[nodiscard nodiscard]] int wrong1(); // expected-error {{attribute 'nodiscard' cannot appear multiple times in an attribute specifier}} namespace [[nodiscard]] N {} // expected-warning {{'nodiscard' attribute only applies to functions, methods, enums, and classes}} -#else -struct [[nodiscard]] S {}; // expected-warning {{use of the 'nodiscard' attribute is a C++1z extension}} -#endif // EXT + +#ifdef EXT +// expected-warning@4 {{use of the 'nodiscard' attribute is a C++1z extension}} +// expected-warning@8 {{use of the 'nodiscard' attribute is a C++1z extension}} +// expected-warning@11 {{use of the 'nodiscard' attribute is a C++1z extension}} +// expected-warning@25 2{{use of the 'nodiscard' attribute is a C++1z extension}} +#endif