1 /* $NetBSD: gcc_init_compound_literal.c,v 1.8 2023/07/29 07:49:15 rillig Exp $ */ 2 # 3 "gcc_init_compound_literal.c" 3 4 /* 5 * C99 says in 6.7.8p4: 6 * 7 * All the expressions in an initializer for an object that has static 8 * storage duration shall be constant expressions or string literals. 9 * 10 * The term "constant expression" is defined in C99 6.6, where 6.6p9 allows 11 * "constant expressions" in initializers to also be an "address constant". 12 * Using these address constants, it is possible to reference an unnamed 13 * object created by a compound literal (C99 6.5.2.5), using either an 14 * explicit '&' or the implicit array-to-pointer conversion from C99 6.3.2.1. 15 * 16 * Before init.c 1.195 from 2021-04-17, an assertion in check_global_variable 17 * failed since these temporary objects have neither storage class EXTERN nor 18 * STATIC. 19 */ 20 21 /* lint1-extra-flags: -X 351 */ 22 23 // Seen in sys/crypto/aes/aes_ccm.c. 24 const struct { 25 const unsigned char *ctxt; 26 } T = { 27 .ctxt = (const unsigned char[4]){ 28 1, 2, 3, 4 29 }, 30 }; 31 32 struct node { 33 int num; 34 struct node *left; 35 struct node *right; 36 }; 37 38 /* 39 * Initial tree for representing the decisions in the classic number guessing 40 * game often used in teaching the basics of programming. 41 */ 42 /* expect+1: warning: static variable 'guess' unused [226] */ 43 static const struct node guess = { 44 50, 45 &(struct node){ 46 25, 47 &(struct node){ 48 12, 49 (void *)0, 50 (void *)0, 51 }, 52 &(struct node){ 53 37, 54 (void *)0, 55 (void *)0, 56 }, 57 }, 58 (void *)0 59 }; 60