| /* PR c/80116 */ |
| /* { dg-options "-Wmultistatement-macros" } */ |
| /* { dg-do compile } */ |
| |
| #define SWAP(x, y) \ |
| tmp = x; /* { dg-warning "macro expands to multiple statements" } */ \ |
| x = y; \ |
| y = tmp |
| |
| #define M1 \ |
| while (x) /* { dg-message "not guarded by this 'while' claus" } */ \ |
| SWAP (x, y) /* { dg-message "in expansion of macro .SWAP." } */ |
| |
| #define M2 \ |
| while (x) \ |
| x++ |
| |
| #define M3 \ |
| while (x) \ |
| x++;; |
| |
| #define M4 \ |
| while (x) /* { dg-message "not guarded by this 'while' claus" } */ \ |
| L1: \ |
| SWAP (x, y) /* { dg-message "in expansion of macro .SWAP." } */ |
| |
| #define INC \ |
| x++;; |
| |
| int x, y, tmp; |
| |
| void |
| fn0 (void) |
| { |
| while (x) /* { dg-message "not guarded by this 'while' claus" } */ |
| SWAP (x, y); /* { dg-message "in expansion of macro .SWAP." } */ |
| |
| while (x) /* { dg-message "not guarded by this 'while' claus" } */ |
| L: |
| SWAP (x, y); /* { dg-message "in expansion of macro .SWAP." } */ |
| goto L; |
| } |
| |
| void |
| fn1 (void) |
| { |
| M1; /* { dg-message "in expansion of macro .M1." } */ |
| M2; |
| M3; |
| M4; /* { dg-message "in expansion of macro .M4." } */ |
| goto L1; |
| } |
| |
| void |
| fn2 (void) |
| { |
| while (x) |
| INC |
| |
| while (x) |
| ({ x = 10; x++; }); |
| } |