From 2d530dbcd64b752d86571f13f50ad8d927ffad74 Mon Sep 17 00:00:00 2001 From: Sylvie <35663410+Rangi42@users.noreply.github.com> Date: Fri, 9 Aug 2024 03:40:53 -0400 Subject: [PATCH] Fix constant expression detection functions (#1462) --- src/asm/rpn.cpp | 11 ++++++----- test/asm/const-unknown.asm | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 test/asm/const-unknown.asm diff --git a/src/asm/rpn.cpp b/src/asm/rpn.cpp index 8515f675..89e49b98 100644 --- a/src/asm/rpn.cpp +++ b/src/asm/rpn.cpp @@ -213,8 +213,8 @@ static bool tryConstNonzero(Expression const &lhs, Expression const &rhs) { static bool tryConstLogNot(Expression const &expr) { Symbol const *sym = expr.symbolOf(); - if (!sym || !sym->getSection()) - return -1; + if (!sym || !sym->getSection() || !sym->isDefined()) + return false; assume(sym->isNumeric()); @@ -238,7 +238,7 @@ static bool tryConstLogNot(Expression const &expr) { */ static int32_t tryConstLow(Expression const &expr) { Symbol const *sym = expr.symbolOf(); - if (!sym || !sym->getSection()) + if (!sym || !sym->getSection() || !sym->isDefined()) return -1; assume(sym->isNumeric()); @@ -276,10 +276,11 @@ static int32_t tryConstMask(Expression const &lhs, Expression const &rhs) { Symbol const &sym = lhsIsSymbol ? *lhsSymbol : *rhsSymbol; Expression const &expr = lhsIsSymbol ? rhs : lhs; // Opposite side of `sym` + if (!sym.isDefined() || !expr.isKnown()) + return -1; + assume(sym.isNumeric()); - if (!expr.isKnown()) - return -1; // We can now safely use `expr.value()` int32_t mask = expr.value(); diff --git a/test/asm/const-unknown.asm b/test/asm/const-unknown.asm new file mode 100644 index 00000000..e4c94ffa --- /dev/null +++ b/test/asm/const-unknown.asm @@ -0,0 +1,6 @@ +SECTION "test", ROMX + ; Foo is unknown so none of these should warn + assert warn, Foo & $8000 + assert warn, !Foo + assert warn, LOW(Foo) + assert warn, !(Foo & LOW(Foo))