gcc_statement_expression.c revision 1.2
1/*	$NetBSD: gcc_statement_expression.c,v 1.2 2023/07/15 13:51:36 rillig Exp $	*/
2# 3 "gcc_statement_expression.c"
3
4/*
5 * Tests for the GCC extension 'statement expressions', which allows a block of
6 * statements to occur as part of an expression.
7 */
8
9
10// Ensure that the inner types are accessible from outside the block.
11// Depending on the memory management strategy, the inner types might be freed
12// too early.
13static inline int
14use_inner_type_from_outside(void)
15{
16	int x = ({
17		struct outer {
18			struct inner {
19				int member;
20			} inner;
21		} outer = { { 3 } };
22		outer;
23	}).inner.member;
24	/* expect-1: error: type 'struct outer' does not have member 'inner' [101] */
25	/* expect-2: error: type 'int' does not have member 'member' [101] */
26	/*
27	 * FIXME: The above types must not be removed from the symbol table
28	 * yet; at least, their member names must still be known.
29	 */
30
31	return x;
32}
33