mirror of
https://github.com/irmen/prog8.git
synced 2025-01-11 13:29:45 +00:00
fixed compiler crash when assigning number larger than 65535
This commit is contained in:
parent
3d1b0eb843
commit
7bb41a30ed
@ -451,6 +451,10 @@ internal class AstChecker(private val program: Program,
|
|||||||
errors.err("typecasting a float value in-place makes no sense", assignment.value.position)
|
errors.err("typecasting a float value in-place makes no sense", assignment.value.position)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val numvalue = assignment.value.constValue(program)
|
||||||
|
if(numvalue!=null && targetDt.isKnown)
|
||||||
|
checkValueTypeAndRange(targetDt.getOr(DataType.UNDEFINED), numvalue)
|
||||||
|
|
||||||
super.visit(assignment)
|
super.visit(assignment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,11 +145,40 @@ class TestNumbers: FunSpec({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
val errors = ErrorReporterForTests(keepMessagesAfterReporting = true)
|
val errors = ErrorReporterForTests()
|
||||||
compileText(C64Target, true, src, writeAssembly = false, errors=errors).assertFailure()
|
compileText(C64Target, true, src, writeAssembly = false, errors=errors).assertFailure()
|
||||||
errors.errors.size shouldBe 2
|
errors.errors.size shouldBe 2
|
||||||
errors.warnings.size shouldBe 0
|
errors.warnings.size shouldBe 0
|
||||||
errors.errors[0] shouldContain "converted to float"
|
errors.errors[0] shouldContain "converted to float"
|
||||||
errors.errors[1] shouldContain "converted to float"
|
errors.errors[1] shouldContain "converted to float"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("out of range number assignments") {
|
||||||
|
val src="""
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
uword @shared qq = ${'$'}2ff33
|
||||||
|
cx16.r0 = ${'$'}1fc0f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
val errors = ErrorReporterForTests()
|
||||||
|
compileText(C64Target, true, src, writeAssembly = false, errors=errors).assertFailure()
|
||||||
|
errors.errors.size shouldBe 2
|
||||||
|
errors.warnings.size shouldBe 0
|
||||||
|
errors.errors[0] shouldContain "out of range"
|
||||||
|
errors.errors[1] shouldContain "out of range"
|
||||||
|
}
|
||||||
|
|
||||||
|
test("big numbers okay in const expressions if result fits") {
|
||||||
|
val src="""
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
uword @shared qq = ${'$'}2ff33 >> 4
|
||||||
|
cx16.r0 = ${'$'}1fc0f >> 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
compileText(C64Target, true, src, writeAssembly = false).assertSuccess()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
@ -573,8 +573,9 @@ class TestOptimization: FunSpec({
|
|||||||
"""
|
"""
|
||||||
val errors = ErrorReporterForTests()
|
val errors = ErrorReporterForTests()
|
||||||
compileText(C64Target, optimize=true, src, writeAssembly=false, errors = errors).assertFailure()
|
compileText(C64Target, optimize=true, src, writeAssembly=false, errors = errors).assertFailure()
|
||||||
errors.errors.size shouldBe 1
|
errors.errors.size shouldBe 2
|
||||||
errors.errors[0] shouldContain "type of value BYTE doesn't match target UBYTE"
|
errors.errors[0] shouldContain "type of value BYTE doesn't match target UBYTE"
|
||||||
|
errors.errors[1] shouldContain "out of range"
|
||||||
}
|
}
|
||||||
|
|
||||||
test("test augmented expression asmgen") {
|
test("test augmented expression asmgen") {
|
||||||
|
@ -3,7 +3,6 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
- FIx: cx16.r0 = $1fc0f compiler crash
|
|
||||||
- Fix: uword addr = label ; addr will be 0! required to use &label!
|
- Fix: uword addr = label ; addr will be 0! required to use &label!
|
||||||
- Fix compiler stack overflow crash:
|
- Fix compiler stack overflow crash:
|
||||||
sub sprite_y_for_row(ubyte row) -> word {
|
sub sprite_y_for_row(ubyte row) -> word {
|
||||||
|
@ -3,22 +3,7 @@
|
|||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
move()
|
uword @shared qq = $2ff33
|
||||||
}
|
cx16.r0 = $1fc0f
|
||||||
|
|
||||||
sub move() {
|
|
||||||
ubyte mb = cx16.mouse_pos()
|
|
||||||
ubyte @shared xx = cx16.r0H
|
|
||||||
ubyte @shared yy = cx16.r0L
|
|
||||||
func(cx16.r0H)
|
|
||||||
func(cx16.r0L)
|
|
||||||
cx16.vpoke(1, $fc08+2, cx16.r0H)
|
|
||||||
cx16.vpoke(1, $fc08+3, cx16.r0L)
|
|
||||||
}
|
|
||||||
|
|
||||||
asmsub func(ubyte qq @A) {
|
|
||||||
%asm {{
|
|
||||||
rts
|
|
||||||
}}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user