]> granicus.if.org Git - clang/commitdiff
Sema: diagnose use of unscoped deprecated prior to C++14
authorSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 16 Feb 2015 22:27:01 +0000 (22:27 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 16 Feb 2015 22:27:01 +0000 (22:27 +0000)
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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclAttr.cpp
test/Parser/cxx0x-attributes.cpp
test/SemaCXX/for-range-examples.cpp
test/SemaCXX/generalized-deprecated.cpp [new file with mode: 0644]

index d0949a2f4f8bf21128b1aaf6abec52b2e524d11a..b2cb545a0903a0661aa65f05106267d44a403671 100644 (file)
@@ -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>;
+
 // OpenCL warnings and errors.
 def err_invalid_astype_of_different_size : Error<
   "invalid reinterpretation: sizes of %0 and %1 must match">;
index 2f92d3dbb2d35a6c8f7913ac2f9f68295706b3ac..42cfd9afa019d975f3064b0dc512e578fa97bee2 100644 (file)
@@ -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<DeprecatedAttr>(S, D, Attr);
 }
 
index c68a119fc740831bac6a346aba112094f91e01c0..ab0ce192fca0b214d6f2b9e4ed0c546f8017164a 100644 (file)
@@ -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();
 }
 
index d07331c51e29ae6a3edfce780ca2087795b1f49e..f2b155ad7e582bdf2214adcfc4175b851382d24b 100644 (file)
@@ -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 (file)
index 0000000..3bb42df
--- /dev/null
@@ -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();
+