2013-02-12 16:08:54 +08:00
|
|
|
// RUN: %clang_cc1 %s -verify -fexceptions
|
2009-08-09 00:55:18 +08:00
|
|
|
class A {
|
2013-12-19 07:30:06 +08:00
|
|
|
void f() __attribute__((deprecated)); // expected-note 2 {{'f' has been explicitly marked deprecated here}}
|
2009-08-09 00:55:18 +08:00
|
|
|
void g(A* a);
|
2009-08-09 01:48:49 +08:00
|
|
|
void h(A* a) __attribute__((deprecated));
|
2009-08-09 00:55:18 +08:00
|
|
|
|
2013-12-19 07:30:06 +08:00
|
|
|
int b __attribute__((deprecated)); // expected-note 2 {{'b' has been explicitly marked deprecated here}}
|
2009-08-09 00:55:18 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
void A::g(A* a)
|
|
|
|
{
|
|
|
|
f(); // expected-warning{{'f' is deprecated}}
|
|
|
|
a->f(); // expected-warning{{'f' is deprecated}}
|
|
|
|
|
|
|
|
(void)b; // expected-warning{{'b' is deprecated}}
|
|
|
|
(void)a->b; // expected-warning{{'b' is deprecated}}
|
|
|
|
}
|
2009-08-09 01:48:49 +08:00
|
|
|
|
|
|
|
void A::h(A* a)
|
|
|
|
{
|
|
|
|
f();
|
|
|
|
a->f();
|
|
|
|
|
|
|
|
(void)b;
|
|
|
|
(void)a->b;
|
|
|
|
}
|
2009-09-11 04:48:14 +08:00
|
|
|
|
|
|
|
struct B {
|
2015-07-22 08:30:58 +08:00
|
|
|
virtual void f() __attribute__((deprecated)); // expected-note 6 {{'f' has been explicitly marked deprecated here}}
|
2009-09-11 13:54:14 +08:00
|
|
|
void g();
|
2009-09-11 04:48:14 +08:00
|
|
|
};
|
|
|
|
|
2009-09-11 13:54:14 +08:00
|
|
|
void B::g() {
|
2015-07-22 08:30:58 +08:00
|
|
|
f(); // expected-warning{{'f' is deprecated}}
|
2009-09-11 13:54:14 +08:00
|
|
|
B::f(); // expected-warning{{'f' is deprecated}}
|
|
|
|
}
|
|
|
|
|
2009-09-11 04:48:14 +08:00
|
|
|
struct C : B {
|
|
|
|
virtual void f();
|
2009-09-11 13:54:14 +08:00
|
|
|
void g();
|
2009-09-11 04:48:14 +08:00
|
|
|
};
|
|
|
|
|
2009-09-11 13:54:14 +08:00
|
|
|
void C::g() {
|
|
|
|
f();
|
|
|
|
C::f();
|
|
|
|
B::f(); // expected-warning{{'f' is deprecated}}
|
|
|
|
}
|
|
|
|
|
2009-09-11 04:48:14 +08:00
|
|
|
void f(B* b, C *c) {
|
2015-07-22 08:30:58 +08:00
|
|
|
b->f(); // expected-warning{{'f' is deprecated}}
|
2009-09-11 04:48:14 +08:00
|
|
|
b->B::f(); // expected-warning{{'f' is deprecated}}
|
|
|
|
|
|
|
|
c->f();
|
|
|
|
c->C::f();
|
|
|
|
c->B::f(); // expected-warning{{'f' is deprecated}}
|
|
|
|
}
|
2009-09-14 05:01:57 +08:00
|
|
|
|
|
|
|
struct D {
|
|
|
|
virtual void f() __attribute__((deprecated));
|
2015-07-23 10:54:59 +08:00
|
|
|
virtual void f(int) __attribute__((deprecated));
|
|
|
|
virtual void f(int, int) __attribute__((deprecated));
|
2009-09-14 05:01:57 +08:00
|
|
|
};
|
|
|
|
|
2015-07-22 08:30:58 +08:00
|
|
|
void D::f() { } // expected-note{{'f' has been explicitly marked deprecated here}}
|
2015-07-23 10:54:59 +08:00
|
|
|
void D::f(int v) { } // expected-note{{'f' has been explicitly marked deprecated here}}
|
|
|
|
void D::f(int v1, int v2) { } // expected-note{{'f' has been explicitly marked deprecated here}}
|
2009-09-14 05:01:57 +08:00
|
|
|
|
|
|
|
void f(D* d) {
|
2015-07-22 08:30:58 +08:00
|
|
|
d->f(); // expected-warning{{'f' is deprecated}}
|
2015-07-23 10:54:59 +08:00
|
|
|
d->f(42); // expected-warning{{'f' is deprecated}}
|
|
|
|
d->f(42, 24); // expected-warning{{'f' is deprecated}}
|
2009-09-14 05:01:57 +08:00
|
|
|
}
|
2010-05-07 02:15:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
// Overloaded namespace members.
|
|
|
|
namespace test1 {
|
2013-12-19 07:30:06 +08:00
|
|
|
void foo(int) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
void test1() { foo(10); } // expected-warning {{deprecated}}
|
2013-12-19 07:30:06 +08:00
|
|
|
void foo(short) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
void test2(short s) { foo(s); } // expected-warning {{deprecated}}
|
|
|
|
void foo(long);
|
|
|
|
void test3(long l) { foo(l); }
|
|
|
|
struct A {
|
2013-12-19 07:30:06 +08:00
|
|
|
friend void foo(A*) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
};
|
|
|
|
void test4(A *a) { foo(a); } // expected-warning {{deprecated}}
|
|
|
|
|
|
|
|
namespace ns {
|
|
|
|
struct Foo {};
|
2013-12-19 07:30:06 +08:00
|
|
|
void foo(const Foo &f) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
}
|
|
|
|
void test5() {
|
|
|
|
foo(ns::Foo()); // expected-warning {{deprecated}}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Overloaded class members.
|
|
|
|
namespace test2 {
|
|
|
|
struct A {
|
2013-12-19 07:30:06 +08:00
|
|
|
void foo(int) __attribute__((deprecated)); // expected-note 2 {{'foo' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
void foo(long);
|
2013-12-19 07:30:06 +08:00
|
|
|
static void bar(int) __attribute__((deprecated)); // expected-note 3 {{'bar' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
static void bar(long);
|
|
|
|
|
|
|
|
void test2(int i, long l);
|
|
|
|
};
|
|
|
|
void test1(int i, long l) {
|
|
|
|
A a;
|
|
|
|
a.foo(i); // expected-warning {{deprecated}}
|
|
|
|
a.foo(l);
|
|
|
|
a.bar(i); // expected-warning {{deprecated}}
|
|
|
|
a.bar(l);
|
|
|
|
A::bar(i); // expected-warning {{deprecated}}
|
|
|
|
A::bar(l);
|
|
|
|
}
|
|
|
|
|
|
|
|
void A::test2(int i, long l) {
|
|
|
|
foo(i); // expected-warning {{deprecated}}
|
|
|
|
foo(l);
|
|
|
|
bar(i); // expected-warning {{deprecated}}
|
|
|
|
bar(l);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Overloaded operators.
|
|
|
|
namespace test3 {
|
|
|
|
struct A {
|
|
|
|
void operator*(const A &);
|
2013-12-19 07:30:06 +08:00
|
|
|
void operator*(int) __attribute__((deprecated)); // expected-note {{'operator*' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
void operator-(const A &) const;
|
|
|
|
};
|
|
|
|
void operator+(const A &, const A &);
|
2013-12-19 07:30:06 +08:00
|
|
|
void operator+(const A &, int) __attribute__((deprecated)); // expected-note {{'operator+' has been explicitly marked deprecated here}}
|
|
|
|
void operator-(const A &, int) __attribute__((deprecated)); // expected-note {{'operator-' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
|
|
|
|
void test() {
|
|
|
|
A a, b;
|
|
|
|
a + b;
|
|
|
|
a + 1; // expected-warning {{deprecated}}
|
|
|
|
a - b;
|
|
|
|
a - 1; // expected-warning {{deprecated}}
|
|
|
|
a * b;
|
|
|
|
a * 1; // expected-warning {{deprecated}}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Overloaded operator call.
|
|
|
|
namespace test4 {
|
|
|
|
struct A {
|
|
|
|
typedef void (*intfn)(int);
|
|
|
|
typedef void (*unintfn)(unsigned);
|
2013-12-19 07:30:06 +08:00
|
|
|
operator intfn() __attribute__((deprecated)); // expected-note {{'operator void (*)(int)' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
operator unintfn();
|
2013-12-19 07:30:06 +08:00
|
|
|
void operator ()(A &) __attribute__((deprecated)); // expected-note {{'operator()' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
void operator ()(const A &);
|
|
|
|
};
|
|
|
|
|
|
|
|
void test() {
|
|
|
|
A a;
|
|
|
|
a(1); // expected-warning {{deprecated}}
|
|
|
|
a(1U);
|
|
|
|
|
|
|
|
A &b = a;
|
|
|
|
const A &c = a;
|
|
|
|
a(b); // expected-warning {{deprecated}}
|
|
|
|
a(c);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace test5 {
|
|
|
|
struct A {
|
2013-12-19 07:30:06 +08:00
|
|
|
operator int() __attribute__((deprecated)); // expected-note 3 {{'operator int' has been explicitly marked deprecated here}}
|
2010-05-07 02:15:07 +08:00
|
|
|
operator long();
|
|
|
|
};
|
|
|
|
void test1(A a) {
|
|
|
|
int i = a; // expected-warning {{deprecated}}
|
|
|
|
long l = a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void foo(int);
|
|
|
|
void foo(void*);
|
|
|
|
void bar(long);
|
|
|
|
void bar(void*);
|
|
|
|
void test2(A a) {
|
|
|
|
foo(a); // expected-warning {{deprecated}}
|
|
|
|
bar(a);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct B {
|
|
|
|
int myInt;
|
|
|
|
long myLong;
|
|
|
|
|
|
|
|
B(A &a) :
|
|
|
|
myInt(a), // expected-warning {{deprecated}}
|
|
|
|
myLong(a)
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
}
|
2010-10-23 07:36:17 +08:00
|
|
|
|
|
|
|
// rdar://problem/8518751
|
|
|
|
namespace test6 {
|
2013-12-19 07:30:06 +08:00
|
|
|
enum __attribute__((deprecated)) A { // expected-note {{'A' has been explicitly marked deprecated here}}
|
|
|
|
a0 // expected-note {{'a0' has been explicitly marked deprecated here}}
|
2010-10-23 07:36:17 +08:00
|
|
|
};
|
|
|
|
void testA() {
|
|
|
|
A x; // expected-warning {{'A' is deprecated}}
|
2011-11-29 03:45:58 +08:00
|
|
|
x = a0; // expected-warning {{'a0' is deprecated}}
|
2010-10-23 07:36:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
enum B {
|
2013-12-19 07:30:06 +08:00
|
|
|
b0 __attribute__((deprecated)), // expected-note {{'b0' has been explicitly marked deprecated here}}
|
2010-10-23 07:36:17 +08:00
|
|
|
b1
|
|
|
|
};
|
|
|
|
void testB() {
|
|
|
|
B x;
|
|
|
|
x = b0; // expected-warning {{'b0' is deprecated}}
|
|
|
|
x = b1;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T> struct C {
|
2013-12-19 07:30:06 +08:00
|
|
|
enum __attribute__((deprecated)) Enum { // expected-note {{'Enum' has been explicitly marked deprecated here}}
|
|
|
|
c0 // expected-note {{'c0' has been explicitly marked deprecated here}}
|
2010-10-23 07:36:17 +08:00
|
|
|
};
|
|
|
|
};
|
|
|
|
void testC() {
|
|
|
|
C<int>::Enum x; // expected-warning {{'Enum' is deprecated}}
|
2011-11-29 03:45:58 +08:00
|
|
|
x = C<int>::c0; // expected-warning {{'c0' is deprecated}}
|
2010-10-23 07:36:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class T> struct D {
|
|
|
|
enum Enum {
|
|
|
|
d0,
|
2013-12-19 07:30:06 +08:00
|
|
|
d1 __attribute__((deprecated)), // expected-note {{'d1' has been explicitly marked deprecated here}}
|
2010-10-23 07:36:17 +08:00
|
|
|
};
|
|
|
|
};
|
|
|
|
void testD() {
|
|
|
|
D<int>::Enum x;
|
|
|
|
x = D<int>::d0;
|
|
|
|
x = D<int>::d1; // expected-warning {{'d1' is deprecated}}
|
|
|
|
}
|
|
|
|
}
|
2013-02-12 16:08:54 +08:00
|
|
|
|
|
|
|
namespace test7 {
|
|
|
|
struct X {
|
2013-12-19 07:30:06 +08:00
|
|
|
void* operator new(typeof(sizeof(void*))) __attribute__((deprecated)); // expected-note{{'operator new' has been explicitly marked deprecated here}}
|
|
|
|
void operator delete(void *) __attribute__((deprecated)); // expected-note{{'operator delete' has been explicitly marked deprecated here}}
|
2013-02-12 16:08:54 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
void test() {
|
|
|
|
X *x = new X; // expected-warning{{'operator new' is deprecated}} expected-warning{{'operator delete' is deprecated}}
|
|
|
|
}
|
|
|
|
}
|
2013-10-08 08:19:09 +08:00
|
|
|
|
|
|
|
// rdar://problem/15044218
|
|
|
|
typedef struct TDS {
|
2013-12-19 07:30:06 +08:00
|
|
|
} TDS __attribute__((deprecated)); // expected-note {{'TDS' has been explicitly marked deprecated here}}
|
2013-10-08 08:19:09 +08:00
|
|
|
TDS tds; // expected-warning {{'TDS' is deprecated}}
|
|
|
|
struct TDS tds2; // no warning, attribute only applies to the typedef.
|