diff --git a/pcomp/pcomp.pas b/pcomp/pcomp.pas index a3e4986..0eca89d 100644 --- a/pcomp/pcomp.pas +++ b/pcomp/pcomp.pas @@ -5813,6 +5813,19 @@ begin matchToken(ColonToken); end; +procedure parseGotoStatement; +var aLabl: LablRef; +begin + readNextToken; + matchToken(IdentToken); + aLabl := findLabel(curProcedure, lastToken.tokenText); + if aLabl = nil then + errorExit2('GOTO to undefined label', lastToken.tokenText); + if curProcedure^.estackCleanup > 0 then + errorExit2('GOTO not allowed inside FOR or CASE', ''); + emitLabelJump(aLabl); +end; + procedure parseStatement; var sym: SymblRef; cnst: ConstRef; @@ -5838,13 +5851,7 @@ begin end; if checkToken(GotoToken) then - begin - readNextToken; - matchToken(IdentToken); - aLabl := findLabel(curProcedure, lastToken.tokenText); - if aLabl = nil then errorExit2('GOTO to undefined label', lastToken.tokenText); - emitLabelJump(aLabl); - end + parseGotoStatement else if checkToken(IfToken) then parseIfStatement diff --git a/tests/gototest.pas b/tests/gototest.pas new file mode 100644 index 0000000..f573af3 --- /dev/null +++ b/tests/gototest.pas @@ -0,0 +1,22 @@ +program gototest; +var i:integer; +label l1,l2; +begin + goto l1; + writeln('skipped'); + l1: writeln('goto destination 1'); + { + for i := 1 to 10 do + begin + goto l2; + end; + } + { + case i of + 1: writeln('1'); + 2: goto l2; + 3..10: writeln('3 - 10'); + end; + l2: writeln('goto destination 2'); + } +end.