diff --git a/src/files.c b/src/files.c index ea6f69ed..042a485a 100644 --- a/src/files.c +++ b/src/files.c @@ -79,6 +79,7 @@ typedef struct { int LineNo; unsigned int IfFlags; int NumIfs; + int IfLinenos[IF_NEST]; long offset; CachedLine *CLine; int ownedByMe; @@ -526,8 +527,14 @@ static int NextChainedFile(IncludeStruct *i) static int PopFile(void) { IncludeStruct *i; + int j; - if (!Hush && NumIfs) Eprint("%s", ErrMsg[E_MISS_ENDIF]); + if (!Hush && NumIfs) { + Eprint("%s", ErrMsg[E_MISS_ENDIF]); + for (j=NumIfs-1; j >=0; j--) { + fprintf(ErrFp, "%s(%d): IF without ENDIF\n", FileName, IfLinenos[j]); + } + } if (!IStackPtr) return E_EOF; i = &IStack[IStackPtr-1]; @@ -547,6 +554,7 @@ static int PopFile(void) LineNo = i->LineNo; IfFlags = i->IfFlags; + memcpy(IfLinenos, i->IfLinenos, IF_NEST); NumIfs = i->NumIfs; CLine = i->CLine; fp = NULL; @@ -871,6 +879,7 @@ static int IncludeCmd(char const *cmd) i->LineNo = LineNo; i->NumIfs = NumIfs; i->IfFlags = IfFlags; + memcpy(i->IfLinenos, IfLinenos, IF_NEST); i->CLine = CLine; i->offset = -1L; i->chain = NULL; @@ -973,6 +982,7 @@ int IncludeFile(char const *fname) i->LineNo = LineNo; i->NumIfs = NumIfs; i->IfFlags = IfFlags; + memcpy(i->IfLinenos, IfLinenos, IF_NEST); i->CLine = CLine; i->offset = -1L; i->chain = NULL; diff --git a/src/globals.h b/src/globals.h index c36a1d6f..47699eb1 100644 --- a/src/globals.h +++ b/src/globals.h @@ -114,6 +114,7 @@ EXTERN INIT( int PurgeIncludeDepth, 0); EXTERN INIT( FILE *PurgeFP, NULL); EXTERN INIT( int NumIfs, 0); EXTERN INIT( unsigned int IfFlags, 0); +EXTERN INIT( int IfLinenos[IF_NEST], {0}); EXTERN INIT( int LastTrigValid, 0); EXTERN Trigger LastTrigger; EXTERN TimeTrig LastTimeTrig; diff --git a/src/main.c b/src/main.c index d105c7cc..1b90ce83 100644 --- a/src/main.c +++ b/src/main.c @@ -955,6 +955,7 @@ int DoIf(ParsePtr p) } } + IfLinenos[NumIfs] = LineNo; NumIfs++; IfFlags &= ~(IF_MASK << (2*NumIfs - 2)); IfFlags |= syndrome << (2 * NumIfs - 2); diff --git a/tests/if1.rem b/tests/if1.rem new file mode 100644 index 00000000..fcd4ee0c --- /dev/null +++ b/tests/if1.rem @@ -0,0 +1,4 @@ +BANNER % +set $AddBlankLines 0 +IF 1 +INCLUDE [filedir()]/if2.rem diff --git a/tests/if2.rem b/tests/if2.rem new file mode 100644 index 00000000..5dcccfc8 --- /dev/null +++ b/tests/if2.rem @@ -0,0 +1,5 @@ +# Another unmatched IF +IF 0 +ELSE +IF 1 + diff --git a/tests/test-rem b/tests/test-rem index 5bdd774b..af154436 100644 --- a/tests/test-rem +++ b/tests/test-rem @@ -566,6 +566,9 @@ POP PUSH POP EOF + +../src/remind ../tests/if1.rem 2020-03-03 >> ../tests/test.out 2>&1 + # Remove references to SysInclude, which is build-specific grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out cmp -s ../tests/test.out ../tests/test.cmp diff --git a/tests/test.cmp b/tests/test.cmp index e55e55fc..37997548 100644 --- a/tests/test.cmp +++ b/tests/test.cmp @@ -12349,3 +12349,9 @@ Expression nodes high-water: 499 -stdin-(14): Unmatched PUSH-OMIT-CONTEXT at -(7) -stdin-(14): Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT No reminders. +../tests/if2.rem(6): Warning: Missing ENDIF +../tests/if2.rem(4): IF without ENDIF +../tests/if2.rem(2): IF without ENDIF +../tests/if1.rem(5): Warning: Missing ENDIF +../tests/if1.rem(3): IF without ENDIF +No reminders.