From: cuz Date: Fri, 1 Aug 2008 21:40:07 +0000 (+0000) Subject: In an old style function definition, print a diagnostic if a type is assigned X-Git-Tag: V2.12.0 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6ecca264e4541336d4030dff8b8d0cdbd06b74c6;p=cc65 In an old style function definition, print a diagnostic if a type is assigned twice to a parameter. git-svn-id: svn://svn.cc65.org/cc65/trunk@3861 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/cc65/declare.c b/src/cc65/declare.c index c15cc53a3..2b4a09a42 100644 --- a/src/cc65/declare.c +++ b/src/cc65/declare.c @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 1998-2005 Ullrich von Bassewitz */ -/* Römerstraße 52 */ +/* (C) 1998-2008 Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ @@ -696,7 +696,7 @@ static void ParseOldStyleParamList (FuncDesc* F) } /* Create a symbol table entry with type int */ - AddLocalSym (CurTok.Ident, type_int, SC_AUTO | SC_PARAM | SC_DEF, 0); + AddLocalSym (CurTok.Ident, type_int, SC_AUTO | SC_PARAM | SC_DEF | SC_DEFTYPE, 0); /* Count arguments */ ++F->ParamCount; @@ -736,7 +736,7 @@ static void ParseOldStyleParamList (FuncDesc* F) /* Parse a comma separated variable list */ while (1) { - Declaration Decl; + Declaration Decl; /* Read the parameter */ ParseDecl (&Spec, &Decl, DM_NEED_IDENT); @@ -745,8 +745,18 @@ static void ParseOldStyleParamList (FuncDesc* F) /* We have a name given. Search for the symbol */ SymEntry* Sym = FindLocalSym (Decl.Ident); if (Sym) { - /* Found it, change the default type to the one given */ - ChangeSymType (Sym, ParamTypeCvt (Decl.Type)); + /* Check if we already changed the type for this + * parameter + */ + if (Sym->Flags & SC_DEFTYPE) { + /* Found it, change the default type to the one given */ + ChangeSymType (Sym, ParamTypeCvt (Decl.Type)); + /* Reset the "default type" flag */ + Sym->Flags &= ~SC_DEFTYPE; + } else { + /* Type has already been changed */ + Error ("Redefinition for parameter `%s'", Sym->Name); + } } else { Error ("Unknown identifier: `%s'", Decl.Ident); } diff --git a/src/cc65/symentry.h b/src/cc65/symentry.h index bbef8c227..a43356cc9 100644 --- a/src/cc65/symentry.h +++ b/src/cc65/symentry.h @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 2000-2006 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ +/* (C) 2000-2008 Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ @@ -76,6 +76,7 @@ struct Segments; #define SC_PARAM 0x0080U /* This is a function parameter */ #define SC_FUNC 0x0100U /* Function entry */ +#define SC_DEFTYPE 0x0200U /* Parameter has default type (=int, old style) */ #define SC_STORAGE 0x0400U /* Symbol with associated storage */ #define SC_DEFAULT 0x0800U /* Flag: default storage class was used */