From 951bf7bdb208f500c86e8d45c45247cd25adb4ab Mon Sep 17 00:00:00 2001 From: xleroy Date: Mon, 12 May 2014 08:20:14 +0000 Subject: Incorrect conversion of K&R functions. Example of problem: void * foo(s, u) ... git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2491 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- cparser/Cabshelper.ml | 7 +++++++ cparser/Elab.ml | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cparser/Cabshelper.ml b/cparser/Cabshelper.ml index 7f411ad..35aa0c4 100644 --- a/cparser/Cabshelper.ml +++ b/cparser/Cabshelper.ml @@ -78,3 +78,10 @@ let string_of_cabsloc l = let format_cabsloc pp l = Format.fprintf pp "%s:%d" l.filename l.lineno + +let rec append_decltype dt1 dt2 = + match dt1 with + | JUSTBASE -> dt2 + | ARRAY(dt, attr, sz) -> ARRAY(append_decltype dt dt2, attr, sz) + | PTR(attr, dt) -> PTR(attr, append_decltype dt dt2) + | PROTO(dt, params) -> PROTO(append_decltype dt dt2, params) diff --git a/cparser/Elab.ml b/cparser/Elab.ml index f4b2061..542ee18 100644 --- a/cparser/Elab.ml +++ b/cparser/Elab.ml @@ -1878,7 +1878,7 @@ let elab_fundef env spec name body loc = env1 let elab_kr_fundef env spec name params defs body loc = - warning loc "Non-prototype, pre-standard function definition.@ Converting to prototype form."; + warning loc "Non-prototype, pre-standard function definition.@ Converting to prototype form"; (* Check that the declarations only declare parameters *) let check_one_decl (Init_name(Name(s, dty, attrs, loc'), ie)) = if not (List.mem s params) then @@ -1914,7 +1914,8 @@ let elab_kr_fundef env spec name params defs body loc = List.map (fun p -> convert_param p defs) params in let name' = let (Name(s, dty, attr, loc')) = name in - Name(s, PROTO(dty, (params', false)), attr, loc') in + Name(s, append_decltype dty (PROTO(JUSTBASE, (params', false))), + attr, loc') in (* Elaborate the prototyped form *) elab_fundef env spec name' body loc -- cgit v1.2.3