Merge pull request #2493 from kugelfuhr/kugelfuhr/fix-1663

Fix issue #1663.
This commit is contained in:
Bob Andrews 2024-09-01 18:07:14 +02:00 committed by GitHub
commit a712fbb8f9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -133,24 +133,26 @@ static void SetIfCond (IfDesc* ID, int C)
static void ElseClause (IfDesc* ID, const char* Directive)
/* Enter an .ELSE clause */
static int ElseClause (IfDesc* ID, const char* Directive)
/* Enter an .ELSE clause. Return true if this was ok, zero on errors. */
{
/* Check if we have an open .IF - otherwise .ELSE is not allowed */
if (ID == 0) {
Error ("Unexpected %s", Directive);
return;
return 0;
}
/* Check for a duplicate else, then remember that we had one */
if (ID->Flags & ifElse) {
/* We already had a .ELSE ! */
Error ("Duplicate .ELSE");
return 0;
}
ID->Flags |= ifElse;
/* Condition is inverted now */
ID->Flags ^= ifCond;
return 1;
}
@ -226,46 +228,52 @@ void DoConditionals (void)
D = GetCurrentIf ();
/* Allow an .ELSE */
ElseClause (D, ".ELSE");
if (ElseClause (D, ".ELSE")) {
/* Remember the data for the .ELSE */
if (D) {
ReleaseFullLineInfo (&D->LineInfos);
GetFullLineInfo (&D->LineInfos);
D->Name = ".ELSE";
}
/* Remember the data for the .ELSE */
if (D) {
ReleaseFullLineInfo (&D->LineInfos);
GetFullLineInfo (&D->LineInfos);
D->Name = ".ELSE";
/* Calculate the new overall condition */
CalcOverallIfCond ();
/* Skip .ELSE */
NextTok ();
ExpectSep ();
} else {
/* Problem with .ELSE, ignore remainder of line */
SkipUntilSep ();
}
/* Calculate the new overall condition */
CalcOverallIfCond ();
/* Skip .ELSE */
NextTok ();
ExpectSep ();
break;
case TOK_ELSEIF:
D = GetCurrentIf ();
/* Handle as if there was an .ELSE first */
ElseClause (D, ".ELSEIF");
if (ElseClause (D, ".ELSEIF")) {
/* Calculate the new overall if condition */
CalcOverallIfCond ();
/* Calculate the new overall if condition */
CalcOverallIfCond ();
/* Allocate and prepare a new descriptor */
D = AllocIf (".ELSEIF", 0);
NextTok ();
/* Allocate and prepare a new descriptor */
D = AllocIf (".ELSEIF", 0);
NextTok ();
/* Ignore the new condition if we are inside a false .ELSE
** branch. This way we won't get any errors about undefined
** symbols or similar...
*/
if (IfCond) {
SetIfCond (D, ConstExpression ());
ExpectSep ();
}
/* Ignore the new condition if we are inside a false .ELSE
** branch. This way we won't get any errors about undefined
** symbols or similar...
*/
if (IfCond) {
SetIfCond (D, ConstExpression ());
ExpectSep ();
/* Get the new overall condition */
CalcOverallIfCond ();
} else {
/* Problem with .ELSEIF, ignore remainder of line */
SkipUntilSep ();
}
/* Get the new overall condition */
CalcOverallIfCond ();
break;
case TOK_ENDIF: