mirror of
https://github.com/irmen/prog8.git
synced 2025-11-01 22:16:16 +00:00
partly fix weird errors for ptr indexed expressions
This commit is contained in:
@@ -2362,6 +2362,12 @@ internal class AstChecker(private val program: Program,
|
||||
errors.err("on..goto index must be an unsigned byte", onGoto.index.position)
|
||||
}
|
||||
}
|
||||
|
||||
override fun visit(idxderef: PtrIndexedDereference) {
|
||||
val dt = idxderef.indexed.arrayvar.inferType(program)
|
||||
if(!dt.isUnsignedWord && !dt.isPointer)
|
||||
errors.err("cannot array index on this field type", idxderef.indexed.position)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun checkUnusedReturnValues(call: FunctionCallStatement, target: Statement, errors: IErrorReporter) {
|
||||
|
||||
@@ -108,14 +108,18 @@ class SimplifiedAstMaker(private val program: Program, private val errors: IErro
|
||||
val type = idxderef.inferType(program).getOrElse {
|
||||
throw FatalAstException("unknown dt")
|
||||
}
|
||||
require(type.isPointer && type.sub!=null)
|
||||
val deref = PtPointerIndexedDeref(DataType.forDt(type.sub!!), idxderef.position)
|
||||
val indexer = PtArrayIndexer(DataType.forDt(type.sub!!), idxderef.position)
|
||||
val identifier = PtIdentifier(idxderef.indexed.arrayvar.nameInSource.joinToString("."), type, idxderef.indexed.arrayvar.position)
|
||||
indexer.add(identifier)
|
||||
indexer.add(transformExpression(idxderef.indexed.indexer.indexExpr))
|
||||
deref.add(indexer)
|
||||
return deref
|
||||
require(type.isPointer || type.isUnsignedWord)
|
||||
if(type.isUnsignedWord) {
|
||||
TODO("indexing uword field $idxderef") // TODO hmm, wasn't there code elsewhere for this already?
|
||||
} else {
|
||||
val deref = PtPointerIndexedDeref(DataType.forDt(type.sub!!), idxderef.position)
|
||||
val indexer = PtArrayIndexer(DataType.forDt(type.sub!!), idxderef.position)
|
||||
val identifier = PtIdentifier(idxderef.indexed.arrayvar.nameInSource.joinToString("."), type, idxderef.indexed.arrayvar.position)
|
||||
indexer.add(identifier)
|
||||
indexer.add(transformExpression(idxderef.indexed.indexer.indexExpr))
|
||||
deref.add(indexer)
|
||||
return deref
|
||||
}
|
||||
}
|
||||
|
||||
private fun transform(deref: PtrDereference): PtPointerDeref {
|
||||
|
||||
@@ -314,4 +314,28 @@ main {
|
||||
a2.target.array shouldNotBe null
|
||||
}
|
||||
|
||||
test("array indexing on non pointer fields give correct error messages") {
|
||||
val src="""
|
||||
main {
|
||||
struct List {
|
||||
bool s
|
||||
ubyte n
|
||||
uword ptr
|
||||
}
|
||||
sub start() {
|
||||
^^List @shared l1 = List()
|
||||
l1.s[1] = 4444
|
||||
l1.n[1] = true
|
||||
l1.ptr[1] = 4444
|
||||
}
|
||||
}"""
|
||||
|
||||
val errors = ErrorReporterForTests()
|
||||
compileText(VMTarget(), false, src, outputDir, errors=errors) shouldBe null
|
||||
errors.errors.size shouldBe 4
|
||||
errors.errors[0] shouldContain "cannot array index"
|
||||
errors.errors[1] shouldContain "cannot array index"
|
||||
errors.errors[2] shouldContain "out of range"
|
||||
}
|
||||
|
||||
})
|
||||
Reference in New Issue
Block a user