aboutsummaryrefslogtreecommitdiffstats
path: root/cparser
diff options
context:
space:
mode:
Diffstat (limited to 'cparser')
-rw-r--r--cparser/Cutil.ml13
-rw-r--r--cparser/Elab.ml10
2 files changed, 16 insertions, 7 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 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