| // P2334R1 |
| // { dg-do preprocess } |
| // { dg-options "-pedantic" } |
| |
| #define A |
| #undef B |
| |
| #if 0 |
| #elifdef A // { dg-warning "#elifdef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #define M1 1 |
| #endif |
| |
| #if M1 != 1 |
| #error "#elifdef A did not apply" |
| #endif |
| |
| #if 0 |
| #elifdef B |
| #error "#elifdef B applied" |
| #endif |
| |
| #if 0 |
| #elifndef A |
| #error "#elifndef A applied" |
| #endif |
| |
| #if 0 |
| #elifndef B // { dg-warning "#elifndef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #define M2 2 |
| #endif |
| |
| #if M2 != 2 |
| #error "#elifndef B did not apply" |
| #endif |
| |
| #if 0 |
| #elifdef A // { dg-warning "#elifdef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #else |
| #error "#elifdef A did not apply" |
| #endif |
| |
| #if 0 |
| #elifndef B // { dg-warning "#elifndef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #else |
| #error "#elifndef B did not apply" |
| #endif |
| |
| #if 1 |
| #elifdef A // { dg-warning "#elifdef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #endif |
| |
| #if 1 |
| #elifndef B // { dg-warning "#elifndef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #endif |
| |
| // As with #elif, the syntax of the new directives is relaxed after a |
| non-skipped group. |
| |
| #if 1 |
| #elifdef x * y // { dg-warning "#elifdef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #endif |
| |
| #if 1 |
| #elifndef ! // { dg-warning "#elifndef before C\\\+\\\+23 is a GCC extension" "" { target c++20_down } } |
| #endif |