| // 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));// expected-note{{'f' has been explicitly marked deprecated here}} |
| virtual void f(int) __attribute__((deprecated));// expected-note{{'f' has been explicitly marked deprecated here}} |
| virtual void f(int, int) __attribute__((deprecated));// expected-note{{'f' has been explicitly marked deprecated here}} |
| }; |
| |
| void D::f() { } |
| void D::f(int v) { } |
| void D::f(int v1, int v2) { } |
| |
| 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 2 {{'A' has been explicitly marked deprecated here}} |
| a0 |
| }; |
| 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 2 {{'Enum' has been explicitly marked deprecated here}} |
| c0 |
| }; |
| }; |
| 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. |