From cd825e386d0f27eef822858857a3aecf1aa5bad6 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 15 Oct 2020 20:14:17 +0200 Subject: [PATCH] fix invalid address-of error when taking address of struct variable --- .../src/prog8/ast/processing/AstChecker.kt | 1 + examples/test.p8 | 39 ++++++++++++++----- examples/textelite.p8 | 4 +- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/compiler/src/prog8/ast/processing/AstChecker.kt b/compiler/src/prog8/ast/processing/AstChecker.kt index aa802257c..58ccbdc18 100644 --- a/compiler/src/prog8/ast/processing/AstChecker.kt +++ b/compiler/src/prog8/ast/processing/AstChecker.kt @@ -464,6 +464,7 @@ internal class AstChecker(private val program: Program, else { if(variable.datatype !in ArrayDatatypes && variable.type!=VarDeclType.MEMORY + && variable.struct == null && variable.datatype != DataType.STR && variable.datatype!=DataType.STRUCT) errors.err("invalid pointer-of operand type", addressOf.position) } diff --git a/examples/test.p8 b/examples/test.p8 index f7f4ac090..2b17d4649 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,21 +1,40 @@ %import textio %import diskio %zeropage basicsafe -%option no_sysinit main { sub start() { - txt.print("saving...") - diskio.delete(8, "data.bin") - if diskio.save(8, "data.bin", $0400, 40*25) { - txt.clear_screenchars('*') - txt.print("loading...") - uword size = diskio.load(8, "data.bin", $0400) - txt.print_uwhex(size, true) - txt.chrout('\n') - } else txt.print("io error\n") + ubyte[100] cargohold + + struct SaveData { + ubyte galaxy + ubyte planet + ubyte cargo0 + ubyte cargo1 + ubyte cargo2 + ubyte cargo3 + ubyte cargo4 + ubyte cargo5 + ubyte cargo6 + ubyte cargo7 + ubyte cargo8 + ubyte cargo9 + ubyte cargo10 + ubyte cargo11 + ubyte cargo12 + ubyte cargo13 + ubyte cargo14 + ubyte cargo15 + ubyte cargo16 + uword cash + ubyte max_cargo + ubyte fuel + } + SaveData savedata + + memcopy(&savedata.cargo0, cargohold, len(cargohold)) ; TODO fix compiler error about pointer testX() } diff --git a/examples/textelite.p8 b/examples/textelite.p8 index 873ae8a5f..9f87849a1 100644 --- a/examples/textelite.p8 +++ b/examples/textelite.p8 @@ -107,7 +107,7 @@ trader { ship.cash = savedata.cash ship.Max_cargo = savedata.max_cargo ship.fuel = savedata.fuel - ;memcopy(&savedata.cargo0, ship.cargohold, len(ship.cargohold)) ; TODO fix compiler error about pointer + memcopy(&savedata.cargo0, ship.cargohold, len(ship.cargohold)) galaxy.travel_to(savedata.galaxy, savedata.planet) ; TODO CHECK IF GALAXY AND MARKET ARE OKAY AFTER LOAD @@ -120,7 +120,7 @@ trader { savedata.cash = ship.cash savedata.max_cargo = ship.Max_cargo savedata.fuel = ship.fuel - ;memcopy(ship.cargohold, &savedata.cargo0, len(ship.cargohold)) ; TODO fix compiler error about pointer + memcopy(ship.cargohold, &savedata.cargo0, len(ship.cargohold)) txt.print("\nSaving universe...") diskio.delete(8, Savegame)