// RUN: %clang_cc1 %s -verify -fexceptions
class A {
void f() __attribute__((deprecated)); // expected-note 2 {{'f' has been explicitly marked deprecated here}}
void g(A* a);
void h(A* a) __attribute__((deprecated));
int b __attribute__((deprecated)); // expected-note 2 {{'b' has been explicitly marked deprecated here}}
};
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}}
}
void A::h(A* a)
{
f();
a->f();
(void)b;
(void)a->b;
}
struct B {
virtual void f() __attribute__((deprecated)); // expected-note 6 {{'f' has been explicitly marked deprecated here}}
void g();
};
void B::g() {
f(); // expected-warning{{'f' is deprecated}}
B::f(); // expected-warning{{'f' is deprecated}}
}
struct C : B {
virtual void f();
void g();
};
void C::g() {
f();
C::f();
B::f(); // expected-warning{{'f' is deprecated}}
}
void f(B* b, C *c) {
b->f(); // expected-warning{{'f' is deprecated}}
b->B::f(); // expected-warning{{'f' is deprecated}}
c->f();
c->C::f();
c->B::f(); // expected-warning{{'f' is deprecated}}
}
struct D {
virtual void f() __attribute__((deprecated));
virtual void f(int) __attribute__((deprecated));
virtual void f(int, int) __attribute__((deprecated));
};
void D::f() { } // expected-note{{'f' has been explicitly marked deprecated here}}
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}}
void f(D* d) {
d->f(); // expected-warning{{'f' is deprecated}}
d->f(42); // expected-warning{{'f' is deprecated}}
d->f(42, 24); // expected-warning{{'f' is deprecated}}
}
// Overloaded namespace members.
namespace test1 {
void foo(int) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
void test1() { foo(10); } // expected-warning {{deprecated}}
void foo(short) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
void test2(short s) { foo(s); } // expected-warning {{deprecated}}
void foo(long);
void test3(long l) { foo(l); }
struct A {
friend void foo(A*) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
};
void test4(A *a) { foo(a); } // expected-warning {{deprecated}}
namespace ns {
struct Foo {};
void foo(const Foo &f) __attribute__((deprecated)); // expected-note {{'foo' has been explicitly marked deprecated here}}
}
void test5() {
foo(ns::Foo()); // expected-warning {{deprecated}}
}
}
// Overloaded class members.
namespace test2 {
struct A {
void foo(int) __attribute__((deprecated)); // expected-note 2 {{'foo' has been explicitly marked deprecated here}}
void foo(long);
static void bar(int) __attribute__((deprecated)); // expected-note 3 {{'bar' has been explicitly marked deprecated here}}
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 &);
void operator*(int) __attribute__((deprecated)); // expected-note {{'operator*' has been explicitly marked deprecated here}}
void operator-(const A &) const;
};
void operator+(const A &, const A &);
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}}
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);
operator intfn() __attribute__((deprecated)); // expected-note {{'operator void (*)(int)' has been explicitly marked deprecated here}}
operator unintfn();
void operator ()(A &) __attribute__((deprecated)); // expected-note {{'operator()' has been explicitly marked deprecated here}}
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 {
operator int() __attribute__((deprecated)); // expected-note 3 {{'operator int' has been explicitly marked deprecated here}}
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)
{}
};
}
// rdar://problem/8518751
namespace test6 {
enum __attribute__((deprecated)) A { // expected-note {{'A' has been explicitly marked deprecated here}}
a0 // expected-note {{'a0' has been explicitly marked deprecated here}}
};
void testA() {
A x; // expected-warning {{'A' is deprecated}}
x = a0; // expected-warning {{'a0' is deprecated}}
}
enum B {
b0 __attribute__((deprecated)), // expected-note {{'b0' has been explicitly marked deprecated here}}
b1
};
void testB() {
B x;
x = b0; // expected-warning {{'b0' is deprecated}}
x = b1;
}
template <class T> struct C {
enum __attribute__((deprecated)) Enum { // expected-note {{'Enum' has been explicitly marked deprecated here}}
c0 // expected-note {{'c0' has been explicitly marked deprecated here}}
};
};
void testC() {
C<int>::Enum x; // expected-warning {{'Enum' is deprecated}}
x = C<int>::c0; // expected-warning {{'c0' is deprecated}}
}
template <class T> struct D {
enum Enum {
d0,
d1 __attribute__((deprecated)), // expected-note {{'d1' has been explicitly marked deprecated here}}
};
};
void testD() {
D<int>::Enum x;
x = D<int>::d0;
x = D<int>::d1; // expected-warning {{'d1' is deprecated}}
}
}
namespace test7 {
struct X {
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}}
};
void test() {
X *x = new X; // expected-warning{{'operator new' is deprecated}} expected-warning{{'operator delete' is deprecated}}
}
}
// rdar://problem/15044218
typedef struct TDS {
} TDS __attribute__((deprecated)); // expected-note {{'TDS' has been explicitly marked deprecated here}}
TDS tds; // expected-warning {{'TDS' is deprecated}}
struct TDS tds2; // no warning, attribute only applies to the typedef.