xref: /aosp_15_r20/external/clang/test/SemaCXX/attr-deprecated.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -verify -fexceptions
2*67e74705SXin Li class A {
3*67e74705SXin Li   void f() __attribute__((deprecated)); // expected-note 2 {{'f' has been explicitly marked deprecated here}}
4*67e74705SXin Li   void g(A* a);
5*67e74705SXin Li   void h(A* a) __attribute__((deprecated));
6*67e74705SXin Li 
7*67e74705SXin Li   int b __attribute__((deprecated)); // expected-note 2 {{'b' has been explicitly marked deprecated here}}
8*67e74705SXin Li };
9*67e74705SXin Li 
g(A * a)10*67e74705SXin Li void A::g(A* a)
11*67e74705SXin Li {
12*67e74705SXin Li   f(); // expected-warning{{'f' is deprecated}}
13*67e74705SXin Li   a->f(); // expected-warning{{'f' is deprecated}}
14*67e74705SXin Li 
15*67e74705SXin Li   (void)b; // expected-warning{{'b' is deprecated}}
16*67e74705SXin Li   (void)a->b; // expected-warning{{'b' is deprecated}}
17*67e74705SXin Li }
18*67e74705SXin Li 
h(A * a)19*67e74705SXin Li void A::h(A* a)
20*67e74705SXin Li {
21*67e74705SXin Li   f();
22*67e74705SXin Li   a->f();
23*67e74705SXin Li 
24*67e74705SXin Li   (void)b;
25*67e74705SXin Li   (void)a->b;
26*67e74705SXin Li }
27*67e74705SXin Li 
28*67e74705SXin Li struct B {
29*67e74705SXin Li   virtual void f() __attribute__((deprecated)); // expected-note 6 {{'f' has been explicitly marked deprecated here}}
30*67e74705SXin Li   void g();
31*67e74705SXin Li };
32*67e74705SXin Li 
g()33*67e74705SXin Li void B::g() {
34*67e74705SXin Li   f(); // expected-warning{{'f' is deprecated}}
35*67e74705SXin Li   B::f(); // expected-warning{{'f' is deprecated}}
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li struct C : B {
39*67e74705SXin Li   virtual void f();
40*67e74705SXin Li   void g();
41*67e74705SXin Li };
42*67e74705SXin Li 
g()43*67e74705SXin Li void C::g() {
44*67e74705SXin Li   f();
45*67e74705SXin Li   C::f();
46*67e74705SXin Li   B::f(); // expected-warning{{'f' is deprecated}}
47*67e74705SXin Li }
48*67e74705SXin Li 
f(B * b,C * c)49*67e74705SXin Li void f(B* b, C *c) {
50*67e74705SXin Li   b->f(); // expected-warning{{'f' is deprecated}}
51*67e74705SXin Li   b->B::f(); // expected-warning{{'f' is deprecated}}
52*67e74705SXin Li 
53*67e74705SXin Li   c->f();
54*67e74705SXin Li   c->C::f();
55*67e74705SXin Li   c->B::f(); // expected-warning{{'f' is deprecated}}
56*67e74705SXin Li }
57*67e74705SXin Li 
58*67e74705SXin Li struct D {
59*67e74705SXin Li   virtual void f() __attribute__((deprecated));
60*67e74705SXin Li   virtual void f(int) __attribute__((deprecated));
61*67e74705SXin Li   virtual void f(int, int) __attribute__((deprecated));
62*67e74705SXin Li };
63*67e74705SXin Li 
f()64*67e74705SXin Li void D::f() { } // expected-note{{'f' has been explicitly marked deprecated here}}
f(int v)65*67e74705SXin Li void D::f(int v) { } // expected-note{{'f' has been explicitly marked deprecated here}}
f(int v1,int v2)66*67e74705SXin Li void D::f(int v1, int v2) { } // expected-note{{'f' has been explicitly marked deprecated here}}
67*67e74705SXin Li 
f(D * d)68*67e74705SXin Li void f(D* d) {
69*67e74705SXin Li   d->f(); // expected-warning{{'f' is deprecated}}
70*67e74705SXin Li   d->f(42); // expected-warning{{'f' is deprecated}}
71*67e74705SXin Li   d->f(42, 24); // expected-warning{{'f' is deprecated}}
72*67e74705SXin Li }
73*67e74705SXin Li 
74*67e74705SXin Li 
75*67e74705SXin Li // Overloaded namespace members.
76*67e74705SXin Li namespace test1 {
77*67e74705SXin Li   void foo(int) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
test1()78*67e74705SXin Li   void test1() { foo(10); } // expected-warning {{deprecated}}
79*67e74705SXin Li   void foo(short) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
test2(short s)80*67e74705SXin Li   void test2(short s) { foo(s); } // expected-warning {{deprecated}}
81*67e74705SXin Li   void foo(long);
test3(long l)82*67e74705SXin Li   void test3(long l) { foo(l); }
83*67e74705SXin Li   struct A {
84*67e74705SXin Li     friend void foo(A*) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
85*67e74705SXin Li   };
test4(A * a)86*67e74705SXin Li   void test4(A *a) { foo(a); } // expected-warning {{deprecated}}
87*67e74705SXin Li 
88*67e74705SXin Li   namespace ns {
89*67e74705SXin Li     struct Foo {};
90*67e74705SXin Li     void foo(const Foo &f) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
91*67e74705SXin Li   }
test5()92*67e74705SXin Li   void test5() {
93*67e74705SXin Li     foo(ns::Foo()); // expected-warning {{deprecated}}
94*67e74705SXin Li   }
95*67e74705SXin Li }
96*67e74705SXin Li 
97*67e74705SXin Li // Overloaded class members.
98*67e74705SXin Li namespace test2 {
99*67e74705SXin Li   struct A {
100*67e74705SXin Li     void foo(int) __attribute__((deprecated)); // expected-note 2 {{'foo' has been explicitly marked deprecated here}}
101*67e74705SXin Li     void foo(long);
102*67e74705SXin Li     static void bar(int) __attribute__((deprecated)); // expected-note 3 {{'bar' has been explicitly marked deprecated here}}
103*67e74705SXin Li     static void bar(long);
104*67e74705SXin Li 
105*67e74705SXin Li     void test2(int i, long l);
106*67e74705SXin Li   };
test1(int i,long l)107*67e74705SXin Li   void test1(int i, long l) {
108*67e74705SXin Li     A a;
109*67e74705SXin Li     a.foo(i); // expected-warning {{deprecated}}
110*67e74705SXin Li     a.foo(l);
111*67e74705SXin Li     a.bar(i); // expected-warning {{deprecated}}
112*67e74705SXin Li     a.bar(l);
113*67e74705SXin Li     A::bar(i); // expected-warning {{deprecated}}
114*67e74705SXin Li     A::bar(l);
115*67e74705SXin Li   }
116*67e74705SXin Li 
test2(int i,long l)117*67e74705SXin Li   void A::test2(int i, long l) {
118*67e74705SXin Li     foo(i); // expected-warning {{deprecated}}
119*67e74705SXin Li     foo(l);
120*67e74705SXin Li     bar(i); // expected-warning {{deprecated}}
121*67e74705SXin Li     bar(l);
122*67e74705SXin Li   }
123*67e74705SXin Li }
124*67e74705SXin Li 
125*67e74705SXin Li // Overloaded operators.
126*67e74705SXin Li namespace test3 {
127*67e74705SXin Li   struct A {
128*67e74705SXin Li     void operator*(const A &);
129*67e74705SXin Li     void operator*(int) __attribute__((deprecated)); // expected-note {{'operator*' has been explicitly marked deprecated here}}
130*67e74705SXin Li     void operator-(const A &) const;
131*67e74705SXin Li   };
132*67e74705SXin Li   void operator+(const A &, const A &);
133*67e74705SXin Li   void operator+(const A &, int) __attribute__((deprecated)); // expected-note {{'operator+' has been explicitly marked deprecated here}}
134*67e74705SXin Li   void operator-(const A &, int) __attribute__((deprecated)); // expected-note {{'operator-' has been explicitly marked deprecated here}}
135*67e74705SXin Li 
test()136*67e74705SXin Li   void test() {
137*67e74705SXin Li     A a, b;
138*67e74705SXin Li     a + b;
139*67e74705SXin Li     a + 1; // expected-warning {{deprecated}}
140*67e74705SXin Li     a - b;
141*67e74705SXin Li     a - 1; // expected-warning {{deprecated}}
142*67e74705SXin Li     a * b;
143*67e74705SXin Li     a * 1; // expected-warning {{deprecated}}
144*67e74705SXin Li   }
145*67e74705SXin Li }
146*67e74705SXin Li 
147*67e74705SXin Li // Overloaded operator call.
148*67e74705SXin Li namespace test4 {
149*67e74705SXin Li   struct A {
150*67e74705SXin Li     typedef void (*intfn)(int);
151*67e74705SXin Li     typedef void (*unintfn)(unsigned);
152*67e74705SXin Li     operator intfn() __attribute__((deprecated)); // expected-note {{'operator void (*)(int)' has been explicitly marked deprecated here}}
153*67e74705SXin Li     operator unintfn();
154*67e74705SXin Li     void operator ()(A &) __attribute__((deprecated)); // expected-note {{'operator()' has been explicitly marked deprecated here}}
155*67e74705SXin Li     void operator ()(const A &);
156*67e74705SXin Li   };
157*67e74705SXin Li 
test()158*67e74705SXin Li   void test() {
159*67e74705SXin Li     A a;
160*67e74705SXin Li     a(1); // expected-warning {{deprecated}}
161*67e74705SXin Li     a(1U);
162*67e74705SXin Li 
163*67e74705SXin Li     A &b = a;
164*67e74705SXin Li     const A &c = a;
165*67e74705SXin Li     a(b); // expected-warning {{deprecated}}
166*67e74705SXin Li     a(c);
167*67e74705SXin Li   }
168*67e74705SXin Li }
169*67e74705SXin Li 
170*67e74705SXin Li namespace test5 {
171*67e74705SXin Li   struct A {
172*67e74705SXin Li     operator int() __attribute__((deprecated)); // expected-note 3 {{'operator int' has been explicitly marked deprecated here}}
173*67e74705SXin Li     operator long();
174*67e74705SXin Li   };
test1(A a)175*67e74705SXin Li   void test1(A a) {
176*67e74705SXin Li     int i = a; // expected-warning {{deprecated}}
177*67e74705SXin Li     long l = a;
178*67e74705SXin Li   }
179*67e74705SXin Li 
180*67e74705SXin Li   void foo(int);
181*67e74705SXin Li   void foo(void*);
182*67e74705SXin Li   void bar(long);
183*67e74705SXin Li   void bar(void*);
test2(A a)184*67e74705SXin Li   void test2(A a) {
185*67e74705SXin Li     foo(a); // expected-warning {{deprecated}}
186*67e74705SXin Li     bar(a);
187*67e74705SXin Li   }
188*67e74705SXin Li 
189*67e74705SXin Li   struct B {
190*67e74705SXin Li     int myInt;
191*67e74705SXin Li     long myLong;
192*67e74705SXin Li 
Btest5::B193*67e74705SXin Li     B(A &a) :
194*67e74705SXin Li       myInt(a), // expected-warning {{deprecated}}
195*67e74705SXin Li       myLong(a)
196*67e74705SXin Li     {}
197*67e74705SXin Li   };
198*67e74705SXin Li }
199*67e74705SXin Li 
200*67e74705SXin Li // rdar://problem/8518751
201*67e74705SXin Li namespace test6 {
202*67e74705SXin Li   enum __attribute__((deprecated)) A { // expected-note {{'A' has been explicitly marked deprecated here}}
203*67e74705SXin Li     a0 // expected-note {{'a0' has been explicitly marked deprecated here}}
204*67e74705SXin Li   };
testA()205*67e74705SXin Li   void testA() {
206*67e74705SXin Li     A x; // expected-warning {{'A' is deprecated}}
207*67e74705SXin Li     x = a0; // expected-warning {{'a0' is deprecated}}
208*67e74705SXin Li   }
209*67e74705SXin Li 
210*67e74705SXin Li   enum B {
211*67e74705SXin Li     b0 __attribute__((deprecated)), // expected-note {{'b0' has been explicitly marked deprecated here}}
212*67e74705SXin Li     b1
213*67e74705SXin Li   };
testB()214*67e74705SXin Li   void testB() {
215*67e74705SXin Li     B x;
216*67e74705SXin Li     x = b0; // expected-warning {{'b0' is deprecated}}
217*67e74705SXin Li     x = b1;
218*67e74705SXin Li   }
219*67e74705SXin Li 
220*67e74705SXin Li   template <class T> struct C {
221*67e74705SXin Li     enum __attribute__((deprecated)) Enum { // expected-note {{'Enum' has been explicitly marked deprecated here}}
222*67e74705SXin Li       c0 // expected-note {{'c0' has been explicitly marked deprecated here}}
223*67e74705SXin Li     };
224*67e74705SXin Li   };
testC()225*67e74705SXin Li   void testC() {
226*67e74705SXin Li     C<int>::Enum x; // expected-warning {{'Enum' is deprecated}}
227*67e74705SXin Li     x = C<int>::c0; // expected-warning {{'c0' is deprecated}}
228*67e74705SXin Li   }
229*67e74705SXin Li 
230*67e74705SXin Li   template <class T> struct D {
231*67e74705SXin Li     enum Enum {
232*67e74705SXin Li       d0,
233*67e74705SXin Li       d1 __attribute__((deprecated)), // expected-note {{'d1' has been explicitly marked deprecated here}}
234*67e74705SXin Li     };
235*67e74705SXin Li   };
testD()236*67e74705SXin Li   void testD() {
237*67e74705SXin Li     D<int>::Enum x;
238*67e74705SXin Li     x = D<int>::d0;
239*67e74705SXin Li     x = D<int>::d1; // expected-warning {{'d1' is deprecated}}
240*67e74705SXin Li   }
241*67e74705SXin Li }
242*67e74705SXin Li 
243*67e74705SXin Li namespace test7 {
244*67e74705SXin Li   struct X {
245*67e74705SXin Li     void* operator new(typeof(sizeof(void*))) __attribute__((deprecated));  // expected-note{{'operator new' has been explicitly marked deprecated here}}
246*67e74705SXin Li     void operator delete(void *) __attribute__((deprecated));  // expected-note{{'operator delete' has been explicitly marked deprecated here}}
247*67e74705SXin Li   };
248*67e74705SXin Li 
test()249*67e74705SXin Li   void test() {
250*67e74705SXin Li     X *x = new X;  // expected-warning{{'operator new' is deprecated}} expected-warning{{'operator delete' is deprecated}}
251*67e74705SXin Li   }
252*67e74705SXin Li }
253*67e74705SXin Li 
254*67e74705SXin Li // rdar://problem/15044218
255*67e74705SXin Li typedef struct TDS {
256*67e74705SXin Li } TDS __attribute__((deprecated)); // expected-note {{'TDS' has been explicitly marked deprecated here}}
257*67e74705SXin Li TDS tds; // expected-warning {{'TDS' is deprecated}}
258*67e74705SXin Li struct TDS tds2; // no warning, attribute only applies to the typedef.
259