1 1.14 rillig /* $NetBSD: d_gcc_compound_statements1.c,v 1.14 2023/07/02 22:56:13 rillig Exp $ */ 2 1.2 rillig # 3 "d_gcc_compound_statements1.c" 3 1.2 rillig 4 1.4 rillig /* GCC compound statement with expression */ 5 1.1 jruoho 6 1.12 rillig /* lint1-extra-flags: -X 351 */ 7 1.12 rillig 8 1.10 rillig /* 9 1.10 rillig * Compound statements are only allowed in functions, not at file scope. 10 1.10 rillig * 11 1.11 rillig * Before decl.c 1.283 from 2022-05-31, lint crashed with a segmentation 12 1.10 rillig * fault due to the unused label. 13 1.10 rillig */ 14 1.10 rillig int invalid_gcc_statement_expression = ({ 15 1.10 rillig unused_label: 16 1.10 rillig 3; 17 1.10 rillig /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */ 18 1.10 rillig /* expect+1: error: cannot initialize 'int' from 'void' [185] */ 19 1.10 rillig }); 20 1.10 rillig 21 1.9 rillig void foo(unsigned long z) 22 1.1 jruoho { 23 1.3 rillig z = ({ 24 1.3 rillig unsigned long tmp; 25 1.3 rillig tmp = 1; 26 1.3 rillig tmp; 27 1.3 rillig }); 28 1.1 jruoho foo(z); 29 1.1 jruoho } 30 1.5 rillig 31 1.5 rillig /* 32 1.5 rillig * Compound statements are only allowed in functions, not at file scope. 33 1.5 rillig * 34 1.5 rillig * Before decl.c 1.186 from 2021-06-19, lint crashed with a segmentation 35 1.5 rillig * fault. 36 1.5 rillig */ 37 1.5 rillig int c = ({ 38 1.7 rillig /* expect+1: error: syntax error 'return outside function' [249] */ 39 1.7 rillig return 3; 40 1.7 rillig }); 41 1.7 rillig /* expect-1: error: cannot initialize 'int' from 'void' [185] */ 42 1.6 rillig 43 1.6 rillig void 44 1.6 rillig function(void) 45 1.6 rillig { 46 1.6 rillig /* 47 1.6 rillig * Before cgram.y 1.229 from 2021-06-20, lint crashed due to the 48 1.6 rillig * syntax error, which made an expression NULL. 49 1.6 rillig */ 50 1.6 rillig ({ 51 1.7 rillig /* expect+1: error: type 'int' does not have member 'e' [101] */ 52 1.7 rillig 0->e; 53 1.6 rillig }); 54 1.6 rillig } 55 1.8 rillig 56 1.8 rillig void 57 1.8 rillig crash(void) 58 1.8 rillig { 59 1.8 rillig /* 60 1.8 rillig * Before tree.c 1.418 from 2022-04-03, lint dereferenced a null 61 1.8 rillig * pointer in do_statement_expr. 62 1.8 rillig */ 63 1.8 rillig ({ 64 1.8 rillig ; 65 1.8 rillig }); 66 1.8 rillig } 67 1.13 rillig 68 1.13 rillig /* 69 1.14 rillig * Before cgram.y 1.445 from 2023-07-03, lint did not accept empty statements 70 1.14 rillig * in GCC statement expressions. These empty statements can be generated by a 71 1.14 rillig * disabled 'assert' macro. 72 1.13 rillig */ 73 1.13 rillig unsigned int 74 1.13 rillig empty_statement(void) 75 1.13 rillig { 76 1.13 rillig return ({ 77 1.13 rillig unsigned int mega = 1 << 20; 78 1.13 rillig ; 79 1.13 rillig mega; 80 1.13 rillig }); 81 1.13 rillig } 82