aboutsummaryrefslogtreecommitdiffstats
path: root/cparser
diff options
context:
space:
mode:
authorDavid Monniaux <David.Monniaux@univ-grenoble-alpes.fr>2021-09-28 11:36:48 +0200
committerDavid Monniaux <David.Monniaux@univ-grenoble-alpes.fr>2021-09-28 11:36:48 +0200
commit539b81a1a8823fb4aac64a9493bf0bafea2f2560 (patch)
tree0dd9bb78f4e08889320e51812fd6c38b3fa7ad19 /cparser
parent95836bb256258951d10d1c5b59db6352ce241a12 (diff)
parent6ede270e6f386a099bc898307168e75ebd819c7e (diff)
downloadcompcert-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.ml13
-rw-r--r--cparser/Elab.ml35
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