diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2021-09-21 16:30:19 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2021-09-28 10:25:35 +0200 |
commit | 6ede270e6f386a099bc898307168e75ebd819c7e (patch) | |
tree | f5f1e6d35f383da93346ff38e05a87b2f104f1a9 /cparser/Elab.ml | |
parent | 2892e2caa89f927062824ca901562d085a76d619 (diff) | |
download | compcert-kvx-6ede270e6f386a099bc898307168e75ebd819c7e.tar.gz compcert-kvx-6ede270e6f386a099bc898307168e75ebd819c7e.zip |
Ignore unnamed bit fields for initialization of unions
When a union is initialized with an initializer without designator the
first named member should be initialized. This commit skips members
without names during the elaboration of union initializers.
Note that anonymous members (unnamed members of struct or union type)
should not be skipped, and are not skipped since elaboration give names
to these members.
Bug 31982
Diffstat (limited to 'cparser/Elab.ml')
-rw-r--r-- | cparser/Elab.ml | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/cparser/Elab.ml b/cparser/Elab.ml index a78dc9d9..c2c7f943 100644 --- a/cparser/Elab.ml +++ b/cparser/Elab.ml @@ -1402,14 +1402,18 @@ module I = struct | TStruct(id, _), Init_struct(id', (fld1, i1) :: flds) -> OK(Zstruct(z, id, [], fld1, flds), i1) | TUnion(id, _), Init_union(id', fld, i) -> - begin match (Env.find_union env id).Env.ci_members with + let rec first_named = function | [] -> NotFound - | fld1 :: _ -> + | fld1 :: fl -> + if fld1.fld_name = "" then + first_named fl + else begin OK(Zunion(z, id, fld1), if fld.fld_name = fld1.fld_name then i else default_init env fld1.fld_typ) - end + end in + first_named (Env.find_union env id).Env.ci_members | (TStruct _ | TUnion _), Init_single a -> (* This is a previous whole-struct initialization that we are going to overwrite. Hard to support correctly |