1 /* Copyright (C) 2000, 2008 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 /* : strictly higher than ?. This would give a syntax error otherwise. */ 23 #if 0 ? 0 : 1 ? 1 : 1 24 #endif 25 26 /* || strictly higher than ?:. */ 27 #if 1 ? 0: 0 || 1 28 #error operator ?: has higher precedence than operator || 29 #endif 30 31 /* && strictly higher than ||. */ 32 #if 1 || 0 && 0 33 #else 34 #error operator || has higher precedence than operator && 35 #endif 36 37 /* | strictly higher than &&. */ 38 #if 0 && 0 | 1 39 #error operator && has higher precedence than operator | 40 #endif 41 42 /* ^ strictly higher than |. */ 43 #if 1 | 0 ^ 1 44 #else 45 #error operator | has higher precedence than operator ^ 46 #endif 47 48 /* & strictly higher than ^. */ 49 #if 1 ^ 0 & 0 50 #else 51 #error operator ^ has higher precedence than operator & 52 #endif 53 54 /* == (!=) strictly higher than &. */ 55 #if 0 & 0 == 0 56 #error operator & has higher precedence than operator == 57 #endif 58 59 /* < (>, <=, >=) strictly higher than == (!=). */ 60 61 #if 0 == 0 < 0 62 #else 63 #error operator == has higher precedence than operator < 64 #endif 65 66 /* << (>>) strictly higher than < (>, <=, >=). */ 67 #if 1 < 1 << 1 68 #else 69 #error operator < has higher precedence than operator << 70 #endif 71 72 /* Binary + (-) strictly higher than << (>>). */ 73 #if 0 << 0 + 1 74 #error operator << has higher precedence than binary + 75 #endif 76 77 /* Binary * (/, %) strictly higher than binary + (-). */ 78 #if 1 + 0 * 0 79 #else 80 #error binary + has higher precedence than binary * 81 #endif 82 83 /* Unary operators (!, ~, -, +) strictly higher than binary * (/, %). 84 Equality is hard to detect because of right-associativity. */ 85 #if ~1 * 0 86 #error binary * has higher precedence than operator ~ 87 #endif 88 89 /* () > Unary. Unfortunately this requires an additional operator. */ 90 #if -(1 - 1) 91 #error unary - has higher precedence than operator () 92 #endif 93