diff --git a/src/main/scala/millfork/env/Environment.scala b/src/main/scala/millfork/env/Environment.scala index 66e2828a..3b2c1138 100644 --- a/src/main/scala/millfork/env/Environment.scala +++ b/src/main/scala/millfork/env/Environment.scala @@ -705,6 +705,22 @@ class Environment(val parent: Option[Environment], val prefix: String) { def nameCheck(node: Node): Unit = node match { case _:AssemblyStatement => () case _:DeclarationStatement => () + case s:BlockStatement => nameCheck(s.body) + case s:ForStatement => + checkName[Variable]("Variable", s.variable, s.position) + nameCheck(s.start) + nameCheck(s.end) + nameCheck(s.body) + case s:IfStatement => + nameCheck(s.condition) + nameCheck(s.thenBranch) + nameCheck(s.elseBranch) + case s:WhileStatement => + nameCheck(s.condition) + nameCheck(s.body) + case s:DoWhileStatement => + nameCheck(s.body) + nameCheck(s.condition) case s:Statement => nameCheck(s.getAllExpressions) case _:LiteralExpression => () case VariableExpression(name) => diff --git a/src/test/scala/millfork/test/BasicSymonTest.scala b/src/test/scala/millfork/test/BasicSymonTest.scala index 931ffb62..88b4c567 100644 --- a/src/test/scala/millfork/test/BasicSymonTest.scala +++ b/src/test/scala/millfork/test/BasicSymonTest.scala @@ -16,6 +16,26 @@ class BasicSymonTest extends FunSuite with Matchers { """.stripMargin) } + test("Panic test") { + EmuUnoptimizedRun( + """ + | byte output @$c000 + | void main () { + | panic() + | } + | inline asm void panic() { + | JSR _panic + | } + | void _panic() { + | asm { + | JSR doNothing + | } + | output = 1 + | } + | void doNothing() { } + """.stripMargin).readByte(0xc000) should equal(1) + } + test("Allocation test") { val src = """ diff --git a/src/test/scala/millfork/test/emu/EmuRun.scala b/src/test/scala/millfork/test/emu/EmuRun.scala index e6a7ad12..d6d03635 100644 --- a/src/test/scala/millfork/test/emu/EmuRun.scala +++ b/src/test/scala/millfork/test/emu/EmuRun.scala @@ -98,7 +98,8 @@ class EmuRun(cpu: millfork.Cpu.Value, nodeOptimizations: List[NodeOptimization], )) ErrorReporting.hasErrors = false ErrorReporting.verbosity = 999 - val parserF = MfParser("", source + "\n void _panic(){while(true){}}", "", options) + val sourceWithPanic = if (source.contains("_panic")) source else source + "\n void _panic(){while(true){}}" + val parserF = MfParser("", sourceWithPanic, "", options) parserF.toAst match { case Success(unoptimized, _) => ErrorReporting.assertNoErrors("Parse failed")