| /* Copyright (C) 2000 Free Software Foundation, Inc. */ |
| |
| /* Test the full range of preprocessor operator precedence. Each |
| operator is tested with one of immediately higher precedence to |
| verify it is of strictly lower precedence. To avoid complications, |
| each test uses just those two operators. Occasionally this assumes |
| correct operation of if-then-else, so the first tests verify this. */ |
| |
| /* { dg-do preprocess } */ |
| |
| /* Ensure correct functioning of if-then-else. */ |
| #if 1 |
| #else |
| #error #else block evaluated for true conditional |
| #endif |
| |
| #if 0 |
| #error #if block evaluated for false conditional |
| #else |
| #endif |
| |
| /* , not higher than ?. This is not a syntax error if it is. */ |
| #if 1 ? 0, 1: 1 /* { dg-error "without" "? higher precedence than ," } */ |
| #error |
| #endif |
| |
| /* : strictly higher than ?. This would give a syntax error otherwise. */ |
| #if 0 ? 0 : 1 ? 1 : 1 |
| #endif |
| |
| /* || strictly higher than ?:. */ |
| #if 1 ? 0: 0 || 1 |
| #error operator ?: has higher precedence than operator || |
| #endif |
| |
| /* && strictly higher than ||. */ |
| #if 1 || 0 && 0 |
| #else |
| #error operator || has higher precedence than operator && |
| #endif |
| |
| /* | strictly higher than &&. */ |
| #if 0 && 0 | 1 |
| #error operator && has higher precedence than operator | |
| #endif |
| |
| /* ^ strictly higher than |. */ |
| #if 1 | 0 ^ 1 |
| #else |
| #error operator | has higher precedence than operator ^ |
| #endif |
| |
| /* & strictly higher than ^. */ |
| #if 1 ^ 0 & 0 |
| #else |
| #error operator ^ has higher precedence than operator & |
| #endif |
| |
| /* == (!=) strictly higher than &. */ |
| #if 0 & 0 == 0 |
| #error operator & has higher precedence than operator == |
| #endif |
| |
| /* < (>, <=, >=) strictly higher than == (!=). */ |
| |
| #if 0 == 0 < 0 |
| #else |
| #error operator == has higher precedence than operator < |
| #endif |
| |
| /* << (>>) strictly higher than < (>, <=, >=). */ |
| #if 1 < 1 << 1 |
| #else |
| #error operator < has higher precedence than operator << |
| #endif |
| |
| /* Binary + (-) strictly higher than << (>>). */ |
| #if 0 << 0 + 1 |
| #error operator << has higher precedence than binary + |
| #endif |
| |
| /* Binary * (/, %) strictly higher than binary + (-). */ |
| #if 1 + 0 * 0 |
| #else |
| #error binary + has higher precedence than binary * |
| #endif |
| |
| /* Unary operators (!, ~, -, +) strictly higher than binary * (/, %). |
| Equality is hard to detect because of right-associativity. */ |
| #if ~1 * 0 |
| #error binary * has higher precedence than operator ~ |
| #endif |
| |
| /* () > Unary. Unfortunately this requires an additional operator. */ |
| #if -(1 - 1) |
| #error unary - has higher precedence than operator () |
| #endif |