gcc_init_compound_literal.c revision 1.1
11.1Srillig/*	$NetBSD: gcc_init_compound_literal.c,v 1.1 2021/04/17 20:36:17 rillig Exp $	*/
21.1Srillig# 3 "gcc_init_compound_literal.c"
31.1Srillig
41.1Srillig/*
51.1Srillig * C99 says in 6.7.8p4:
61.1Srillig *
71.1Srillig *	All the expressions in an initializer for an object that has static
81.1Srillig *	storage duration shall be constant expressions or string literals.
91.1Srillig *
101.1Srillig * The term "constant expression" is defined in C99 6.6 and is quite
111.1Srillig * restricted, except for a single paragraph, 6.6p10:
121.1Srillig *
131.1Srillig *	An implementation may accept other forms of constant expressions.
141.1Srillig *
151.1Srillig * GCC additionally allows compound expressions, and these can even use the
161.1Srillig * array-to-pointer conversion from C99 6.3.2.1, which allows to initialize a
171.1Srillig * pointer object with a pointer to a direct-value statically allocated array.
181.1Srillig */
191.1Srillig
201.1Srillig// Seen in sys/crypto/aes/aes_ccm.c.
211.1Srilligconst struct {
221.1Srillig    const unsigned char *ctxt;
231.1Srillig} T = {
241.1Srillig	(void *)0,
251.1Srillig	(void *)0,	/* expect: too many struct/union initializers */
261.1Srillig// FIXME: lint: assertion "sym->s_scl == EXTERN || sym->s_scl == STATIC" failed
271.1Srillig//	.ctxt = (const unsigned char[4]){
281.1Srillig//	    1, 2, 3, 4
291.1Srillig//	},
301.1Srillig};
31