]> git.sur5r.net Git - cc65/commitdiff
In an old style function definition, print a diagnostic if a type is assigned V2.12.0
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 1 Aug 2008 21:40:07 +0000 (21:40 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 1 Aug 2008 21:40:07 +0000 (21:40 +0000)
twice to a parameter.

git-svn-id: svn://svn.cc65.org/cc65/trunk@3861 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/declare.c
src/cc65/symentry.h

index c15cc53a3e12f0547d740cf39cd1fac6cfb22595..2b4a09a42a61f2644755c169679236b067ef2b2e 100644 (file)
@@ -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);
                }
index bbef8c227f6e67e4473c98d2bc03d517aa812fbf..a43356cc9e0ac73af5a6a532114b8f6d0903ef42 100644 (file)
@@ -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 */