llvm-project/clang/test/SemaCXX/attr-deprecated.cpp

193 lines
3.8 KiB
C++

// RUN: %clang_cc1 %s -verify -fsyntax-only
class A {
void f() __attribute__((deprecated));
void g(A* a);
void h(A* a) __attribute__((deprecated));
int b __attribute__((deprecated));
};
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));
void g();
};
void B::g() {
f();
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();
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));
};
void D::f() { }
void f(D* d) {
d->f();
}
// Overloaded namespace members.
namespace test1 {
void foo(int) __attribute__((deprecated));
void test1() { foo(10); } // expected-warning {{deprecated}}
void foo(short) __attribute__((deprecated));
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));
};
void test4(A *a) { foo(a); } // expected-warning {{deprecated}}
namespace ns {
struct Foo {};
void foo(const Foo &f) __attribute__((deprecated));
}
void test5() {
foo(ns::Foo()); // expected-warning {{deprecated}}
}
}
// Overloaded class members.
namespace test2 {
struct A {
void foo(int) __attribute__((deprecated));
void foo(long);
static void bar(int) __attribute__((deprecated));
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));
void operator-(const A &) const;
};
void operator+(const A &, const A &);
void operator+(const A &, int) __attribute__((deprecated));
void operator-(const A &, int) __attribute__((deprecated));
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));
operator unintfn();
void operator ()(A &) __attribute__((deprecated));
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));
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)
{}
};
}