From 0b35c31e5bb6ec453a23a5cb0fb93fcbb22c1626 Mon Sep 17 00:00:00 2001 From: eck Date: Tue, 4 Dec 1990 11:09:34 +0000 Subject: [PATCH] fixed bug with function returning pointer to function --- lang/cem/cemcom.ansi/idf.c | 5 ++++- lang/cem/cemcom.ansi/proto.c | 10 +++++++++- lang/cem/cemcom.ansi/type.c | 1 - 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lang/cem/cemcom.ansi/idf.c b/lang/cem/cemcom.ansi/idf.c index 30bbce415..305d819bf 100644 --- a/lang/cem/cemcom.ansi/idf.c +++ b/lang/cem/cemcom.ansi/idf.c @@ -560,8 +560,11 @@ check_formals(idf, dc) return; } - while (du && du->du_fund != FUNCTION) + while (du + && (du->du_fund != FUNCTION + || du->next != (struct decl_unary *) 0)) { du = du->next; + } if (!du) return; /* terrible error, signalled earlier */ if (du->du_proto) return; diff --git a/lang/cem/cemcom.ansi/proto.c b/lang/cem/cemcom.ansi/proto.c index c639f60a2..309934e52 100644 --- a/lang/cem/cemcom.ansi/proto.c +++ b/lang/cem/cemcom.ansi/proto.c @@ -176,6 +176,7 @@ struct idf **idpp; return tg; } + declare_protos(dc) register struct declarator *dc; { @@ -193,8 +194,15 @@ declare_protos(dc) dumpidftab("start declare_protos", 0); #endif DEBUG du = dc->dc_decl_unary; - while (du && du->du_fund != FUNCTION) + while (du) { + if (du->du_fund == FUNCTION) { + if (du->next != (struct decl_unary *) 0) { + remove_proto_idfs(du->du_proto); + du->du_proto = 0; + } else break; + } du = du->next; + } pl = du ? du->du_proto : NO_PROTO; if (pl) { #if 0 /* the id_proto member is deleted (???) */ diff --git a/lang/cem/cemcom.ansi/type.c b/lang/cem/cemcom.ansi/type.c index d29b8f97e..5c737090b 100644 --- a/lang/cem/cemcom.ansi/type.c +++ b/lang/cem/cemcom.ansi/type.c @@ -153,7 +153,6 @@ function_of(tp, pl, qual) if (!dtp) { dtp = create_type(FUNCTION); dtp->tp_up = tp; - /* dtp->tp_size = pointer_size; ??? */ dtp->tp_size = -1; /* function size is not known */ dtp->tp_align = pointer_align; dtp->tp_typequal = qual; -- 2.34.1