[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaTemplate / alias-template-deprecated.cpp
blob7418e222bcfc5364b17b683c8a0d89bd134574ad
1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2 //
3 // This test checks that a deprecated attribute on an alias
4 // template triggers a warning diagnostic when it is used.
6 template <typename T>
7 struct NoAttr {
8 void foo() {}
9 };
11 // expected-note@+2 7{{'UsingWithAttr' has been explicitly marked deprecated here}}
12 template <typename T>
13 using UsingWithAttr __attribute__((deprecated)) = NoAttr<T>;
15 // expected-note@+1 {{'UsingInstWithAttr' has been explicitly marked deprecated here}}
16 using UsingInstWithAttr __attribute__((deprecated)) = NoAttr<int>;
18 // expected-note@+1 {{'TDWithAttr' has been explicitly marked deprecated here}}
19 typedef NoAttr<int> TDWithAttr __attribute__((deprecated));
21 // expected-warning@+1 {{'UsingWithAttr' is deprecated}}
22 typedef UsingWithAttr<int> TDUsingWithAttr;
24 typedef NoAttr<int> TDNoAttr;
26 // expected-note@+1 {{'UsingTDWithAttr' has been explicitly marked deprecated here}}
27 using UsingTDWithAttr __attribute__((deprecated)) = TDNoAttr;
29 struct S {
30 NoAttr<float> f1;
31 // expected-warning@+1 {{'UsingWithAttr' is deprecated}}
32 UsingWithAttr<float> f2;
35 // expected-warning@+1 {{'UsingWithAttr' is deprecated}}
36 void foo(NoAttr<short> s1, UsingWithAttr<short> s2) {
39 // expected-note@+2 {{'UsingWithCPPAttr' has been explicitly marked deprecated here}}
40 template <typename T>
41 using UsingWithCPPAttr [[deprecated]] = NoAttr<T>;
43 // expected-note@+1 {{'UsingInstWithCPPAttr' has been explicitly marked deprecated here}}
44 using UsingInstWithCPPAttr [[deprecated("Do not use this")]] = NoAttr<int>;
46 void bar() {
47 NoAttr<int> obj; // Okay
49 // expected-warning@+2 {{'UsingWithAttr' is deprecated}}
50 // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
51 UsingWithAttr<int> objUsingWA;
53 // expected-warning@+2 {{'UsingWithAttr' is deprecated}}
54 // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
55 NoAttr<UsingWithAttr<int>> s;
57 // expected-note@+1 {{'DepInt' has been explicitly marked deprecated here}}
58 using DepInt [[deprecated]] = int;
59 // expected-warning@+3 {{'UsingWithAttr' is deprecated}}
60 // expected-warning@+2 {{'DepInt' is deprecated}}
61 // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
62 using X = UsingWithAttr<DepInt>;
64 // expected-warning@+2 {{'UsingWithAttr' is deprecated}}
65 // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
66 UsingWithAttr<int>().foo();
68 // expected-warning@+1 {{'UsingInstWithAttr' is deprecated}}
69 UsingInstWithAttr objUIWA;
71 // expected-warning@+1 {{'TDWithAttr' is deprecated}}
72 TDWithAttr objTDWA;
74 // expected-warning@+1 {{'UsingTDWithAttr' is deprecated}}
75 UsingTDWithAttr objUTDWA;
77 // expected-warning@+2 {{'UsingWithCPPAttr' is deprecated}}
78 // expected-note@+1 {{in instantiation of template type alias 'UsingWithCPPAttr' requested here}}
79 UsingWithCPPAttr<int> objUsingWCPPA;
81 // expected-warning@+1 {{'UsingInstWithCPPAttr' is deprecated: Do not use this}}
82 UsingInstWithCPPAttr objUICPPWA;