diff options
author | David Monniaux <David.Monniaux@univ-grenoble-alpes.fr> | 2021-09-28 11:36:48 +0200 |
---|---|---|
committer | David Monniaux <David.Monniaux@univ-grenoble-alpes.fr> | 2021-09-28 11:36:48 +0200 |
commit | 539b81a1a8823fb4aac64a9493bf0bafea2f2560 (patch) | |
tree | 0dd9bb78f4e08889320e51812fd6c38b3fa7ad19 /cparser | |
parent | 95836bb256258951d10d1c5b59db6352ce241a12 (diff) | |
parent | 6ede270e6f386a099bc898307168e75ebd819c7e (diff) | |
download | compcert-kvx-539b81a1a8823fb4aac64a9493bf0bafea2f2560.tar.gz compcert-kvx-539b81a1a8823fb4aac64a9493bf0bafea2f2560.zip |
Merge branch 'master' of https://github.com/AbsInt/CompCert into towards_3.10
Diffstat (limited to 'cparser')
-rw-r--r-- | cparser/Cutil.ml | 13 | ||||
-rw-r--r-- | cparser/Elab.ml | 35 |
2 files changed, 31 insertions, 17 deletions
diff --git a/cparser/Cutil.ml b/cparser/Cutil.ml index d3a830ce..bcdea107 100644 --- a/cparser/Cutil.ml +++ b/cparser/Cutil.ml @@ -1263,11 +1263,16 @@ let rec default_init env ty = let ci = Env.find_struct env id in Init_struct(id, default_init_fields ci.ci_members) | TUnion(id, _) -> - let ci = Env.find_union env id in - begin match ci.ci_members with + let ci = Env.find_union env id in + let rec default_init_field = function | [] -> raise No_default_init - | fld :: _ -> Init_union(id, fld, default_init env fld.fld_typ) - end + | fld :: fl -> + if fld.fld_name = "" then + default_init_field fl + else + Init_union(id, fld, default_init env fld.fld_typ) + in + default_init_field ci.ci_members | _ -> raise No_default_init diff --git a/cparser/Elab.ml b/cparser/Elab.ml index 594453b8..4fae584e 100644 --- a/cparser/Elab.ml +++ b/cparser/Elab.ml @@ -125,14 +125,15 @@ let rec mmap f env = function let (tl', env2) = mmap f env1 tl in (hd' :: tl', env2) -let rec mmap2 f env l1 l2 = +let rec mmap2_filter f env l1 l2 = match l1,l2 with - | [],[] -> [],env - | a1::l1,a2::l2 -> - let hd,env1 = f env a1 a2 in - let tl,env2 = mmap2 f env1 l1 l2 in - (hd::tl,env2) - | _, _ -> invalid_arg "mmap2" + | [], [] -> ([], env) + | a1 :: l1, a2 :: l2 -> + let (opt_hd, env1) = f env a1 a2 in + let (tl, env2) = mmap2_filter f env1 l1 l2 in + ((match opt_hd with Some hd -> hd :: tl | None -> tl), env2) + | _, _ -> + invalid_arg "mmap2_filter" (* To detect redefinitions within the same scope *) @@ -1064,11 +1065,15 @@ and elab_field_group env = function if is_qualified_array ty then error loc "type qualifier used in array declarator outside of function prototype"; let anon_composite = is_anonymous_composite ty in - if id = "" && not anon_composite && optbitsize = None then + if id = "" && not anon_composite && optbitsize = None then begin warning loc Missing_declarations "declaration does not declare anything"; - { fld_name = id; fld_typ = ty; fld_bitfield = optbitsize'; fld_anonymous = id = "" && anon_composite},env' + None, env' + end else + Some { fld_name = id; fld_typ = ty; fld_bitfield = optbitsize'; + fld_anonymous = id = "" && anon_composite}, + env' in - (mmap2 elab_bitfield env' fieldlist names) + (mmap2_filter elab_bitfield env' fieldlist names) | Field_group_static_assert(exp, loc_exp, msg, loc_msg, loc) -> elab_static_assert env exp loc_exp msg loc_msg loc; @@ -1427,14 +1432,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 |