From 65081aebed14588cf048bc5fe6fcff474c6e38e8 Mon Sep 17 00:00:00 2001 From: acqn Date: Mon, 20 Jul 2020 22:34:57 +0800 Subject: [PATCH] Made able to recognize global declarations of static arrays. Fixed Issue #975. --- src/cc65/compile.c | 25 ++++++++++++++++--------- src/cc65/expr.c | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/cc65/compile.c b/src/cc65/compile.c index 4806017eb..f7e4bd35d 100644 --- a/src/cc65/compile.c +++ b/src/cc65/compile.c @@ -151,14 +151,17 @@ static void Parse (void) ** This means that "extern int i;" will not get storage allocated. */ if ((Decl.StorageClass & SC_FUNC) != SC_FUNC && - (Decl.StorageClass & SC_TYPEMASK) != SC_TYPEDEF && - ((Spec.Flags & DS_DEF_STORAGE) != 0 || - (Decl.StorageClass & (SC_EXTERN|SC_STATIC)) == SC_STATIC || - ((Decl.StorageClass & SC_EXTERN) != 0 && - CurTok.Tok == TOK_ASSIGN))) { - - /* We will allocate storage */ - Decl.StorageClass |= SC_STORAGE; + (Decl.StorageClass & SC_TYPEMASK) != SC_TYPEDEF) { + if ((Spec.Flags & DS_DEF_STORAGE) != 0 || + (Decl.StorageClass & (SC_EXTERN|SC_STATIC)) == SC_STATIC || + ((Decl.StorageClass & SC_EXTERN) != 0 && + CurTok.Tok == TOK_ASSIGN)) { + /* We will allocate storage */ + Decl.StorageClass |= SC_STORAGE; + } else { + /* It's a declaration */ + Decl.StorageClass |= SC_DECL; + } } /* If this is a function declarator that is not followed by a comma @@ -243,7 +246,11 @@ static void Parse (void) if (!IsTypeArray (Decl.Type)) { Error ("Variable '%s' has unknown size", Decl.Ident); } - Entry->Flags &= ~(SC_STORAGE | SC_DEF); + /* Do this only if the same array has not been defined */ + if (!SymIsDef (Entry)) { + Entry->Flags &= ~(SC_STORAGE | SC_DEF); + Entry->Flags |= SC_DECL; + } } else { /* A global (including static) uninitialized variable is ** only a tentative definition. For example, this is valid: diff --git a/src/cc65/expr.c b/src/cc65/expr.c index d31b153a5..a35ad59a9 100644 --- a/src/cc65/expr.c +++ b/src/cc65/expr.c @@ -802,7 +802,7 @@ static void Primary (ExprDesc* E) E->Name = Sym->V.R.RegOffs; } else if ((Sym->Flags & SC_STATIC) == SC_STATIC) { /* Static variable */ - if (Sym->Flags & (SC_EXTERN | SC_STORAGE)) { + if (Sym->Flags & (SC_EXTERN | SC_STORAGE | SC_DECL)) { E->Flags = E_LOC_GLOBAL | E_RTYPE_LVAL; E->Name = (uintptr_t) Sym->Name; } else {