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