From b1ef09675bbfab4441c1e73c2cedb9a172adeeb6 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 10 Apr 2021 00:28:32 +0200 Subject: [PATCH] fix compiler crash for some struct/array initialization assignment literals containing not just numbers --- .../astprocessing/StatementReorderer.kt | 4 +-- .../src/prog8/ast/statements/AstStatements.kt | 9 +++++- examples/test.p8 | 28 +++++++++++++++---- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt b/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt index 0265c4222..f4f594e59 100644 --- a/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt +++ b/compiler/src/prog8/compiler/astprocessing/StatementReorderer.kt @@ -224,7 +224,7 @@ internal class StatementReorderer(val program: Program, val errors: IErrorReport if(targetType.istype(DataType.STRUCT) && (valueType.istype(DataType.STRUCT) || valueType.typeOrElse(DataType.STRUCT) in ArrayDatatypes )) { if (assignment.value is ArrayLiteralValue) { - errors.err("cannot assign non-const array value, use separate assignment per field", assignment.position) + errors.err("cannot assign array literal here, use separate assignment per field", assignment.position) } else { return copyStructValue(assignment) } @@ -232,7 +232,7 @@ internal class StatementReorderer(val program: Program, val errors: IErrorReport if(targetType.typeOrElse(DataType.STRUCT) in ArrayDatatypes && valueType.typeOrElse(DataType.STRUCT) in ArrayDatatypes ) { if (assignment.value is ArrayLiteralValue) { - errors.err("cannot assign non-const array value, use separate assignment per element", assignment.position) + errors.err("cannot assign array literal here, use separate assignment per element", assignment.position) } else { return copyArrayValue(assignment) } diff --git a/compilerAst/src/prog8/ast/statements/AstStatements.kt b/compilerAst/src/prog8/ast/statements/AstStatements.kt index 854f6c166..43dc08a11 100644 --- a/compilerAst/src/prog8/ast/statements/AstStatements.kt +++ b/compilerAst/src/prog8/ast/statements/AstStatements.kt @@ -256,7 +256,14 @@ open class VarDecl(val type: VarDeclType, fun flattenStructMembers(): MutableList { val result = struct!!.statements.mapIndexed { index, statement -> val member = statement as VarDecl - val initvalue = if(value!=null) (value as ArrayLiteralValue).value[index] else null + val initvalueOrig = if(value!=null) (value as ArrayLiteralValue).value[index] else null + val initvalue = when(initvalueOrig) { + is AddressOf -> initvalueOrig.copy() + is ArrayIndexedExpression -> initvalueOrig.copy() + is DirectMemoryRead -> initvalueOrig.copy() + is IdentifierReference -> initvalueOrig.copy() + else -> initvalueOrig + } VarDecl( VarDeclType.VAR, member.datatype, diff --git a/examples/test.p8 b/examples/test.p8 index 4cbbd11cd..c401694b1 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -3,12 +3,28 @@ main { sub start() { - txt.print("✓✓✓✓✓") - txt.nl() - txt.print("WWWWW") - txt.nl() - txt.print("●●●●●") - txt.nl() + const ubyte world_width=100 + + struct Color { + ubyte red + ubyte green + ubyte blue + } + + Color rgb = [255,world_width,0] ; note that struct initializer value is same as an array + ;rgb = [255,world_width,0] ; note that struct initializer value is same as an array + ;rgb = [255,world_width/2,0] ; note that struct initializer value is same as an array + + +; struct Entity { +; ubyte active +; ubyte x +; ubyte y +; byte direction +; } +; +; Entity pede +; pede = [1, 1, 0, -1] } }