1*656ffdf2Srillig /* $NetBSD: expr_promote.c,v 1.5 2024/11/05 04:53:28 rillig Exp $ */ 2653c9ff1Srillig # 3 "expr_promote.c" 3653c9ff1Srillig 4653c9ff1Srillig /* 5653c9ff1Srillig * Test arithmetic promotions in C90 and later. 6653c9ff1Srillig */ 7653c9ff1Srillig 8b2baa501Srillig /* lint1-flags: -Sw -X 351 */ 9653c9ff1Srillig 10653c9ff1Srillig void sink(const char *, ...); 11653c9ff1Srillig 12653c9ff1Srillig struct arithmetic_types { 13653c9ff1Srillig _Bool boolean; 14653c9ff1Srillig char plain_char; 15653c9ff1Srillig signed char signed_char; 16653c9ff1Srillig unsigned char unsigned_char; 17653c9ff1Srillig short signed_short; 18653c9ff1Srillig unsigned short unsigned_short; 19653c9ff1Srillig int signed_int; 20653c9ff1Srillig unsigned int unsigned_int; 21653c9ff1Srillig long signed_long; 22653c9ff1Srillig unsigned long unsigned_long; 23653c9ff1Srillig long long signed_long_long; 24653c9ff1Srillig unsigned long long unsigned_long_long; 25653c9ff1Srillig float float_floating; 26653c9ff1Srillig double double_floating; 27653c9ff1Srillig long double long_floating; 28653c9ff1Srillig float _Complex float_complex; 29653c9ff1Srillig double _Complex double_complex; 30653c9ff1Srillig long double _Complex long_double_complex; 31e4284ba2Srillig enum { 32e4284ba2Srillig E 33e4284ba2Srillig } enumerator; 34653c9ff1Srillig }; 35653c9ff1Srillig 36653c9ff1Srillig void 37653c9ff1Srillig caller(struct arithmetic_types *arg) 38653c9ff1Srillig { 39e1fea1d6Srillig /* See expr_promote.exp-ln for the resulting types. */ 40653c9ff1Srillig sink("", 41*656ffdf2Srillig arg->boolean, /* should get promoted to 'int' */ 42653c9ff1Srillig arg->plain_char, /* gets promoted to 'int' */ 43653c9ff1Srillig arg->signed_char, /* gets promoted to 'int' */ 44653c9ff1Srillig arg->unsigned_char, /* gets promoted to 'int' */ 45653c9ff1Srillig arg->signed_short, /* gets promoted to 'int' */ 46653c9ff1Srillig arg->unsigned_short, /* gets promoted to 'int' */ 47653c9ff1Srillig arg->signed_int, 48653c9ff1Srillig arg->unsigned_int, 49653c9ff1Srillig arg->signed_long, 50653c9ff1Srillig arg->unsigned_long, 51653c9ff1Srillig arg->signed_long_long, 52653c9ff1Srillig arg->unsigned_long_long, 53653c9ff1Srillig arg->float_floating, /* gets promoted to 'double' */ 54653c9ff1Srillig arg->double_floating, 55653c9ff1Srillig arg->long_floating, 56653c9ff1Srillig arg->float_complex, 57653c9ff1Srillig arg->double_complex, 58e4284ba2Srillig arg->long_double_complex, 59*656ffdf2Srillig arg->enumerator); /* should get promoted to 'int' */ 60653c9ff1Srillig } 61653c9ff1Srillig 62e4284ba2Srillig /* 63e4284ba2Srillig * XXX: _Bool should be promoted to 'int', C99 6.3.1.1p2 "If an int can 64e4284ba2Srillig * represent ...". 65e4284ba2Srillig */ 66e4284ba2Srillig /* 67e4284ba2Srillig * XXX: Enumerations may need be promoted to 'int', at least C99 6.3.1.1p2 68e4284ba2Srillig * suggests that: "If an int can represent ...". 69e4284ba2Srillig */ 70