partly fix weird errors for ptr indexed expressions

This commit is contained in:
Irmen de Jong
2025-05-17 22:56:41 +02:00
parent 770ebdcd4a
commit 5f3829d5cc
5 changed files with 68 additions and 59 deletions

View File

@@ -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) {

View File

@@ -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 {

View File

@@ -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"
}
})