xref: /llvm-project/clang/test/SemaTemplate/alias-template-deprecated.cpp (revision d8e0b0d6854757c4fc0c120995cf76457c347a1e)
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.
5 
6 template <typename T>
7 struct NoAttr {
8   void foo() {}
9 };
10 
11 // expected-note@+2 7{{'UsingWithAttr' has been explicitly marked deprecated here}}
12 template <typename T>
13 using UsingWithAttr __attribute__((deprecated)) = NoAttr<T>;
14 
15 // expected-note@+1 {{'UsingInstWithAttr' has been explicitly marked deprecated here}}
16 using UsingInstWithAttr __attribute__((deprecated)) = NoAttr<int>;
17 
18 // expected-note@+1 {{'TDWithAttr' has been explicitly marked deprecated here}}
19 typedef NoAttr<int> TDWithAttr __attribute__((deprecated));
20 
21 // expected-warning@+1 {{'UsingWithAttr' is deprecated}}
22 typedef UsingWithAttr<int> TDUsingWithAttr;
23 
24 typedef NoAttr<int> TDNoAttr;
25 
26 // expected-note@+1 {{'UsingTDWithAttr' has been explicitly marked deprecated here}}
27 using UsingTDWithAttr __attribute__((deprecated)) = TDNoAttr;
28 
29 struct S {
30   NoAttr<float> f1;
31   // expected-warning@+1 {{'UsingWithAttr' is deprecated}}
32   UsingWithAttr<float> f2;
33 };
34 
35 // expected-warning@+1 {{'UsingWithAttr' is deprecated}}
36 void foo(NoAttr<short> s1, UsingWithAttr<short> s2) {
37 }
38 
39 // expected-note@+2 {{'UsingWithCPPAttr' has been explicitly marked deprecated here}}
40 template <typename T>
41 using UsingWithCPPAttr [[deprecated]] = NoAttr<T>;
42 
43 // expected-note@+1 {{'UsingInstWithCPPAttr' has been explicitly marked deprecated here}}
44 using UsingInstWithCPPAttr [[deprecated("Do not use this")]] = NoAttr<int>;
45 
46 void bar() {
47   NoAttr<int> obj; // Okay
48 
49   // expected-warning@+2 {{'UsingWithAttr' is deprecated}}
50   // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
51   UsingWithAttr<int> objUsingWA;
52 
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;
56 
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>;
63 
64   // expected-warning@+2 {{'UsingWithAttr' is deprecated}}
65   // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
66   UsingWithAttr<int>().foo();
67 
68   // expected-warning@+1 {{'UsingInstWithAttr' is deprecated}}
69   UsingInstWithAttr objUIWA;
70 
71   // expected-warning@+1 {{'TDWithAttr' is deprecated}}
72   TDWithAttr objTDWA;
73 
74   // expected-warning@+1 {{'UsingTDWithAttr' is deprecated}}
75   UsingTDWithAttr objUTDWA;
76 
77   // expected-warning@+2 {{'UsingWithCPPAttr' is deprecated}}
78   // expected-note@+1 {{in instantiation of template type alias 'UsingWithCPPAttr' requested here}}
79   UsingWithCPPAttr<int> objUsingWCPPA;
80 
81   // expected-warning@+1 {{'UsingInstWithCPPAttr' is deprecated: Do not use this}}
82   UsingInstWithCPPAttr objUICPPWA;
83 }
84