diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2018-04-21 18:16:38 +0300 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2018-04-25 14:27:31 +0200 |
commit | f016c51503ceff5354e12b27f22ae33172b8fb0e (patch) | |
tree | f17716f0fc9910bb7c80bd1371a22e490e3e2566 /cparser/Bitfields.ml | |
parent | 0a15edfb0c49242fcc8f772ed39f167a40e3b25e (diff) | |
download | compcert-f016c51503ceff5354e12b27f22ae33172b8fb0e.tar.gz compcert-f016c51503ceff5354e12b27f22ae33172b8fb0e.zip |
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
Diffstat (limited to 'cparser/Bitfields.ml')
-rw-r--r-- | cparser/Bitfields.ml | 15 |
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 *) |