1 /* PR c/80116 */
2 /* { dg-options "-Wmultistatement-macros" } */
3 /* { dg-do compile } */
4 
5 #define SWAP(X, Y)	\
6   tmp = X; /* { dg-warning "macro expands to multiple statements" } */ \
7   X = Y;		\
8   Y = tmp
9 
10 #define STUFF		\
11   if (0) {} else x = y
12 
13 #define STUFF2		\
14   if (0) {} else x = y; x++
15 
16 #define STUFF3		\
17   if (x)		\
18     {}			\
19   else /* { dg-message "not guarded by this 'else' clause" } */ \
20     SWAP(x, y) /* { dg-message "in expansion of macro .SWAP." } */
21 
22 #define SET(X, Y)	\
23   (X) = (Y)
24 
25 #define STUFF4		\
26   if (x)		\
27     {}			\
28   else			\
29     SET(x, y);		\
30   SET(x, y)
31 
32 #define STUFF5		\
33   { tmp = x; x = y; }
34 
35 #define STUFF6		\
36   x++;;
37 
38 int x, y, tmp;
39 
40 void
fn1(void)41 fn1 (void)
42 {
43   if (x)
44    {
45    }
46   else /* { dg-message "not guarded by this 'else' clause" } */
47     SWAP(x, y); /* { dg-message "in expansion of macro .SWAP." } */
48 }
49 
50 void
fn2(void)51 fn2 (void)
52 {
53   SWAP(x, y);
54 }
55 
56 void
fn3(void)57 fn3 (void)
58 {
59   if (x)
60     {
61     }
62   else
63     {
64       SWAP(x, y);
65     }
66 }
67 
68 void
fn4(void)69 fn4 (void)
70 {
71   if (x)
72     {
73     }
74   else
75     ({ x = 10; x++; });
76 }
77 
78 void
fn5(void)79 fn5 (void)
80 {
81   if (x)
82     {
83     }
84   else /* { dg-message "not guarded by this 'else' clause" } */
85 L1:
86     SWAP (x, y); /* { dg-message "in expansion of macro .SWAP." } */
87   goto L1;
88 }
89 
90 void
fn6(void)91 fn6 (void)
92 {
93   if (x)
94     {
95     }
96   else
97     SET (x, y);
98   SET (tmp, x);
99 }
100 
101 void
fn7(void)102 fn7 (void)
103 {
104   STUFF;
105 }
106 
107 void
fn8(void)108 fn8 (void)
109 {
110   STUFF2;
111 }
112 
113 void
fn9(void)114 fn9 (void)
115 {
116   STUFF3; /* { dg-message "in expansion of macro .STUFF3." } */
117 }
118 
119 void
fn10(void)120 fn10 (void)
121 {
122   STUFF4;
123 }
124 
125 void
fn11(void)126 fn11 (void)
127 {
128   if (x)
129     STUFF5;
130 }
131 
132 void
fn12(void)133 fn12 (void)
134 {
135   if (x)
136     STUFF6;
137 }
138