From 6ede270e6f386a099bc898307168e75ebd819c7e Mon Sep 17 00:00:00 2001 From: Bernhard Schommer Date: Tue, 21 Sep 2021 16:30:19 +0200 Subject: 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 --- cparser/Elab.ml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'cparser/Elab.ml') 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 -- cgit