forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			259 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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.
 |