1 /* Verify that we don't emit ranges that span both
2    a macro definition location and a macro expansion location.  */
3 
4 /* { dg-options "-fdiagnostics-show-caret" } */
5 
6 /* Various cases involving the ranges of the LHS and RHS operands to "-".  */
7 
8 /* Case 1
9    start token is in macro definition ("&"),
10    end token is in macro invocation ("a" and "b").  */
11 
12 #define M1(A, B) &A - &B /* { dg-error "invalid operands" } */
13 
14 /* Intervening
15    material
16    that
17    ought
18    not
19    to
20    be
21    printed.  */
22 
test_1(float a,int b)23 int test_1 (float a, int b)
24 {
25   return M1(a, b); /* { dg-message "in expansion of macro 'M1'" } */
26 }
27 
28 /* { dg-begin-multiline-output "" }
29  #define M1(A, B) &A - &B
30                      ^
31    { dg-end-multiline-output "" } */
32 /* { dg-begin-multiline-output "" }
33    return M1(a, b);
34           ^~
35    { dg-end-multiline-output "" } */
36 
37 /* Case 2:
38    start and end tokens are both in macro invocation ("&", and "a"/"b").  */
39 
40 #define M2(A, B) A - B /* { dg-error "invalid operands" } */
41 
42 /* Intervening
43    material
44    that
45    ought
46    not
47    to
48    be
49    printed.  */
50 
test_2(float a,int b)51 int test_2 (float a, int b)
52 {
53   return M2(&a, &b); /* { dg-message "in expansion of macro 'M2'" } */
54 }
55 
56 /* { dg-begin-multiline-output "" }
57  #define M2(A, B) A - B
58                     ^
59    { dg-end-multiline-output "" } */
60 /* { dg-begin-multiline-output "" }
61    return M2(&a, &b);
62           ^~
63    { dg-end-multiline-output "" } */
64 
65 /* Case 3:
66    start token is in macro invocation ("&"),
67    end token is in macro definition ("a").  */
68 
69 #define M3(OP) OP a - OP b /* { dg-error "invalid operands" } */
70 
71 /* Intervening
72    material
73    that
74    ought
75    not
76    to
77    be
78    printed.  */
79 
test_3(float a,int b)80 int test_3 (float a, int b)
81 {
82   return M3(&); /* { dg-message "in expansion of macro 'M3'" } */
83 }
84 
85 /* { dg-begin-multiline-output "" }
86  #define M3(OP) OP a - OP b
87                      ^
88    { dg-end-multiline-output "" } */
89 /* { dg-begin-multiline-output "" }
90    return M3(&);
91           ^~
92    { dg-end-multiline-output "" } */
93 
94 
95 /* Case 4:
96    start and end tokens are both in macro definition ("&a").  */
97 
98 #define M4 &a - &b /* { dg-error "invalid operands" } */
99 
100 /* Intervening
101    material
102    that
103    ought
104    not
105    to
106    be
107    printed.  */
108 
test_4(float a,int b)109 int test_4 (float a, int b)
110 {
111   return M4; /* { dg-message "in expansion of macro 'M4'" } */
112 }
113 
114 /* { dg-begin-multiline-output "" }
115  #define M4 &a - &b
116             ~~ ^ ~~
117             |    |
118             |    int *
119             float *
120    { dg-end-multiline-output "" } */
121 /* { dg-begin-multiline-output "" }
122    return M4;
123           ^~
124    { dg-end-multiline-output "" } */
125 
126