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 
12 typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" } */
13 
14 typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" } */
15 
ATSYM(struct)16 struct ATSYM(struct) {
17   char dummy ATTR; /* { dg-warning "attribute ignored" } */
18 } ATTR; /* { dg-warning "does not apply to types" } */
19 
20 int ATSYM(var) ATTR;  /* { dg-warning "attribute ignored" } */
21 
22 int ATSYM(fn_knrarg) (arg)
23   int arg ATTR; /* { dg-warning "attribute ignored" } */
24 { return 0; }
25 
ATSYM(fn_isoarg)26 int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" } */
27 
ATSYM(fn_vars)28 int 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 
38 typedef int ATSYM(type) ATTR; /* used attribute is no longer
39 				 ignored.  */
40 
41 typedef int (*ATSYM(fntype))(void) ATTR; /* used attribute is no
42 					    longer ignored.  */
43 
ATSYM(struct)44 struct ATSYM(struct) {
45   char dummy ATTR; /* { dg-warning "attribute ignored" } */
46 } ATTR; /* { dg-warning "does not apply to types" } */
47 
48 int ATSYM(var) ATTR;
49 
50 int ATSYM(fn_knrarg) (arg)
51   int arg ATTR; /* { dg-warning "attribute ignored" } */
52 { return 0; }
53 
ATSYM(fn_isoarg)54 int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" } */
55 
ATSYM(fn_vars)56 int ATSYM(fn_vars) (void) {
57   static int svar ATTR;
58   auto int lvar ATTR; /* { dg-warning "attribute ignored" } */
59   return 0;
60 }
61 
62 
63 /* PR 28287 */
64 /* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
65    also caused a tree checking ice on targets that support weak,  */
66 #undef AT
67 #define AT weak
68 
69 typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" } */
70 
71 typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" } */
72 
ATSYM(struct)73 struct ATSYM(struct) {
74   char dummy ATTR; /* { dg-warning "attribute ignored" } */
75 };
76 
77 int ATSYM(fn_knrarg) (arg)
78   int arg ATTR; /* { dg-warning "attribute ignored" } */
79 { return 0; }
80 
ATSYM(fn_isoarg)81 int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" } */
82 
83 
84 /* PR target/28648  */
85 /* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
86    also caused a tree checking ice on targets that support dllimport.  */
87 #undef AT
88 #define AT dllimport
89 
90 typedef int ATSYM(type) ATTR;  /* { dg-warning "attribute |directive ignored" } */
91 
92 typedef int (*ATSYM(fntype))(void) ATTR;   /* { dg-warning "attribute |directive ignored" } */
93 
ATSYM(struct)94 struct ATSYM(struct) {
95   char dummy ATTR;  /* { dg-warning "attribute |directive ignored" } */
96 };
97 
98 int ATSYM(fn_knrarg) (arg)
99   int arg ATTR;  /* { dg-warning "attribute |directive ignored" } */
100 { return 0; }
101 
ATSYM(fn_isoarg)102 int ATSYM(fn_isoarg) (int arg ATTR) { return 0; }  /* { dg-warning "attribute |directive ignored" } */
103