xref: /netbsd-src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c (revision e16f398bf19d3cf61be0e43b15d4a50f67285910)
1*e16f398bSrillig /*	$NetBSD: d_gcc_compound_statements1.c,v 1.14 2023/07/02 22:56:13 rillig Exp $	*/
2aadcb6a6Srillig # 3 "d_gcc_compound_statements1.c"
3aadcb6a6Srillig 
4c581ec06Srillig /* GCC compound statement with expression */
528604916Sjruoho 
6b2baa501Srillig /* lint1-extra-flags: -X 351 */
7b2baa501Srillig 
83851fec0Srillig /*
93851fec0Srillig  * Compound statements are only allowed in functions, not at file scope.
103851fec0Srillig  *
11e04c94f4Srillig  * Before decl.c 1.283 from 2022-05-31, lint crashed with a segmentation
123851fec0Srillig  * fault due to the unused label.
133851fec0Srillig  */
143851fec0Srillig int invalid_gcc_statement_expression = ({
153851fec0Srillig unused_label:
163851fec0Srillig 	3;
173851fec0Srillig /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */
183851fec0Srillig /* expect+1: error: cannot initialize 'int' from 'void' [185] */
193851fec0Srillig });
203851fec0Srillig 
foo(unsigned long z)21e4ab72eaSrillig void foo(unsigned long z)
2228604916Sjruoho {
2370a1a91eSrillig 	z = ({
2470a1a91eSrillig 		unsigned long tmp;
2570a1a91eSrillig 		tmp = 1;
2670a1a91eSrillig 		tmp;
2770a1a91eSrillig 	});
2828604916Sjruoho 	foo(z);
2928604916Sjruoho }
300c0b119aSrillig 
310c0b119aSrillig /*
320c0b119aSrillig  * Compound statements are only allowed in functions, not at file scope.
330c0b119aSrillig  *
340c0b119aSrillig  * Before decl.c 1.186 from 2021-06-19, lint crashed with a segmentation
350c0b119aSrillig  * fault.
360c0b119aSrillig  */
370c0b119aSrillig int c = ({
38a4a927acSrillig 	/* expect+1: error: syntax error 'return outside function' [249] */
39a4a927acSrillig 	return 3;
40a4a927acSrillig });
41a4a927acSrillig /* expect-1: error: cannot initialize 'int' from 'void' [185] */
4222368870Srillig 
4322368870Srillig void
function(void)4422368870Srillig function(void)
4522368870Srillig {
4622368870Srillig 	/*
4722368870Srillig 	 * Before cgram.y 1.229 from 2021-06-20, lint crashed due to the
4822368870Srillig 	 * syntax error, which made an expression NULL.
4922368870Srillig 	 */
5022368870Srillig 	({
51a4a927acSrillig 		/* expect+1: error: type 'int' does not have member 'e' [101] */
52a4a927acSrillig 		0->e;
5322368870Srillig 	});
5422368870Srillig }
55bbec5f69Srillig 
56bbec5f69Srillig void
crash(void)57bbec5f69Srillig crash(void)
58bbec5f69Srillig {
59bbec5f69Srillig 	/*
60bbec5f69Srillig 	 * Before tree.c 1.418 from 2022-04-03, lint dereferenced a null
61bbec5f69Srillig 	 * pointer in do_statement_expr.
62bbec5f69Srillig 	 */
63bbec5f69Srillig 	({
64bbec5f69Srillig 		;
65bbec5f69Srillig 	});
66bbec5f69Srillig }
676ab24c0bSrillig 
686ab24c0bSrillig /*
69*e16f398bSrillig  * Before cgram.y 1.445 from 2023-07-03, lint did not accept empty statements
70*e16f398bSrillig  * in GCC statement expressions.  These empty statements can be generated by a
71*e16f398bSrillig  * disabled 'assert' macro.
726ab24c0bSrillig  */
736ab24c0bSrillig unsigned int
empty_statement(void)746ab24c0bSrillig empty_statement(void)
756ab24c0bSrillig {
766ab24c0bSrillig 	return ({
776ab24c0bSrillig 		unsigned int mega = 1 << 20;
786ab24c0bSrillig 		;
796ab24c0bSrillig 		mega;
806ab24c0bSrillig 	});
816ab24c0bSrillig }
82