diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/resolution.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/resolution.kt index ad6e66ec3..bf4c12378 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/resolution.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/resolution.kt @@ -24,6 +24,7 @@ import com.smeup.rpgparser.interpreter.InStatementDataDefinition import com.smeup.rpgparser.interpreter.type import com.smeup.rpgparser.parsing.ast.* import com.smeup.rpgparser.parsing.facade.AstCreatingException +import com.smeup.rpgparser.parsing.facade.adaptInFunctionOf import com.smeup.rpgparser.parsing.facade.getExecutionProgramNameWithNoExtension import com.smeup.rpgparser.parsing.facade.getLastPoppedParsingProgram import com.smeup.rpgparser.utils.popIfPresent @@ -272,7 +273,6 @@ private fun ReferenceByName.tryToResolveRecursively(posi resolved = this.tryToResolve(currentCu.allDataDefinitions, caseInsensitive = true) currentCu = currentCu.parent?.let { it as CompilationUnit } } - require(resolved) { - "Data reference not resolved: ${this.name} at $position" - } + val relativePosition = position?.adaptInFunctionOf(getProgramNameToCopyBlocks().second) + if (!resolved) cu.error("Data reference not resolved: ${this.name} at $relativePosition") } diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/InterpreterTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/InterpreterTest.kt index af580349c..f8fb025f2 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/InterpreterTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/evaluation/InterpreterTest.kt @@ -2549,4 +2549,19 @@ Test 6 val expected = listOf("0", "0", "0", "1") assertEquals(expected, "PRSLTCALLERDUPLICATE".outputOf()) } + + @Test + fun missingDefinitionOnPListShouldThrowResolutionError() { + val systemInterface = JavaSystemInterface() + + val source = """ +| C CALL 'PGM' +| C PARM MISSING + """.trimMargin() + + val program = getProgram(source, systemInterface) + assertFailsWith(AstResolutionError::class) { + program.singleCall(listOf()) + } + } }