NetBSD/tests/usr.bin/xlint/lint1/gcc_init_compound_literal.c

60 lines
1.5 KiB
C

/* $NetBSD: gcc_init_compound_literal.c,v 1.8 2023/07/29 07:49:15 rillig Exp $ */
# 3 "gcc_init_compound_literal.c"
/*
* C99 says in 6.7.8p4:
*
* All the expressions in an initializer for an object that has static
* storage duration shall be constant expressions or string literals.
*
* The term "constant expression" is defined in C99 6.6, where 6.6p9 allows
* "constant expressions" in initializers to also be an "address constant".
* Using these address constants, it is possible to reference an unnamed
* object created by a compound literal (C99 6.5.2.5), using either an
* explicit '&' or the implicit array-to-pointer conversion from C99 6.3.2.1.
*
* Before init.c 1.195 from 2021-04-17, an assertion in check_global_variable
* failed since these temporary objects have neither storage class EXTERN nor
* STATIC.
*/
/* lint1-extra-flags: -X 351 */
// Seen in sys/crypto/aes/aes_ccm.c.
const struct {
const unsigned char *ctxt;
} T = {
.ctxt = (const unsigned char[4]){
1, 2, 3, 4
},
};
struct node {
int num;
struct node *left;
struct node *right;
};
/*
* Initial tree for representing the decisions in the classic number guessing
* game often used in teaching the basics of programming.
*/
/* expect+1: warning: static variable 'guess' unused [226] */
static const struct node guess = {
50,
&(struct node){
25,
&(struct node){
12,
(void *)0,
(void *)0,
},
&(struct node){
37,
(void *)0,
(void *)0,
},
},
(void *)0
};