/* Test __attribute__ ((deprecated)) */
/* { dg-do compile } */
/* { dg-options "-Wdeprecated-declarations" } */

#if 1
typedef int INT1 __attribute__((deprecated));
typedef INT1 INT2 __attribute__ ((__deprecated__));

typedef INT1 INT1a; 			/* { dg-warning "'INT1' is deprecated" } */
typedef INT1 INT1b __attribute__ ((deprecated));

INT1 should_be_unavailable; 		/* { dg-warning "'INT1' is deprecated" } */
INT1a should_not_be_deprecated;

INT1 f1(void) __attribute__ ((deprecated)); 
INT1 f2(void) { return 0; }		/* { dg-warning "'INT1' is deprecated" } */

INT2 f3(void) __attribute__ ((__deprecated__)); 
INT2 f4(void) { return 0; }		/* { dg-warning "'INT2' is deprecated" } */
int f5(INT2 x);				/* { dg-warning "'INT2' is deprecated" } */
int f6(INT2 x) __attribute__ ((__deprecated__)); /* { dg-warning "'INT2' is deprecated" } */

typedef enum {red, green, blue} Color __attribute__((deprecated));

int g1;
int g2 __attribute__ ((deprecated));
int g3 __attribute__ ((__deprecated__));
Color k;				/* { dg-warning "'Color' is deprecated" } */

typedef struct {
  int field1;
  int field2 __attribute__ ((deprecated));
  int field3;
  int field4 __attribute__ ((__deprecated__));
  union {
    int field5;
    int field6 __attribute__ ((deprecated));
  } u1;
  int field7:1;
  int field8:1 __attribute__ ((deprecated));
  union {
    int field9;
    int field10;
  } u2 __attribute__ ((deprecated));
} S1;

int func1()
{
   INT1 w;				/* { dg-warning "'INT1' is deprecated" } */
   int x __attribute__ ((deprecated));
   int y __attribute__ ((__deprecated__));
   int z;
   int (*pf)() = f1;			/* { dg-warning "'f1' is deprecated" } */

   z = w + x + y + g1 + g2 + g3;	/* { dg-warning "'x' is deprecated" } */
   					/* { dg-warning "'y' is deprecated" "y" { target *-*-* } .-1 } */
   					/* { dg-warning "'g2' is deprecated" "g2" { target *-*-* } .-2 } */
   					/* { dg-warning "'g3' is deprecated" "g3" { target *-*-* } .-3 } */
   return f1(); 			/* { dg-warning "'f1' is deprecated" "f1" } */
}

int func2(S1 *p)
{
  S1 lp;
  
  if (p->field1)
     return p->field2;			/* { dg-warning "'field2' is deprecated" } */
  else if (lp.field4)			/* { dg-warning "'field4' is deprecated" } */
     return p->field3;
  
  p->u1.field5 = g1 + p->field7;
  p->u2.field9;				/* { dg-warning "'u2' is deprecated" } */
  return p->u1.field6 + p->field8;	/* { dg-warning "'field6' is deprecated" } */
  					/* { dg-warning "'field8' is deprecated" "field8" { target *-*-* } .-1 } */
}

struct SS1 {
  int x;
  INT1 y; 				/* { dg-warning "'INT1' is deprecated" } */
} __attribute__ ((deprecated));

struct SS1 *p1;				/* { dg-warning "'SS1' is deprecated" } */

struct __attribute__ ((__deprecated__)) SS2 {
  int x;
  INT1 y; 				/* { dg-warning "'INT1' is deprecated" } */
};

struct SS2 *p2;				/* { dg-warning "'SS2' is deprecated" } */
#endif

#ifdef __cplusplus
class T {
  public:
    void member1(int) __attribute__ ((deprecated));
    void member2(INT1) __attribute__ ((__deprecated__));
    int member3(T *);
    int x;
} __attribute__ ((deprecated));

T *p2;

inline void T::member1(int) {}

int T::member2(T *p)
{
  p->member1(1);			/* { xxdg-warning "'member1' is deprecated" } */
  (*p).member1(2);			/* { xxdg-warning "'member1' is deprecated" } */
  p->member2(1);			/* { xxdg-warning "'member2' is deprecated" } */
  (*p).member2(2);			/* { xxdg-warning "'member2' is deprecated" } */
  p->member3(p);
  (*p).member3(p);
  return f1(); 				/* { xxdg-warning "'f1' is deprecated" } */
}
#endif


