From f016c51503ceff5354e12b27f22ae33172b8fb0e Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Sat, 21 Apr 2018 18:16:38 +0300 Subject: Initialization of union bit fields Bit fields in unions were initialized like normal fields, causing mismatch on the name of the field. Also: added function Bitfields.carrier_field and refactored. Patch by Bernhard Schommer. Bug 23362 --- cparser/Bitfields.ml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'cparser/Bitfields.ml') 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 *) -- cgit