On Tue, Feb 17, 2015 at 3:36 AM, Richard Smith <[email protected]> wrote: > On Mon, Feb 16, 2015 at 2:27 PM, Saleem Abdulrasool <[email protected]> > wrote: >> >> Author: compnerd >> Date: Mon Feb 16 16:27:01 2015 >> New Revision: 229447 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=229447&view=rev >> Log: >> 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. > > > Thanks! > >> >> Added: >> cfe/trunk/test/SemaCXX/generalized-deprecated.cpp >> Modified: >> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> cfe/trunk/lib/Sema/SemaDeclAttr.cpp >> cfe/trunk/test/Parser/cxx0x-attributes.cpp >> cfe/trunk/test/SemaCXX/for-range-examples.cpp >> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=229447&r1=229446&r2=229447&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Feb 16 >> 16:27:01 2015 >> @@ -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<CXX14>; > > > Seems like overkill to parameterize this on the attribute name: C++14 only > added a single attribute.
My Monday brain was thinking "but this can also be parameterized for the language version too" when I suggested it to Saleem. My Tuesday brain realizes that we cannot parameterize the diagnostic group, and so I agree with you that this approach is likely overkill. > Also, the usual pattern here is to add two > warnings: ext_cxx_deprecated_attr for use of the attribute in C++11, and > warn_cxx11_compat_cxx_deprecated_attr for use of the attribute in C++14 and > later. Good catch! ~Aaron > >> + >> // OpenCL warnings and errors. >> def err_invalid_astype_of_different_size : Error< >> "invalid reinterpretation: sizes of %0 and %1 must match">; >> >> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=229447&r1=229446&r2=229447&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon Feb 16 16:27:01 2015 >> @@ -4254,6 +4254,13 @@ static void handleDeprecatedAttr(Sema &S >> 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<DeprecatedAttr>(S, D, Attr); >> } >> >> >> Modified: cfe/trunk/test/Parser/cxx0x-attributes.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-attributes.cpp?rev=229447&r1=229446&r2=229447&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Parser/cxx0x-attributes.cpp (original) >> +++ cfe/trunk/test/Parser/cxx0x-attributes.cpp Mon Feb 16 16:27:01 2015 >> @@ -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(); >> } >> >> >> Modified: cfe/trunk/test/SemaCXX/for-range-examples.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/for-range-examples.cpp?rev=229447&r1=229446&r2=229447&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/SemaCXX/for-range-examples.cpp (original) >> +++ cfe/trunk/test/SemaCXX/for-range-examples.cpp Mon Feb 16 16:27:01 2015 >> @@ -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}} >> } >> } >> >> >> Added: cfe/trunk/test/SemaCXX/generalized-deprecated.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/generalized-deprecated.cpp?rev=229447&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/SemaCXX/generalized-deprecated.cpp (added) >> +++ cfe/trunk/test/SemaCXX/generalized-deprecated.cpp Mon Feb 16 16:27:01 >> 2015 >> @@ -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(); >> + >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
