gcc_statement_expression.c revision 1.2
11.2Srillig/*	$NetBSD: gcc_statement_expression.c,v 1.2 2023/07/15 13:51:36 rillig Exp $	*/
21.1Srillig# 3 "gcc_statement_expression.c"
31.1Srillig
41.1Srillig/*
51.1Srillig * Tests for the GCC extension 'statement expressions', which allows a block of
61.1Srillig * statements to occur as part of an expression.
71.1Srillig */
81.1Srillig
91.1Srillig
101.1Srillig// Ensure that the inner types are accessible from outside the block.
111.1Srillig// Depending on the memory management strategy, the inner types might be freed
121.1Srillig// too early.
131.1Srilligstatic inline int
141.1Srilliguse_inner_type_from_outside(void)
151.1Srillig{
161.1Srillig	int x = ({
171.1Srillig		struct outer {
181.1Srillig			struct inner {
191.1Srillig				int member;
201.1Srillig			} inner;
211.1Srillig		} outer = { { 3 } };
221.2Srillig		outer;
231.2Srillig	}).inner.member;
241.2Srillig	/* expect-1: error: type 'struct outer' does not have member 'inner' [101] */
251.2Srillig	/* expect-2: error: type 'int' does not have member 'member' [101] */
261.2Srillig	/*
271.2Srillig	 * FIXME: The above types must not be removed from the symbol table
281.2Srillig	 * yet; at least, their member names must still be known.
291.2Srillig	 */
301.2Srillig
311.1Srillig	return x;
321.1Srillig}
33