<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 16, 2015 at 2:27 PM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Mon Feb 16 16:27:01 2015<br>
New Revision: 229447<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=229447&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=229447&view=rev</a><br>
Log:<br>
Sema: diagnose use of unscoped deprecated prior to C++14<br>
<br>
The deprecated attribute was adopted as part of the C++14, however, there is a<br>
GNU version available in C++11.  When using C++ earlier than C++14, diagnose the<br>
use of the attribute without the GNU scope, but only when using the generalised<br>
attribute syntax.<br></blockquote><div><br></div><div>Thanks!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Added:<br>
    cfe/trunk/test/SemaCXX/generalized-deprecated.cpp<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
    cfe/trunk/lib/Sema/SemaDeclAttr.cpp<br>
    cfe/trunk/test/Parser/cxx0x-attributes.cpp<br>
    cfe/trunk/test/SemaCXX/for-range-examples.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=229447&r1=229446&r2=229447&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=229447&r1=229446&r2=229447&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Feb 16 16:27:01 2015<br>
@@ -7233,6 +7233,10 @@ def err_asm_naked_this_ref : Error<<br>
 def err_asm_naked_parm_ref : Error<<br>
   "parameter references not allowed in naked functions">;<br>
<br>
+def ext_use_of_attribute_is_a_cxx14_extension<br>
+    : ExtWarn<"use of the %0 attribute is a C++14 extension">,<br>
+      InGroup<CXX14>;<br></blockquote><div><br></div><div>Seems like overkill to parameterize this on the attribute name: C++14 only added a single attribute. 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.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
 // OpenCL warnings and errors.<br>
 def err_invalid_astype_of_different_size : Error<<br>
   "invalid reinterpretation: sizes of %0 and %1 must match">;<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=229447&r1=229446&r2=229447&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=229447&r1=229446&r2=229447&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon Feb 16 16:27:01 2015<br>
@@ -4254,6 +4254,13 @@ static void handleDeprecatedAttr(Sema &S<br>
       return;<br>
     }<br>
   }<br>
+<br>
+  if (!S.getLangOpts().CPlusPlus14)<br>
+    if (Attr.isCXX11Attribute() &&<br>
+        !(Attr.hasScope() && Attr.getScopeName()->isStr("gnu")))<br>
+      S.Diag(Attr.getLoc(), diag::ext_use_of_attribute_is_a_cxx14_extension)<br>
+          << Attr.getName()->getNameStart();<br>
+<br>
   handleAttrWithMessage<DeprecatedAttr>(S, D, Attr);<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/test/Parser/cxx0x-attributes.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-attributes.cpp?rev=229447&r1=229446&r2=229447&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-attributes.cpp?rev=229447&r1=229446&r2=229447&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Parser/cxx0x-attributes.cpp (original)<br>
+++ cfe/trunk/test/Parser/cxx0x-attributes.cpp Mon Feb 16 16:27:01 2015<br>
@@ -288,6 +288,7 @@ namespace arguments {<br>
   void f[[gnu::format(printf, 1, 2)]](const char*, ...);<br>
   void g() [[unknown::foo(ignore arguments for unknown attributes, even with symbols!)]]; // expected-warning {{unknown attribute 'foo' ignored}}<br>
   [[deprecated("with argument")]] int i;<br>
+  // expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}}<br>
 }<br>
<br>
 // Forbid attributes on decl specifiers.<br>
@@ -330,8 +331,12 @@ namespace GccASan {<br>
<br>
 namespace {<br>
   [[deprecated]] void bar();<br>
+  // expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}}<br>
   [[deprecated("hello")]] void baz();<br>
-  [[deprecated()]] void foo(); // expected-error {{parentheses must be omitted if 'deprecated' attribute's argument list is empty}}<br>
+  // expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}}<br>
+  [[deprecated()]] void foo();<br>
+  // expected-error@-1 {{parentheses must be omitted if 'deprecated' attribute's argument list is empty}}<br>
+  // expected-warning@-2 {{use of the deprecated attribute is a C++14 extension}}<br>
   [[gnu::deprecated()]] void quux();<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/for-range-examples.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/for-range-examples.cpp?rev=229447&r1=229446&r2=229447&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/for-range-examples.cpp?rev=229447&r1=229446&r2=229447&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/for-range-examples.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/for-range-examples.cpp Mon Feb 16 16:27:01 2015<br>
@@ -226,7 +226,7 @@ namespace test7 {<br>
     // we check the alignment attribute before we perform the auto<br>
     // deduction.<br>
     for (d alignas(1) : arr) {} // expected-error {{requires type for loop variable}}<br>
-    for (e [[deprecated]] : arr) { e = 0; } // expected-warning {{deprecated}} expected-note {{here}} expected-error {{requires type for loop variable}}<br>
+    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}}<br>
   }<br>
 }<br>
<br>
<br>
Added: cfe/trunk/test/SemaCXX/generalized-deprecated.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/generalized-deprecated.cpp?rev=229447&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/generalized-deprecated.cpp?rev=229447&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/generalized-deprecated.cpp (added)<br>
+++ cfe/trunk/test/SemaCXX/generalized-deprecated.cpp Mon Feb 16 16:27:01 2015<br>
@@ -0,0 +1,14 @@<br>
+// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-deprecated %s<br>
+<br>
+// NOTE: use -Wno-deprecated to avoid cluttering the output with deprecated<br>
+// warnings<br>
+<br>
+[[deprecated("1")]] int function_1();<br>
+// expected-warning@-1 {{use of the deprecated attribute is a C++14 extension}}<br>
+<br>
+[[gnu::deprecated("3")]] int function_3();<br>
+<br>
+int __attribute__ (( deprecated("2") )) function_2();<br>
+<br>
+__declspec(deprecated("4")) int function_4();<br>
+<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>