1  /* Test for integer promotion rules: C90 subset of types.  */
       2  /* Origin: Joseph Myers <jsm@polyomino.org.uk> */
       3  /* { dg-do compile } */
       4  /* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
       5  
       6  #include <limits.h>
       7  
       8  #define CHECK(T1, T2, TC)			\
       9    do {						\
      10      T1 a = 0;					\
      11      T2 b = 0;					\
      12      TC *c = 0;					\
      13      __typeof__(a+b) *d = 0;			\
      14      c = d;					\
      15      d = c;					\
      16    } while (0)
      17  
      18  void
      19  f (void)
      20  {
      21    /* One type is unsigned long.  */
      22    CHECK(unsigned long, unsigned long, unsigned long);
      23    CHECK(unsigned int, unsigned long, unsigned long);
      24    CHECK(unsigned long, unsigned int, unsigned long);
      25    CHECK(int, unsigned long, unsigned long);
      26    CHECK(long, unsigned long, unsigned long);
      27    CHECK(unsigned long, int, unsigned long);
      28    CHECK(unsigned long, long, unsigned long);
      29    /* long and unsigned int.  */
      30  #if LONG_MAX >= UINT_MAX
      31    CHECK(unsigned int, long, long);
      32    CHECK(long, unsigned int, long);
      33  #else
      34    CHECK(unsigned int, long, unsigned long);
      35    CHECK(long, unsigned int, unsigned long);
      36  #endif
      37    /* One type is long.  */
      38    CHECK(long, long, long);
      39    CHECK(int, long, long);
      40    CHECK(long, int, long);
      41    /* One type is unsigned int.  */
      42    CHECK(unsigned int, unsigned int, unsigned int);
      43    CHECK(int, unsigned int, unsigned int);
      44    CHECK(unsigned int, int, unsigned int);
      45    /* Otherwise int.  */
      46    CHECK(int, int, int);
      47  }