diff --git a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt index c777b57e7..b9c1ae126 100644 --- a/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt +++ b/rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/ast/statements.kt @@ -1481,7 +1481,10 @@ data class DefineStmt( } if (originalDataDefinition != null) { - return listOf(InStatementDataDefinition(newVarName, originalDataDefinition.type, position)) + val newType = if (originalDataDefinition.type is DataStructureType) { + StringType.createInstance(originalDataDefinition.elementSize()) + } else originalDataDefinition.type + return listOf(InStatementDataDefinition(newVarName, newType, position)) } else { if (!this.enterInStack()) { // This check is necessary to avoid infinite recursion diff --git a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt index 8273119a1..e6cb28a7a 100644 --- a/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt +++ b/rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt @@ -1,9 +1,11 @@ package com.smeup.rpgparser.smeup import com.smeup.rpgparser.db.utilities.DBServer +import com.smeup.rpgparser.interpreter.AbstractDataDefinition import com.smeup.rpgparser.interpreter.DataDefinition import com.smeup.rpgparser.interpreter.DataStructureType import com.smeup.rpgparser.interpreter.StringType +import com.smeup.rpgparser.parsing.parsetreetoast.resolveAndValidate import com.smeup.rpgparser.smeup.dbmock.MULANGTLDbMock import org.junit.Test import kotlin.test.* @@ -887,4 +889,24 @@ open class MULANGT02ConstAndDSpecTest : MULANGTTest() { assertIs(ds0002DataDefinition?.type) assertEquals(mlDataDefinition?.elementSize(), ds0002DataDefinition?.elementSize()) } + + /** + * Definitions with *LIKE DEFINE referencing a DS must be defined as strings with the same size as the DS + * @see #LS25000333 + */ + @Test + fun executeMUDRNRAPU00282() { + var aDefinition: AbstractDataDefinition? = null + var bDefinition: AbstractDataDefinition? = null + + assertASTCanBeProduced("smeup/MUDRNRAPU00282", afterAstCreation = { + it.resolveAndValidate() // Needed to solve InStatementDataDefinitions + aDefinition = it.allDataDefinitions.firstOrNull { def -> def.name.equals("\$A", ignoreCase = true) } + bDefinition = it.allDataDefinitions.firstOrNull { def -> def.name.equals("\$B", ignoreCase = true) } + }) + + assertIs(aDefinition?.type) + assertIs(bDefinition?.type) + assertEquals(aDefinition?.elementSize(), bDefinition?.elementSize()) + } } diff --git a/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00282.rpgle b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00282.rpgle new file mode 100644 index 000000000..68fe58528 --- /dev/null +++ b/rpgJavaInterpreter-core/src/test/resources/smeup/MUDRNRAPU00282.rpgle @@ -0,0 +1,12 @@ + V* ============================================================== + V* 24/01/2025 APU002 Creation + V* ============================================================== + O * PROGRAM GOAL + O * *LIKE DEFINE referencing a DS must be defined as + 0 * strings with the same size as the DS + V* ============================================================== + O * JARIKO ANOMALY + O * Before the fix, they were defined as DS themselves + V* ============================================================== + D $A DS 512 + C *LIKE DEFINE $A $B \ No newline at end of file