summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2015-02-16 22:27:01 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2015-02-16 22:27:01 +0000
commitf931a3896ed409b890ee573a947af1b8db9109af (patch)
tree3d1bc5c7282605ff573571a06921c66c6c5151b0
parent9c8d77794bae4af323898c7f22cc9c09391b9a47 (diff)
downloadbcm5719-llvm-f931a3896ed409b890ee573a947af1b8db9109af.tar.gz
bcm5719-llvm-f931a3896ed409b890ee573a947af1b8db9109af.zip
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. llvm-svn: 229447
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp7
-rw-r--r--clang/test/Parser/cxx0x-attributes.cpp7
-rw-r--r--clang/test/SemaCXX/for-range-examples.cpp2
-rw-r--r--clang/test/SemaCXX/generalized-deprecated.cpp14
5 files changed, 32 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d0949a2f4f8..b2cb545a090 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/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<CXX14>;
+
// OpenCL warnings and errors.
def err_invalid_astype_of_different_size : Error<
"invalid reinterpretation: sizes of %0 and %1 must match">;
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 2f92d3dbb2d..42cfd9afa01 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/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<DeprecatedAttr>(S, D, Attr);
}
diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
index c68a119fc74..ab0ce192fca 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/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/clang/test/SemaCXX/for-range-examples.cpp b/clang/test/SemaCXX/for-range-examples.cpp
index d07331c51e2..f2b155ad7e5 100644
--- a/clang/test/SemaCXX/for-range-examples.cpp
+++ b/clang/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/clang/test/SemaCXX/generalized-deprecated.cpp b/clang/test/SemaCXX/generalized-deprecated.cpp
new file mode 100644
index 00000000000..3bb42df499a
--- /dev/null
+++ b/clang/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();
+
OpenPOWER on IntegriCloud