From 2675623aea4616a0a351f6c60b453f681b546ec3 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 16 Apr 2024 23:27:22 +0200 Subject: [PATCH] fix optimization ast parent linkage problem --- .../prog8/optimizer/ConstantIdentifierReplacer.kt | 3 ++- compiler/test/TestOptimization.kt | 12 ++++++++++++ .../src/prog8/ast/expressions/AstExpressions.kt | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/codeOptimizers/src/prog8/optimizer/ConstantIdentifierReplacer.kt b/codeOptimizers/src/prog8/optimizer/ConstantIdentifierReplacer.kt index b3b097c19..2af6e9d13 100644 --- a/codeOptimizers/src/prog8/optimizer/ConstantIdentifierReplacer.kt +++ b/codeOptimizers/src/prog8/optimizer/ConstantIdentifierReplacer.kt @@ -77,8 +77,9 @@ class VarConstantValueTypeAdjuster( // variable is never written to, so it can be replaced with a constant, IF the value is a constant errors.info("variable '${decl.name}' is never written to and was replaced by a constant", decl.position) val const = VarDecl(VarDeclType.CONST, decl.origin, decl.datatype, decl.zeropage, decl.arraysize, decl.name, decl.names, declValue, decl.sharedWithAsm, decl.splitArray, decl.position) + decl.value = null return listOf( - IAstModification.ReplaceNode(decl, const, parent), + IAstModification.ReplaceNode(decl, const, parent) ) } } diff --git a/compiler/test/TestOptimization.kt b/compiler/test/TestOptimization.kt index 83b361dd6..a4a597af4 100644 --- a/compiler/test/TestOptimization.kt +++ b/compiler/test/TestOptimization.kt @@ -793,6 +793,18 @@ main { (expr.right as? NumericLiteral)?.number shouldBe 10.0 } + test("var to const inside typecast") { + val src=""" +main { + uword variable ; will be made a const + + sub start() { + cx16.r0 = msb(variable) as uword + } +}""" + compileText(VMTarget(), true, src, writeAssembly = false) shouldNotBe null + } + test("De Morgan's laws") { val src=""" main { diff --git a/compilerAst/src/prog8/ast/expressions/AstExpressions.kt b/compilerAst/src/prog8/ast/expressions/AstExpressions.kt index b0cbccaa2..8f9d69301 100644 --- a/compilerAst/src/prog8/ast/expressions/AstExpressions.kt +++ b/compilerAst/src/prog8/ast/expressions/AstExpressions.kt @@ -375,6 +375,7 @@ class TypecastExpression(var expression: Expression, var type: DataType, val imp override fun inferType(program: Program) = InferredTypes.knownFor(type) override fun constValue(program: Program): NumericLiteral? { val cv = expression.constValue(program) ?: return null + cv.linkParents(parent) val cast = cv.cast(type, implicit) return if(cast.isValid) { val newval = cast.valueOrZero()