/* { dg-do compile } */
/* { dg-options "" } */

#define CONCAT_(A,B) A ## B
#define CONCAT(A,B) CONCAT_(A,B)

#define ATTR __attribute__((AT))
#define ATSYM(suf) CONCAT (AT, CONCAT_ (_, suf))

#define AT noinline

typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */

typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */

struct ATSYM(struct) {
  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
} ATTR; /* { dg-warning "does not apply to types" "" } */

int ATSYM(var) ATTR;  /* { dg-warning "attribute ignored" "" } */

int ATSYM(fn_knrarg) (arg)
  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
{ return 0; }

int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */

int ATSYM(fn_vars) (void) {
  static int svar ATTR; /* { dg-warning "attribute ignored" "" } */
  auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
  return 0;
}


#undef AT
#define AT used

typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */

typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */

struct ATSYM(struct) {
  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
} ATTR; /* { dg-warning "does not apply to types" "" } */

int ATSYM(var) ATTR;

int ATSYM(fn_knrarg) (arg)
  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
{ return 0; }

int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */

int ATSYM(fn_vars) (void) {
  static int svar ATTR;
  auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
  return 0;
}


/* PR 28287 */
/* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
   also caused a tree checking ice on targets that support weak,  */
#undef AT
#define AT weak

typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */

typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */

struct ATSYM(struct) {
  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
};

int ATSYM(fn_knrarg) (arg)
  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
{ return 0; }

int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */


/* PR target/28648  */
/* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
   also caused a tree checking ice on targets that support dllimport.  */
#undef AT
#define AT dllimport

typedef int ATSYM(type) ATTR;  /* { dg-warning "attribute |directive ignored" "" } */

typedef int (*ATSYM(fntype))(void) ATTR;   /* { dg-warning "attribute |directive ignored" "" } */

struct ATSYM(struct) {
  char dummy ATTR;  /* { dg-warning "attribute |directive ignored" "" } */
};

int ATSYM(fn_knrarg) (arg)
  int arg ATTR;  /* { dg-warning "attribute |directive ignored" "" } */
{ return 0; }

int ATSYM(fn_isoarg) (int arg ATTR) { return 0; }  /* { dg-warning "attribute |directive ignored" "" } */
