/* 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 *-*-* } 55 } */
   					/* { dg-warning "'g2' is deprecated" "g2" { target *-*-* } 55 } */
   					/* { dg-warning "'g3' is deprecated" "g3" { target *-*-* } 55 } */
   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 *-*-* } 73 } */
}

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


