PR tree-optimization/86401
[official-gcc.git] / gcc / testsuite / c-c++-common / attr-warn-unused-result.c
blobadf850c19036c3f919e00abead77fadfe65e2754
1 /* warn_unused_result attribute tests. */
2 /* { dg-do compile } */
3 /* { dg-options "-O -ftrack-macro-expansion=0" } */
5 #define WUR __attribute__((warn_unused_result))
6 #define WURAI __attribute__((warn_unused_result, always_inline)) inline
7 typedef WUR int (*fnt) (void);
9 typedef struct { long i; } A;
10 typedef struct { long i; long j; } B;
11 typedef struct { char big[1024]; fnt fn; } C;
13 WUR int check1 (void);
14 WUR void check2 (void); /* { dg-warning "attribute ignored" } */
15 int foo WUR; /* { dg-message "only applies" } */
16 int bar (void);
17 extern WURAI int check3 (void) { return bar (); }
18 WUR A check4 (void);
19 WUR B check5 (void);
20 WUR C check6 (void);
21 A bar7 (void);
22 B bar8 (void);
23 C bar9 (void);
24 extern WURAI A check7 (void) { return bar7 (); }
25 extern WURAI B check8 (void) { return bar8 (); }
26 extern WURAI C check9 (void) { return bar9 (); }
27 /* This is useful for checking whether return value of statement
28 expressions (returning int in this case) is used. */
29 extern WURAI int check_int_result (int res) { return res; }
30 #define GU(v) ({ int e = 0; (v) = bar (); if ((v) < 23) e = 14; e; })
31 fnt fnptr;
32 WUR int check10 (void);
33 int baz (void);
34 extern WURAI int check11 (void) { return baz (); }
35 int k;
37 void
38 test (void)
40 int i = 0, j;
41 const fnt pcheck1 = check1;
42 const fnt pcheck3 = check3;
43 A a;
44 B b;
45 C c;
46 if (check1 ())
47 return;
48 i += check1 ();
49 i += ({ check1 (); });
50 check1 (); /* { dg-warning "ignoring return value of" } */
51 (void) check1 (); /* { dg-warning "ignoring return value of" } */
52 check1 (), bar (); /* { dg-warning "ignoring return value of" } */
53 check2 ();
54 (void) check2 ();
55 check2 (), bar ();
56 if (check3 ())
57 return;
58 i += check3 ();
59 i += ({ check3 (); });
60 check3 (); /* { dg-warning "ignoring return value of" } */
61 (void) check3 (); /* { dg-warning "ignoring return value of" } */
62 check3 (), bar (); /* { dg-warning "ignoring return value of" } */
63 a = check4 ();
64 if (a.i)
65 return;
66 if (check4 ().i)
67 return;
68 if (({ check4 (); }).i)
69 return;
70 check4 (); /* { dg-warning "ignoring return value of" } */
71 (void) check4 (); /* { dg-warning "ignoring return value of" } */
72 check4 (), bar (); /* { dg-warning "ignoring return value of" } */
73 b = check5 ();
74 if (b.i + b.j)
75 return;
76 if (check5 ().j)
77 return;
78 if (({ check5 (); }).j)
79 return;
80 check5 (); /* { dg-warning "ignoring return value of" } */
81 (void) check5 (); /* { dg-warning "ignoring return value of" } */
82 check5 (), bar (); /* { dg-warning "ignoring return value of" } */
83 c = check6 ();
84 if (c.big[12] + c.big[29])
85 return;
86 if (check6 ().big[27])
87 return;
88 if (({ check6 (); }).big[0])
89 return;
90 check6 (); /* { dg-warning "ignoring return value of" } */
91 (void) check6 (); /* { dg-warning "ignoring return value of" } */
92 check6 (), bar (); /* { dg-warning "ignoring return value of" } */
93 a = check7 ();
94 if (a.i)
95 return;
96 if (check7 ().i)
97 return;
98 if (({ check7 (); }).i)
99 return;
100 check7 (); /* { dg-warning "ignoring return value of" } */
101 (void) check7 (); /* { dg-warning "ignoring return value of" } */
102 check7 (), bar (); /* { dg-warning "ignoring return value of" } */
103 b = check8 ();
104 if (b.i + b.j)
105 return;
106 if (check8 ().j)
107 return;
108 if (({ check8 (); }).j)
109 return;
110 check8 (); /* { dg-warning "ignoring return value of" } */
111 (void) check8 (); /* { dg-warning "ignoring return value of" } */
112 check8 (), bar (); /* { dg-warning "ignoring return value of" } */
113 c = check9 ();
114 if (c.big[12] + c.big[29])
115 return;
116 if (check9 ().big[27])
117 return;
118 if (({ check9 (); }).big[0])
119 return;
120 check9 (); /* { dg-warning "ignoring return value of" } */
121 (void) check9 (); /* { dg-warning "ignoring return value of" } */
122 check9 (), bar (); /* { dg-warning "ignoring return value of" } */
123 if (check_int_result (GU (j)))
124 return;
125 i += check_int_result (GU (j));
126 i += ({ check_int_result (GU (j)); });
127 check_int_result (GU (j)); /* { dg-warning "ignoring return value of" } */
128 (void) check_int_result (GU (j)); /* { dg-warning "ignoring return value of" } */
129 check_int_result (GU (j)), bar (); /* { dg-warning "ignoring return value of" } */
130 if (fnptr ())
131 return;
132 i += fnptr ();
133 i += ({ fnptr (); });
134 fnptr (); /* { dg-warning "ignoring return value of" } */
135 (void) fnptr (); /* { dg-warning "ignoring return value of" } */
136 fnptr (), bar (); /* { dg-warning "ignoring return value of" } */
137 fnptr = check1;
138 if (fnptr ())
139 return;
140 i += fnptr ();
141 i += ({ fnptr (); });
142 fnptr (); /* { dg-warning "ignoring return value of" } */
143 (void) fnptr (); /* { dg-warning "ignoring return value of" } */
144 fnptr (), bar (); /* { dg-warning "ignoring return value of" } */
145 fnptr = check3;
146 if (fnptr ())
147 return;
148 i += fnptr ();
149 i += ({ fnptr (); });
150 fnptr (); /* { dg-warning "ignoring return value of" } */
151 (void) fnptr (); /* { dg-warning "ignoring return value of" } */
152 fnptr (), bar (); /* { dg-warning "ignoring return value of" } */
153 if (bar9 ().fn ())
154 return;
155 i += bar9 ().fn ();
156 i += ({ bar9 ().fn (); });
157 bar9 ().fn (); /* { dg-warning "ignoring return value of" } */
158 (void) bar9 ().fn (); /* { dg-warning "ignoring return value of" } */
159 bar9 ().fn (), bar (); /* { dg-warning "ignoring return value of" } */
160 if ((k ? check1 : check10) ())
161 return;
162 i += (k ? check1 : check10) ();
163 i += ({ (k ? check1 : check10) (); });
164 (k ? check1 : check10) (); /* { dg-warning "ignoring return value of" } */
165 (void) (k ? check1 : check10) (); /* { dg-warning "ignoring return value of" } */
166 (k ? check1 : check10) (), bar (); /* { dg-warning "ignoring return value of" } */
167 if ((k ? check3 : check11) ())
168 return;
169 i += (k ? check3 : check11) ();
170 i += ({ (k ? check3 : check11) (); });
171 (k ? check3 : check11) (); /* { dg-warning "ignoring return value of" } */
172 (void) (k ? check3 : check11) (); /* { dg-warning "ignoring return value of" } */
173 (k ? check3 : check11) (), bar (); /* { dg-warning "ignoring return value of" } */
174 if (pcheck1 ())
175 return;
176 i += pcheck1 ();
177 i += ({ pcheck1 (); });
178 pcheck1 (); /* { dg-warning "ignoring return value of" } */
179 (void) pcheck1 (); /* { dg-warning "ignoring return value of" } */
180 pcheck1 (), bar (); /* { dg-warning "ignoring return value of" } */
181 if (pcheck3 ())
182 return;
183 i += pcheck3 ();
184 i += ({ pcheck3 (); });
185 pcheck3 (); /* { dg-warning "ignoring return value of" } */
186 (void) pcheck3 (); /* { dg-warning "ignoring return value of" } */
187 pcheck3 (), bar (); /* { dg-warning "ignoring return value of" } */