142 lines · cpp
1// RUN: %clang_cc1 -std=c++1y -verify %s2 3class [[deprecated]] C {}; // expected-note {{'C' has been explicitly marked deprecated here}}4C c; // expected-warning {{'C' is deprecated}}5 6typedef int t [[deprecated]]; // expected-note {{'t' has been explicitly marked deprecated here}}7t x = 42; // expected-warning {{'t' is deprecated}}8 9[[deprecated]] int old = 42; // expected-note {{'old' has been explicitly marked deprecated here}}10int use = old; // expected-warning {{'old' is deprecated}}11 12struct S { [[deprecated]] int member = 42; } s; // expected-note {{'member' has been explicitly marked deprecated here}}13int use2 = s.member; // expected-warning {{'member' is deprecated}}14 15[[deprecated]] int f() { return 42; } // expected-note {{'f' has been explicitly marked deprecated here}}16int use3 = f(); // expected-warning {{'f' is deprecated}}17 18enum [[deprecated]] e { E }; // expected-note {{'e' has been explicitly marked deprecated here}}19e my_enum; // expected-warning {{'e' is deprecated}}20 21template <typename T> class X {};22template <> class [[deprecated]] X<int> {}; // expected-note {{'X<int>' has been explicitly marked deprecated here}}23X<char> x1;24X<int> x2; // expected-warning {{'X<int>' is deprecated}}25 26template <typename T> class [[deprecated]] X2 {}; //expected-note {{'X2<char>' has been explicitly marked deprecated here}}27template <> class X2<int> {};28X2<char> x3; // expected-warning {{'X2<char>' is deprecated}}29X2<int> x4; // No warning, the specialization removes it.30 31template <typename T> class [[deprecated]] X3; //expected-note {{'X3<char>' has been explicitly marked deprecated here}}32template <> class X3<int>;33X3<char> *x5; // expected-warning {{'X3<char>' is deprecated}}34X3<int> *x6; // No warning, the specialization removes it.35 36template <typename T> struct A;37A<int> *p;38template <typename T> struct [[deprecated]] A;//expected-note {{'A<int>' has been explicitly marked deprecated here}} expected-note {{'A<float>' has been explicitly marked deprecated here}}39A<int> *q; // expected-warning {{'A<int>' is deprecated}}40A<float> *r; // expected-warning {{'A<float>' is deprecated}}41 42template <typename T> struct B;43B<int> *p2;44template <typename T> struct [[deprecated]] B;//expected-note {{'B<int>' has been explicitly marked deprecated here}} expected-note {{'B<float>' has been explicitly marked deprecated here}}45B<int> *q2; // expected-warning {{'B<int>' is deprecated}}46B<float> *r2; // expected-warning {{'B<float>' is deprecated}}47 48template <typename T>49T some_func(T t) {50 struct [[deprecated]] FunS{}; // expected-note {{'FunS' has been explicitly marked deprecated here}}51 FunS f;// expected-warning {{'FunS' is deprecated}}52 53}54 55template <typename T>56[[deprecated]]T some_func2(T t) {57 struct FunS2{};58 FunS2 f;// No warning, entire function is deprecated, so usage here should be fine.59 60}61 62namespace GH58547 {63struct A {64 using ta [[deprecated]] = int; // expected-note 2{{marked deprecated here}}65};66 67using t1 = typename A::ta; // expected-warning {{'ta' is deprecated}}68 69template <class B1> struct B {70 using tb = typename B1::ta; // expected-warning {{'ta' is deprecated}}71};72 73template struct B<A>; // expected-note {{requested here}}74} // namespace GH5854775 76 77namespace GH44496 {78 79 80template <typename T>81class function { };82template <typename A>83class __attribute__((deprecated)) function<void(A)> { };84// expected-note@-1 {{'function<void (int)>' has been explicitly marked deprecated here}}85 86void test() {87 [[maybe_unused]] function<void(int)> f; // expected-warning{{'function<void (int)>' is deprecated}}88}89 90template <class> struct my_template {91 using type = void;92};93 94template <class T>95struct [[deprecated("primary")]] deprecated { // #deprecated-primary-marked-here96 using type = T;97};98 99template <class T>100struct my_template<volatile T> : deprecated<T> {}; // #deprecated-primary-base101 102template <class T>103struct [[deprecated("specialization")]] my_template<const T> : deprecated<const T> {}; // #my_template-explicit-here104 105 106template <class T> using my_template_t = typename my_template<T>::type; // #deprecated-my-template-alias107 108// We cannot warn on X because no instantiation has taken place yet109using X = my_template<volatile int>;110 111// Because we already warn on the attribute on the plimary template, we ignore the attribute on the specialization112using Y = my_template_t<const int>;113// expected-warning@#deprecated-primary-base {{'deprecated<int>' is deprecated: primary}} \114// expected-note@-1 {{in instantiation of template type alias}} \115// expected-note@#deprecated-primary-marked-here {{has been explicitly marked deprecated here}}116 117using Z = my_template_t<volatile int>;118// expected-warning@#deprecated-my-template-alias {{'my_template<const int>' is deprecated: specialization}} \119// expected-note@#my_template-explicit-here {{'my_template<const int>' has been explicitly marked deprecated here}} \120// expected-note@#deprecated-my-template-alias {{in instantiation of template class 'GH44496::my_template<volatile int>' requested here}} \121// expected-note@-1 {{in instantiation of template type alias 'my_template_t' requested here}}122 123template <class T>124struct primary_not_deprecated {125 using type = T;126};127template <class T>128struct [[deprecated("specialization")]] primary_not_deprecated<volatile T> : deprecated<T> {};129// expected-note@-1 {{'primary_not_deprecated<volatile int>' has been explicitly marked deprecated here}}130 131// We cannot warn on S1 because no instantiation has taken place yet132using S1 = primary_not_deprecated<volatile int>;133 134 135using S2 = primary_not_deprecated<volatile int>;136 137X x;138Z z;139S2 s2;140// expected-warning@-1 {{'primary_not_deprecated<volatile int>' is deprecated: specialization}}141}142