1/* { dg-do compile } */
2/* { dg-options "" } */
3
4#define CONCAT_(A,B) A ## B
5#define CONCAT(A,B) CONCAT_(A,B)
6
7#define ATTR __attribute__((AT))
8#define ATSYM(suf) CONCAT (AT, CONCAT_ (_, suf))
9
10#define AT noinline
11
12typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
13
14typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
15
16struct ATSYM(struct) {
17  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
18} ATTR; /* { dg-warning "does not apply to types" "" } */
19
20int ATSYM(var) ATTR;  /* { dg-warning "attribute ignored" "" } */
21
22int ATSYM(fn_knrarg) (arg)
23  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
24{ return 0; }
25
26int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
27
28int ATSYM(fn_vars) (void) {
29  static int svar ATTR; /* { dg-warning "attribute ignored" "" } */
30  auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
31  return 0;
32}
33
34
35#undef AT
36#define AT used
37
38typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
39
40typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
41
42struct ATSYM(struct) {
43  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
44} ATTR; /* { dg-warning "does not apply to types" "" } */
45
46int ATSYM(var) ATTR;
47
48int ATSYM(fn_knrarg) (arg)
49  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
50{ return 0; }
51
52int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
53
54int ATSYM(fn_vars) (void) {
55  static int svar ATTR;
56  auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
57  return 0;
58}
59
60
61/* PR 28287 */
62/* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
63   also caused a tree checking ice on targets that support weak,  */
64#undef AT
65#define AT weak
66
67typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
68
69typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
70
71struct ATSYM(struct) {
72  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
73};
74
75int ATSYM(fn_knrarg) (arg)
76  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
77{ return 0; }
78
79int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
80
81
82/* PR target/28648  */
83/* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
84   also caused a tree checking ice on targets that support dllimport.  */
85#undef AT
86#define AT dllimport
87
88typedef int ATSYM(type) ATTR;  /* { dg-warning "attribute |directive ignored" "" } */
89
90typedef int (*ATSYM(fntype))(void) ATTR;   /* { dg-warning "attribute |directive ignored" "" } */
91
92struct ATSYM(struct) {
93  char dummy ATTR;  /* { dg-warning "attribute |directive ignored" "" } */
94};
95
96int ATSYM(fn_knrarg) (arg)
97  int arg ATTR;  /* { dg-warning "attribute |directive ignored" "" } */
98{ return 0; }
99
100int ATSYM(fn_isoarg) (int arg ATTR) { return 0; }  /* { dg-warning "attribute |directive ignored" "" } */
101