xref: /netbsd-src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements2.c (revision e6298b924c5ba98f3a22919b56dab04a87cdbb1c)
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)171887ef10Srillig statement_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)271887ef10Srillig statement_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)441887ef10Srillig statement_expr_with_loop(unsigned u)
451887ef10Srillig {
461887ef10Srillig 	u = ({
471887ef10Srillig 		do {
481887ef10Srillig 		} while (0);
491887ef10Srillig 		u;
501887ef10Srillig 	});
511887ef10Srillig }
52