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