| /* Verify that we don't emit ranges that span both |
| a macro definition location and a macro expansion location. */ |
| |
| /* { dg-options "-fdiagnostics-show-caret" } */ |
| |
| /* Various cases involving the ranges of the LHS and RHS operands to "-". */ |
| |
| /* Case 1 |
| start token is in macro definition ("&"), |
| end token is in macro invocation ("a" and "b"). */ |
| |
| #define M1(A, B) &A - &B /* { dg-error "invalid operands" } */ |
| |
| /* Intervening |
| material |
| that |
| ought |
| not |
| to |
| be |
| printed. */ |
| |
| int test_1 (float a, int b) |
| { |
| return M1(a, b); /* { dg-message "in expansion of macro 'M1'" } */ |
| } |
| |
| /* { dg-begin-multiline-output "" } |
| #define M1(A, B) &A - &B |
| ^ |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| return M1(a, b); |
| ^~ |
| { dg-end-multiline-output "" } */ |
| |
| /* Case 2: |
| start and end tokens are both in macro invocation ("&", and "a"/"b"). */ |
| |
| #define M2(A, B) A - B /* { dg-error "invalid operands" } */ |
| |
| /* Intervening |
| material |
| that |
| ought |
| not |
| to |
| be |
| printed. */ |
| |
| int test_2 (float a, int b) |
| { |
| return M2(&a, &b); /* { dg-message "in expansion of macro 'M2'" } */ |
| } |
| |
| /* { dg-begin-multiline-output "" } |
| #define M2(A, B) A - B |
| ^ |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| return M2(&a, &b); |
| ^~ |
| { dg-end-multiline-output "" } */ |
| |
| /* Case 3: |
| start token is in macro invocation ("&"), |
| end token is in macro definition ("a"). */ |
| |
| #define M3(OP) OP a - OP b /* { dg-error "invalid operands" } */ |
| |
| /* Intervening |
| material |
| that |
| ought |
| not |
| to |
| be |
| printed. */ |
| |
| int test_3 (float a, int b) |
| { |
| return M3(&); /* { dg-message "in expansion of macro 'M3'" } */ |
| } |
| |
| /* { dg-begin-multiline-output "" } |
| #define M3(OP) OP a - OP b |
| ^ |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| return M3(&); |
| ^~ |
| { dg-end-multiline-output "" } */ |
| |
| |
| /* Case 4: |
| start and end tokens are both in macro definition ("&a"). */ |
| |
| #define M4 &a - &b /* { dg-error "invalid operands" } */ |
| |
| /* Intervening |
| material |
| that |
| ought |
| not |
| to |
| be |
| printed. */ |
| |
| int test_4 (float a, int b) |
| { |
| return M4; /* { dg-message "in expansion of macro 'M4'" } */ |
| } |
| |
| /* { dg-begin-multiline-output "" } |
| #define M4 &a - &b |
| ~~ ^ ~~ |
| | | |
| | int * |
| float * |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| return M4; |
| ^~ |
| { dg-end-multiline-output "" } */ |
| |