]> git.ipfire.org Git - thirdparty/gcc.git/commit
c: Support C2x empty initializer braces
authorJoseph Myers <joseph@codesourcery.com>
Thu, 25 Aug 2022 21:02:57 +0000 (21:02 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 25 Aug 2022 21:04:12 +0000 (21:04 +0000)
commit14cfa01755a66afbae2539f8b5796c960ddcecc6
treec918ea16751a1e9d6478c032631a349c3842bfba
parent072d3115c0e297d91c133c4214b357b0a50557b9
c: Support C2x empty initializer braces

ISO C2x standardizes empty initializer braces {}.  Implement this
feature accordingly.  The basic case was already supported and so just
needed diagnostic adjustments.  However, the standard feature also
includes two cases that were not previously supported: empty
initializer braces for scalars, and empty initializer braces for
VLAs.  Thus, add support for those features as well, updating existing
tests that expected them to be diagnosed.

There was already some gimplifier support for converting
variable-sized initializations with empty CONSTRUCTORs to memset.
However, it didn't apply here; code earlier in gimplify_modify_expr
ended up calling gimplify_init_constructor via
gimplify_modify_expr_rhs, which ended up handling the CONSTRUCTOR in a
way that generated an ICE later.  Add a check for this case earlier in
gimplify_modify_expr to avoid that issue.

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc/
* gimplify.cc (gimplify_modify_expr): Convert initialization from
a variable-size CONSTRUCTOR to memset before call to
gimplify_modify_expr_rhs.

gcc/c/
* c-decl.cc (start_decl): Do not diagnose initialization of
variable-sized objects here.
* c-parser.cc (c_parser_braced_init): Add argument DECL.  All
callers changed.
(c_parser_initializer): Diagnose initialization of variable-sized
objects other than with braced initializer.
(c_parser_braced_init): Use pedwarn_c11 for empty initializer
braces and update diagnostic text.  Diagnose initialization of
variable-sized objects with nonempty braces.
* c-typeck.cc (digest_init): Update diagnostic for initialization
of variable-sized objects.
(really_start_incremental_init, set_designator)
(process_init_element): Update comments.
(pop_init_level): Allow scalar empty initializers.

gcc/testsuite/
* gcc.dg/c11-empty-init-1.c, gcc.dg/c11-empty-init-2.c,
gcc.dg/c11-empty-init-3.c, gcc.dg/c2x-empty-init-1.c,
gcc.dg/c2x-empty-init-2.c, gcc.dg/c2x-empty-init-3.c,
gcc.dg/gnu2x-empty-init-1.c, gcc.dg/gnu2x-empty-init-2.c: New
tests.
* gcc.dg/torture/dfp-default-init-1.c: Also test empty
initializers.
* gcc.dg/init-bad-1.c, gcc.dg/noncompile/pr71583.c,
gcc.dg/pr61096-1.c, gcc.dg/vla-init-2.c, gcc.dg/vla-init-3.c,
gcc.target/i386/sse2-bfloat16-scalar-typecheck.c: Update expected
diagnostics.
* gcc.dg/ubsan/c-shift-1.c: Use nonempty initializers for VLA
initializations expected to be diagnosed.
20 files changed:
gcc/c/c-decl.cc
gcc/c/c-parser.cc
gcc/c/c-typeck.cc
gcc/gimplify.cc
gcc/testsuite/gcc.dg/c11-empty-init-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c11-empty-init-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c11-empty-init-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-empty-init-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-empty-init-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-empty-init-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gnu2x-empty-init-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gnu2x-empty-init-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/init-bad-1.c
gcc/testsuite/gcc.dg/noncompile/pr71583.c
gcc/testsuite/gcc.dg/pr61096-1.c
gcc/testsuite/gcc.dg/torture/dfp-default-init-1.c
gcc/testsuite/gcc.dg/ubsan/c-shift-1.c
gcc/testsuite/gcc.dg/vla-init-2.c
gcc/testsuite/gcc.dg/vla-init-3.c
gcc/testsuite/gcc.target/i386/sse2-bfloat16-scalar-typecheck.c