1 1.5 rillig /* $NetBSD: d_gcc_compound_statements2.c,v 1.5 2022/02/26 20:36:11 rillig Exp $ */ 2 1.2 rillig # 3 "d_gcc_compound_statements2.c" 3 1.2 rillig 4 1.5 rillig /* 5 1.5 rillig * GCC statement expressions with non-expressions. 6 1.5 rillig * 7 1.5 rillig * https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 8 1.5 rillig */ 9 1.5 rillig 10 1.1 jruoho struct cpu_info { 11 1.1 jruoho int bar; 12 1.1 jruoho }; 13 1.1 jruoho 14 1.1 jruoho int 15 1.5 rillig statement_expr_with_decl_and_stmt(void) 16 1.1 jruoho { 17 1.1 jruoho return ({ 18 1.3 rillig struct cpu_info *ci; 19 1.3 rillig __asm__ volatile("movl %%fs:4,%0":"=r" (ci)); 20 1.3 rillig ci; 21 1.1 jruoho })->bar; 22 1.1 jruoho } 23 1.3 rillig 24 1.3 rillig int 25 1.5 rillig statement_expr_with_only_stmt(void) 26 1.3 rillig { 27 1.3 rillig struct cpu_info ci = { 0 }; 28 1.3 rillig return ({ 29 1.4 rillig if (ci.bar > 0) 30 1.4 rillig ci.bar++; 31 1.4 rillig ci; 32 1.3 rillig }).bar; 33 1.3 rillig } 34 1.5 rillig 35 1.5 rillig /* 36 1.5 rillig * Since main1.c 1.58 from 2021-12-17 and before tree.c 1.404 from 37 1.5 rillig * 2022-02-26, lint ran into an assertion failure due to a use-after-free. 38 1.5 rillig * When typeok checked the operand types of the '=', the left node and the 39 1.5 rillig * right node overlapped by 16 out of their 40 bytes on x86_64. 40 1.5 rillig */ 41 1.5 rillig void 42 1.5 rillig statement_expr_with_loop(unsigned u) 43 1.5 rillig { 44 1.5 rillig u = ({ 45 1.5 rillig do { 46 1.5 rillig } while (0); 47 1.5 rillig u; 48 1.5 rillig }); 49 1.5 rillig } 50