1 /* $NetBSD: expr_promote.c,v 1.5 2024/11/05 04:53:28 rillig Exp $ */ 2 # 3 "expr_promote.c" 3 4 /* 5 * Test arithmetic promotions in C90 and later. 6 */ 7 8 /* lint1-flags: -Sw -X 351 */ 9 10 void sink(const char *, ...); 11 12 struct arithmetic_types { 13 _Bool boolean; 14 char plain_char; 15 signed char signed_char; 16 unsigned char unsigned_char; 17 short signed_short; 18 unsigned short unsigned_short; 19 int signed_int; 20 unsigned int unsigned_int; 21 long signed_long; 22 unsigned long unsigned_long; 23 long long signed_long_long; 24 unsigned long long unsigned_long_long; 25 float float_floating; 26 double double_floating; 27 long double long_floating; 28 float _Complex float_complex; 29 double _Complex double_complex; 30 long double _Complex long_double_complex; 31 enum { 32 E 33 } enumerator; 34 }; 35 36 void 37 caller(struct arithmetic_types *arg) 38 { 39 /* See expr_promote.exp-ln for the resulting types. */ 40 sink("", 41 arg->boolean, /* should get promoted to 'int' */ 42 arg->plain_char, /* gets promoted to 'int' */ 43 arg->signed_char, /* gets promoted to 'int' */ 44 arg->unsigned_char, /* gets promoted to 'int' */ 45 arg->signed_short, /* gets promoted to 'int' */ 46 arg->unsigned_short, /* gets promoted to 'int' */ 47 arg->signed_int, 48 arg->unsigned_int, 49 arg->signed_long, 50 arg->unsigned_long, 51 arg->signed_long_long, 52 arg->unsigned_long_long, 53 arg->float_floating, /* gets promoted to 'double' */ 54 arg->double_floating, 55 arg->long_floating, 56 arg->float_complex, 57 arg->double_complex, 58 arg->long_double_complex, 59 arg->enumerator); /* should get promoted to 'int' */ 60 } 61 62 /* 63 * XXX: _Bool should be promoted to 'int', C99 6.3.1.1p2 "If an int can 64 * represent ...". 65 */ 66 /* 67 * XXX: Enumerations may need be promoted to 'int', at least C99 6.3.1.1p2 68 * suggests that: "If an int can represent ...". 69 */ 70