From: Saleem Abdulrasool Date: Mon, 16 Feb 2015 22:27:01 +0000 (+0000) Subject: Sema: diagnose use of unscoped deprecated prior to C++14 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ac03901885ef7bc902fc888a2ca3dd86281e56bf;p=clang Sema: diagnose use of unscoped deprecated prior to C++14 The deprecated attribute was adopted as part of the C++14, however, there is a GNU version available in C++11. When using C++ earlier than C++14, diagnose the use of the attribute without the GNU scope, but only when using the generalised attribute syntax. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229447 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index d0949a2f4f..b2cb545a09 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -7233,6 +7233,10 @@ def err_asm_naked_this_ref : Error< def err_asm_naked_parm_ref : Error< "parameter references not allowed in naked functions">; +def ext_use_of_attribute_is_a_cxx14_extension + : ExtWarn<"use of the %0 attribute is a C++14 extension">, + InGroup; + // OpenCL warnings and errors. def err_invalid_astype_of_different_size : Error< "invalid reinterpretation: sizes of %0 and %1 must match">; diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 2f92d3dbb2..42cfd9afa0 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -4254,6 +4254,13 @@ static void handleDeprecatedAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } } + + if (!S.getLangOpts().CPlusPlus14) + if (Attr.isCXX11Attribute() && + !(Attr.hasScope() && Attr.getScopeName()->isStr("gnu"))) + S.Diag(Attr.getLoc(), diag::ext_use_of_attribute_is_a_cxx14_extension) + << Attr.getName()->getNameStart(); + handleAttrWithMessage(S, D, Attr); } diff --git a/test/Parser/cxx0x-attributes.cpp b/test/Parser/cxx0x-attributes.cpp index c68a119fc7..ab0ce192fc 100644 --- a/test/Parser/cxx0x-attributes.cpp +++ b/test/Parser/cxx0x-attributes.cpp @@ -288,6 +288,7 @@ namespace arguments { void f[[gnu::format(printf, 1, 2)]](const char*, ...); void g() [[unknown::foo(ignore arguments for unknown attributes, even with symbols!)]]; // expected-warning {{unknown attribute 'foo' ignored}} [[deprecated("with argument")]] int i; + // expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}} } // Forbid attributes on decl specifiers. @@ -330,8 +331,12 @@ namespace GccASan { namespace { [[deprecated]] void bar(); + // expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}} [[deprecated("hello")]] void baz(); - [[deprecated()]] void foo(); // expected-error {{parentheses must be omitted if 'deprecated' attribute's argument list is empty}} + // expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}} + [[deprecated()]] void foo(); + // expected-error@-1 {{parentheses must be omitted if 'deprecated' attribute's argument list is empty}} + // expected-warning@-2 {{use of the deprecated attribute is a C++14 extension}} [[gnu::deprecated()]] void quux(); } diff --git a/test/SemaCXX/for-range-examples.cpp b/test/SemaCXX/for-range-examples.cpp index d07331c51e..f2b155ad7e 100644 --- a/test/SemaCXX/for-range-examples.cpp +++ b/test/SemaCXX/for-range-examples.cpp @@ -226,7 +226,7 @@ namespace test7 { // we check the alignment attribute before we perform the auto // deduction. for (d alignas(1) : arr) {} // expected-error {{requires type for loop variable}} - for (e [[deprecated]] : arr) { e = 0; } // expected-warning {{deprecated}} expected-note {{here}} expected-error {{requires type for loop variable}} + for (e [[deprecated]] : arr) { e = 0; } // expected-warning{{use of the deprecated attribute is a C++14 extension}} expected-warning {{deprecated}} expected-note {{here}} expected-error {{requires type for loop variable}} } } diff --git a/test/SemaCXX/generalized-deprecated.cpp b/test/SemaCXX/generalized-deprecated.cpp new file mode 100644 index 0000000000..3bb42df499 --- /dev/null +++ b/test/SemaCXX/generalized-deprecated.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-deprecated %s + +// NOTE: use -Wno-deprecated to avoid cluttering the output with deprecated +// warnings + +[[deprecated("1")]] int function_1(); +// expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}} + +[[gnu::deprecated("3")]] int function_3(); + +int __attribute__ (( deprecated("2") )) function_2(); + +__declspec(deprecated("4")) int function_4(); +