xref: /netbsd-src/tests/usr.bin/xlint/lint1/expr_promote.c (revision 656ffdf2e3864b68d292b6310a83df69189a876a)
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