Module Name: src Committed By: rillig Date: Wed Jun 28 15:04:07 UTC 2023
Modified Files: src/tests/usr.bin/xlint/lint1: init_braces.c Log Message: tests/lint: demonstrate wrong handling of nested initializer Seen in external/bsd/jemalloc/dist/src/jemalloc.c, init_lock. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/xlint/lint1/init_braces.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/xlint/lint1/init_braces.c diff -u src/tests/usr.bin/xlint/lint1/init_braces.c:1.2 src/tests/usr.bin/xlint/lint1/init_braces.c:1.3 --- src/tests/usr.bin/xlint/lint1/init_braces.c:1.2 Wed Jun 22 19:23:18 2022 +++ src/tests/usr.bin/xlint/lint1/init_braces.c Wed Jun 28 15:04:07 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: init_braces.c,v 1.2 2022/06/22 19:23:18 rillig Exp $ */ +/* $NetBSD: init_braces.c,v 1.3 2023/06/28 15:04:07 rillig Exp $ */ # 3 "init_braces.c" /* @@ -12,8 +12,8 @@ void init_int(void) { - /* gcc-expect+2: error: invalid initializer */ - /* clang-expect+1: error: array initializer must be an initializer list */ + /* gcc-expect+4: error: invalid initializer */ + /* clang-expect+3: error: array initializer must be an initializer list */ /* expect+2: error: {}-enclosed initializer required [181] */ /* expect+1: error: empty array declaration for 'num0' [190] */ int num0[] = 0; @@ -61,3 +61,39 @@ init_string(void) /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */ char name4[] = {{{{ "" }}}}; } + +unsigned long +init_nested_struct_and_union(void) +{ + struct time { + unsigned long ns; + }; + + struct times { + struct time t0; + struct time t1; + }; + + struct outer { + union { + struct { + struct times times; + }; + }; + }; + + struct outer var = { /* struct outer */ + { /* unnamed union */ + { /* unnamed struct */ +/* FIXME: GCC and Clang both compile this initializer. */ +/* expect+1: error: type 'struct time' does not have member 'times' [101] */ + .times = { + .t0 = { .ns = 0, }, + .t1 = { .ns = 0, }, + }, + }, + }, + }; + + return var.times.t0.ns; +}