}
def Deprecated : InheritableAttr {
- let Spellings = [GNU<"deprecated">, CXX11<"gnu", "deprecated">];
+ let Spellings = [GNU<"deprecated">,
+ CXX11<"gnu", "deprecated">, CXX11<"","deprecated">];
let Args = [StringArgument<"Message", 1>];
}
--- /dev/null
+// 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 <typename T> class X {};
+template <> class [[deprecated]] X<int> {};
+X<char> x1;
+X<int> x2; // FIXME: no warning!
+
+template <typename T> class [[deprecated]] X2 {};
+template <> class X2<int> {};
+X2<char> x3; // FIXME: no warning!
+X2<int> x4;