1*e6298b92Srillig /* $NetBSD: d_gcc_compound_statements2.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */ 2aadcb6a6Srillig # 3 "d_gcc_compound_statements2.c" 3aadcb6a6Srillig 41887ef10Srillig /* 51887ef10Srillig * GCC statement expressions with non-expressions. 61887ef10Srillig * 71887ef10Srillig * https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 81887ef10Srillig */ 91887ef10Srillig 10*e6298b92Srillig /* lint1-extra-flags: -X 351 */ 11*e6298b92Srillig 1228604916Sjruoho struct cpu_info { 1328604916Sjruoho int bar; 1428604916Sjruoho }; 1528604916Sjruoho 1628604916Sjruoho int statement_expr_with_decl_and_stmt(void)171887ef10Srilligstatement_expr_with_decl_and_stmt(void) 1828604916Sjruoho { 1928604916Sjruoho return ({ 20cd383233Srillig struct cpu_info *ci; 21cd383233Srillig __asm__ volatile("movl %%fs:4,%0":"=r" (ci)); 22cd383233Srillig ci; 2328604916Sjruoho })->bar; 2428604916Sjruoho } 25cd383233Srillig 26cd383233Srillig int statement_expr_with_only_stmt(void)271887ef10Srilligstatement_expr_with_only_stmt(void) 28cd383233Srillig { 29cd383233Srillig struct cpu_info ci = { 0 }; 30cd383233Srillig return ({ 31cd383233Srillig if (ci.bar > 0) 32cd383233Srillig ci.bar++; 33cd383233Srillig ci; 34cd383233Srillig }).bar; 35cd383233Srillig } 361887ef10Srillig 371887ef10Srillig /* 381887ef10Srillig * Since main1.c 1.58 from 2021-12-17 and before tree.c 1.404 from 391887ef10Srillig * 2022-02-26, lint ran into an assertion failure due to a use-after-free. 401887ef10Srillig * When typeok checked the operand types of the '=', the left node and the 411887ef10Srillig * right node overlapped by 16 out of their 40 bytes on x86_64. 421887ef10Srillig */ 431887ef10Srillig void statement_expr_with_loop(unsigned u)441887ef10Srilligstatement_expr_with_loop(unsigned u) 451887ef10Srillig { 461887ef10Srillig u = ({ 471887ef10Srillig do { 481887ef10Srillig } while (0); 491887ef10Srillig u; 501887ef10Srillig }); 511887ef10Srillig } 52