diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2016-12-12 13:41:55 +0100 |
---|---|---|
committer | Bernhard Schommer <bernhardschommer@gmail.com> | 2016-12-12 13:41:55 +0100 |
commit | 5d8085e17db7ea39720d185564b46e72ac22058b (patch) | |
tree | 07325cada3f6b344276ff47d5664b17c7a8b19bf /cparser | |
parent | 10c99650f3f696d6970a62861478ca6a021465b3 (diff) | |
download | compcert-5d8085e17db7ea39720d185564b46e72ac22058b.tar.gz compcert-5d8085e17db7ea39720d185564b46e72ac22058b.zip |
Added code for initializers. Bug 20003
Diffstat (limited to 'cparser')
-rw-r--r-- | cparser/Elab.ml | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/cparser/Elab.ml b/cparser/Elab.ml index 866468ac..72cac164 100644 --- a/cparser/Elab.ml +++ b/cparser/Elab.ml @@ -1179,7 +1179,19 @@ module I = struct end else None | _, _ -> - None + None + + let has_member env name ty = + let mem f id = + try + ignore(f env (id,name)); true + with _ -> false in + match ty with + | TStruct (id,_) -> + mem Env.find_struct_member id + | TUnion (id,_) -> + mem Env.find_union_member id + | _ -> false (* Move to the member named [name] of the current point, which must be a struct or a union. *) @@ -1192,6 +1204,9 @@ module I = struct | (fld, i as f_i) :: after -> if fld.fld_name = name then Some(Zstruct(z, id, before, fld, after), i) + else if fld.fld_anonymous && has_member env name fld.fld_typ then + let zi = (Zstruct(z, id, before, fld, after), i) in + member env zi name else find (f_i :: before) after in find [] flds @@ -1204,6 +1219,9 @@ module I = struct | fld1 :: rem -> if fld1.fld_name = name then Some(Zunion(z, id, fld1), default_init env fld1.fld_typ) + else if fld.fld_anonymous && has_member env name fld.fld_typ then + let zi = (Zunion(z, id, fld1),default_init env fld1.fld_typ) in + member env zi name else find rem in find (Env.find_union env id).ci_members |