mirror of
https://github.com/irmen/prog8.git
synced 2024-10-07 15:57:03 +00:00
give correct error when using memory mapped var as array pointer
This commit is contained in:
parent
a636d3f394
commit
f20ca06f85
@ -112,4 +112,21 @@ class TestAstChecks: FunSpec({
|
|||||||
errors.warnings.size shouldBe 0
|
errors.warnings.size shouldBe 0
|
||||||
errors.errors[0] shouldContain "const modifier can only be used"
|
errors.errors[0] shouldContain "const modifier can only be used"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("array indexing is not allowed on a memory mapped variable") {
|
||||||
|
val text = """
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
&ubyte a = 10000
|
||||||
|
uword z = 500
|
||||||
|
a[4] = (z % 3) as ubyte
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
val errors = ErrorReporterForTests(keepMessagesAfterReporting = true)
|
||||||
|
compileText(C64Target(), true, text, writeAssembly = true, errors=errors)
|
||||||
|
errors.errors.size shouldBe 1
|
||||||
|
errors.warnings.size shouldBe 0
|
||||||
|
errors.errors[0] shouldContain "indexing requires"
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
@ -162,7 +162,8 @@ class TestScoping: FunSpec({
|
|||||||
val errors= ErrorReporterForTests()
|
val errors= ErrorReporterForTests()
|
||||||
compileText(C64Target(), false, text, writeAssembly = false, errors = errors) shouldBe null
|
compileText(C64Target(), false, text, writeAssembly = false, errors = errors) shouldBe null
|
||||||
errors.errors.size shouldBe 1
|
errors.errors.size shouldBe 1
|
||||||
errors.errors[0] shouldContain "undefined symbol: routine2"
|
errors.errors[0] shouldContain "undefined"
|
||||||
|
errors.errors[0] shouldContain "routine2"
|
||||||
}
|
}
|
||||||
|
|
||||||
test("good subroutine calls with qualified names (from root)") {
|
test("good subroutine calls with qualified names (from root)") {
|
||||||
@ -201,10 +202,14 @@ class TestScoping: FunSpec({
|
|||||||
val errors= ErrorReporterForTests()
|
val errors= ErrorReporterForTests()
|
||||||
compileText(C64Target(), false, text, writeAssembly = false, errors=errors) shouldBe null
|
compileText(C64Target(), false, text, writeAssembly = false, errors=errors) shouldBe null
|
||||||
errors.errors.size shouldBe 4
|
errors.errors.size shouldBe 4
|
||||||
errors.errors[0] shouldContain "undefined symbol: start.routine2"
|
errors.errors[0] shouldContain "undefined"
|
||||||
errors.errors[1] shouldContain "undefined symbol: wrong.start.routine2"
|
errors.errors[0] shouldContain "start.routine2"
|
||||||
errors.errors[2] shouldContain "undefined symbol: start.routine2"
|
errors.errors[1] shouldContain "undefined"
|
||||||
errors.errors[3] shouldContain "undefined symbol: wrong.start.routine2"
|
errors.errors[1] shouldContain "wrong.start.routine2"
|
||||||
|
errors.errors[2] shouldContain "undefined"
|
||||||
|
errors.errors[2] shouldContain "start.routine2"
|
||||||
|
errors.errors[3] shouldContain "undefined"
|
||||||
|
errors.errors[3] shouldContain "wrong.start.routine2"
|
||||||
}
|
}
|
||||||
|
|
||||||
test("good variables without qualified names") {
|
test("good variables without qualified names") {
|
||||||
|
@ -315,7 +315,7 @@ class ArrayIndexedExpression(var arrayvar: IdentifierReference,
|
|||||||
return when (target.datatype) {
|
return when (target.datatype) {
|
||||||
DataType.STR, DataType.UWORD -> InferredTypes.knownFor(DataType.UBYTE)
|
DataType.STR, DataType.UWORD -> InferredTypes.knownFor(DataType.UBYTE)
|
||||||
in ArrayDatatypes -> InferredTypes.knownFor(ArrayToElementTypes.getValue(target.datatype))
|
in ArrayDatatypes -> InferredTypes.knownFor(ArrayToElementTypes.getValue(target.datatype))
|
||||||
else -> InferredTypes.unknown()
|
else -> InferredTypes.knownFor(target.datatype)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return InferredTypes.unknown()
|
return InferredTypes.unknown()
|
||||||
|
Loading…
Reference in New Issue
Block a user