gnu / gcc / ab810952eb7c061e37054ddd1dfe0aa033365131 / . / gcc / testsuite / gcc.dg / c90-intprom-1.c

/* Test for integer promotion rules: C90 subset of types. */ | |

/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ | |

/* { dg-do compile } */ | |

/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */ | |

#include <limits.h> | |

#define CHECK(T1, T2, TC) \ | |

do { \ | |

T1 a = 0; \ | |

T2 b = 0; \ | |

TC *c = 0; \ | |

__typeof__(a+b) *d = 0; \ | |

c = d; \ | |

d = c; \ | |

} while (0) | |

void | |

f (void) | |

{ | |

/* One type is unsigned long. */ | |

CHECK(unsigned long, unsigned long, unsigned long); | |

CHECK(unsigned int, unsigned long, unsigned long); | |

CHECK(unsigned long, unsigned int, unsigned long); | |

CHECK(int, unsigned long, unsigned long); | |

CHECK(long, unsigned long, unsigned long); | |

CHECK(unsigned long, int, unsigned long); | |

CHECK(unsigned long, long, unsigned long); | |

/* long and unsigned int. */ | |

#if LONG_MAX >= UINT_MAX | |

CHECK(unsigned int, long, long); | |

CHECK(long, unsigned int, long); | |

#else | |

CHECK(unsigned int, long, unsigned long); | |

CHECK(long, unsigned int, unsigned long); | |

#endif | |

/* One type is long. */ | |

CHECK(long, long, long); | |

CHECK(int, long, long); | |

CHECK(long, int, long); | |

/* One type is unsigned int. */ | |

CHECK(unsigned int, unsigned int, unsigned int); | |

CHECK(int, unsigned int, unsigned int); | |

CHECK(unsigned int, int, unsigned int); | |

/* Otherwise int. */ | |

CHECK(int, int, int); | |

} |