From 7cd137afb449001aade2a219f30e7d8b0130c2fe Mon Sep 17 00:00:00 2001 From: Kugel Fuhr <98353208+kugelfuhr@users.noreply.github.com> Date: Sun, 6 Jul 2025 10:40:25 +0200 Subject: [PATCH] Improved diagnostics. --- src/ca65/pseudo.c | 2 +- src/ca65/repeat.c | 11 ++++++++--- src/ca65/symentry.c | 8 ++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ca65/pseudo.c b/src/ca65/pseudo.c index 54e8fda4b..145eb4963 100644 --- a/src/ca65/pseudo.c +++ b/src/ca65/pseudo.c @@ -2235,7 +2235,7 @@ static CtrlDesc CtrlCmdTab [] = { { ccNone, DoUnexpected }, /* .REF, .REFERENCED */ { ccNone, DoReferTo }, /* .REFTO, .REFERTO */ { ccNone, DoReloc }, /* .RELOC */ - { ccNone, DoRepeat }, /* .REPEAT */ + { ccKeepToken, DoRepeat }, /* .REPEAT */ { ccNone, DoRes }, /* .RES */ { ccNone, DoInvalid }, /* .RIGHT */ { ccNone, DoROData }, /* .RODATA */ diff --git a/src/ca65/repeat.c b/src/ca65/repeat.c index 6a518cb37..c2fb7d9fa 100644 --- a/src/ca65/repeat.c +++ b/src/ca65/repeat.c @@ -53,7 +53,7 @@ -static TokList* CollectRepeatTokens (void) +static TokList* CollectRepeatTokens (const FilePos* StartPos) /* Collect all tokens inside the .REPEAT body in a token list and return ** this list. In case of errors, NULL is returned. */ @@ -67,7 +67,8 @@ static TokList* CollectRepeatTokens (void) /* Check for end of input */ if (CurTok.Tok == TOK_EOF) { - Error ("Unexpected end of file"); + ErrorExpect ("Expected '.ENDREPEAT'"); + PNotification (StartPos, "For this '.REPEAT' command"); FreeTokList (List); return 0; } @@ -117,6 +118,10 @@ void ParseRepeat (void) char* Name; TokList* List; + /* Remember the position of the .REPEAT token, then skip it */ + FilePos StartPos = CurTok.Pos; + NextTok (); + /* Repeat count follows */ long RepCount = ConstExpression (); if (RepCount < 0) { @@ -145,7 +150,7 @@ void ParseRepeat (void) ConsumeSep (); /* Read the token list */ - List = CollectRepeatTokens (); + List = CollectRepeatTokens (&StartPos); /* If we had an error, bail out */ if (List == 0) { diff --git a/src/ca65/symentry.c b/src/ca65/symentry.c index c57fcff2a..dd18fc765 100644 --- a/src/ca65/symentry.c +++ b/src/ca65/symentry.c @@ -216,6 +216,10 @@ void SymDef (SymEntry* S, ExprNode* Expr, unsigned char AddrSize, unsigned Flags if (S->Flags & SF_IMPORT) { /* Defined symbol is marked as imported external symbol */ Error ("Symbol '%m%p' is already an import", GetSymName (S)); + if (CollCount (&S->DefLines) > 0) { + PNotification (GetSourcePos (CollAt(&S->DefLines, 0)), + "The symbol was previously imported here"); + } return; } if ((Flags & SF_VAR) != 0 && (S->Flags & (SF_EXPORT | SF_GLOBAL))) { @@ -227,6 +231,10 @@ void SymDef (SymEntry* S, ExprNode* Expr, unsigned char AddrSize, unsigned Flags /* Multiple definition. In case of a variable, this is legal. */ if ((S->Flags & SF_VAR) == 0) { Error ("Symbol '%m%p' is already defined", GetSymName (S)); + if (CollCount (&S->DefLines) > 0) { + PNotification (GetSourcePos (CollAt(&S->DefLines, 0)), + "The symbol was previously defined here"); + } S->Flags |= SF_MULTDEF; return; } else {