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