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