aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Bitfields.ml
diff options
context:
space:
mode:
Diffstat (limited to 'cparser/Bitfields.ml')
-rw-r--r--cparser/Bitfields.ml15
1 files changed, 12 insertions, 3 deletions
diff --git a/cparser/Bitfields.ml b/cparser/Bitfields.ml
index baf2b0ec..9ac9b61f 100644
--- a/cparser/Bitfields.ml
+++ b/cparser/Bitfields.ml
@@ -40,6 +40,10 @@ type bitfield_info =
0 < pos + sz <= bitsizeof(int)
*)
+let carrier_field bf =
+ { fld_name = bf.bf_carrier; fld_typ = bf.bf_carrier_typ;
+ fld_bitfield = None; fld_anonymous = false }
+
(* Mapping (struct identifier, bitfield name) -> bitfield info *)
let bitfield_table =
@@ -336,8 +340,7 @@ let rec transf_struct_init id fld_init_list =
| Some bf ->
let (el, rem') =
pack_bitfield_init id bf.bf_carrier fld_init_list in
- ({fld_name = bf.bf_carrier; fld_typ = bf.bf_carrier_typ;
- fld_bitfield = None; fld_anonymous = false},
+ (carrier_field bf,
Init_single {edesc = ECast(bf.bf_carrier_typ, or_expr_list el);
etyp = bf.bf_carrier_typ})
:: transf_struct_init id rem'
@@ -504,7 +507,13 @@ and transf_init env i =
let fld_init_list' =
List.map (fun (f, i) -> (f, transf_init env i)) fld_init_list in
Init_struct(id, transf_struct_init id fld_init_list')
- | Init_union(id, fld, i) -> Init_union(id, fld, transf_init env i)
+ | Init_union(id, fld, i) ->
+ let i' = transf_init env i in
+ match is_bitfield id fld.fld_name with
+ | None ->
+ Init_union(id, fld, i')
+ | Some bf ->
+ Init_union(id, carrier_field bf, Init_single (bitfield_initializer bf i'))
(* Declarations *)