From: Chandler Carruth Date: Fri, 27 Sep 2013 20:20:17 +0000 (+0000) Subject: Implement N3760, support for the [[deprecated]] attribute. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=998894bf0b00f310e14751003ed5eaedd8df9b4b;p=clang Implement N3760, support for the [[deprecated]] attribute. This motion appears to have consensus in the C++ committee and is expected to be voted into the C++14 draft tomorrow during the formal vote. No extension warning in C++11 as attributes not specified in the standard using the standard syntax in C++11 have implementation defined meaning, and we define the meaning proposed for C++14. There is one bug exposed as we do not warn on a deprecated template specialization. I've left a FIXME in the test case and will dig into that next. Also, I will add a few more exhaustive test cases of the other features specified for this attribute in a follow-up commit. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191550 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index 5681dafc30..740c3e499c 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -351,7 +351,8 @@ def OpenCLImageAccess : Attr { } def Deprecated : InheritableAttr { - let Spellings = [GNU<"deprecated">, CXX11<"gnu", "deprecated">]; + let Spellings = [GNU<"deprecated">, + CXX11<"gnu", "deprecated">, CXX11<"","deprecated">]; let Args = [StringArgument<"Message", 1>]; } diff --git a/test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp new file mode 100644 index 0000000000..8309219f50 --- /dev/null +++ b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c++1y -verify %s + +class [[deprecated]] C {}; // expected-note {{declared here}} +C c; // expected-warning {{'C' is deprecated}} + +typedef int t [[deprecated]]; // expected-note {{declared here}} +t x = 42; // expected-warning {{'t' is deprecated}} + +[[deprecated]] int old = 42; // expected-note {{declared here}} +int use = old; // expected-warning {{'old' is deprecated}} + +struct S { [[deprecated]] int member = 42; } s; // expected-note {{declared here}} +int use2 = s.member; // expected-warning {{'member' is deprecated}} + +[[deprecated]] int f() { return 42; } // expected-note {{declared here}} +int use3 = f(); // expected-warning {{'f' is deprecated}} + +enum [[deprecated]] e { E }; // expected-note {{declared here}} +e my_enum; // expected-warning {{'e' is deprecated}} + +template class X {}; +template <> class [[deprecated]] X {}; +X x1; +X x2; // FIXME: no warning! + +template class [[deprecated]] X2 {}; +template <> class X2 {}; +X2 x3; // FIXME: no warning! +X2 x4;