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)21e4ab72eaSrilligvoid 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)4422368870Srilligfunction(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)57bbec5f69Srilligcrash(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)746ab24c0bSrilligempty_statement(void) 756ab24c0bSrillig { 766ab24c0bSrillig return ({ 776ab24c0bSrillig unsigned int mega = 1 << 20; 786ab24c0bSrillig ; 796ab24c0bSrillig mega; 806ab24c0bSrillig }); 816ab24c0bSrillig } 82