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