1 /* Copyright (C) 2000 Free Software Foundation, Inc. */ 2 3 /* Test the full range of preprocessor operator precedence. Each 4 operator is tested with one of immediately higher precedence to 5 verify it is of strictly lower precedence. To avoid complications, 6 each test uses just those two operators. Occasionally this assumes 7 correct operation of if-then-else, so the first tests verify this. */ 8 9 /* { dg-do preprocess } */ 10 11 /* Ensure correct functioning of if-then-else. */ 12 #if 1 13 #else 14 #error #else block evaluated for true conditional 15 #endif 16 17 #if 0 18 #error #if block evaluated for false conditional 19 #else 20 #endif 21 22 /* , not higher than ?. This is not a syntax error if it is. */ 23 #if 1 ? 0, 1: 1 /* { dg-error "without" "? higher precedence than ," } */ 24 #error 25 #endif 26 27 /* : strictly higher than ?. This would give a syntax error otherwise. */ 28 #if 0 ? 0 : 1 ? 1 : 1 29 #endif 30 31 /* || strictly higher than ?:. */ 32 #if 1 ? 0: 0 || 1 33 #error operator ?: has higher precedence than operator || 34 #endif 35 36 /* && strictly higher than ||. */ 37 #if 1 || 0 && 0 38 #else 39 #error operator || has higher precedence than operator && 40 #endif 41 42 /* | strictly higher than &&. */ 43 #if 0 && 0 | 1 44 #error operator && has higher precedence than operator | 45 #endif 46 47 /* ^ strictly higher than |. */ 48 #if 1 | 0 ^ 1 49 #else 50 #error operator | has higher precedence than operator ^ 51 #endif 52 53 /* & strictly higher than ^. */ 54 #if 1 ^ 0 & 0 55 #else 56 #error operator ^ has higher precedence than operator & 57 #endif 58 59 /* == (!=) strictly higher than &. */ 60 #if 0 & 0 == 0 61 #error operator & has higher precedence than operator == 62 #endif 63 64 /* < (>, <=, >=) strictly higher than == (!=). */ 65 66 #if 0 == 0 < 0 67 #else 68 #error operator == has higher precedence than operator < 69 #endif 70 71 /* << (>>) strictly higher than < (>, <=, >=). */ 72 #if 1 < 1 << 1 73 #else 74 #error operator < has higher precedence than operator << 75 #endif 76 77 /* Binary + (-) strictly higher than << (>>). */ 78 #if 0 << 0 + 1 79 #error operator << has higher precedence than binary + 80 #endif 81 82 /* Binary * (/, %) strictly higher than binary + (-). */ 83 #if 1 + 0 * 0 84 #else 85 #error binary + has higher precedence than binary * 86 #endif 87 88 /* Unary operators (!, ~, -, +) strictly higher than binary * (/, %). 89 Equality is hard to detect because of right-associativity. */ 90 #if ~1 * 0 91 #error binary * has higher precedence than operator ~ 92 #endif 93 94 /* () > Unary. Unfortunately this requires an additional operator. */ 95 #if -(1 - 1) 96 #error unary - has higher precedence than operator () 97 #endif 98