mirror of
https://github.com/irmen/prog8.git
synced 2024-09-07 19:54:26 +00:00
check for missing '&' in string + value expressions (can't just add a value to a string)
This commit is contained in:
parent
14407bd1aa
commit
e2b8c069d7
@ -835,6 +835,13 @@ internal class AstChecker(private val program: Program,
|
|||||||
val leftDt = leftIDt.getOr(DataType.UNDEFINED)
|
val leftDt = leftIDt.getOr(DataType.UNDEFINED)
|
||||||
val rightDt = rightIDt.getOr(DataType.UNDEFINED)
|
val rightDt = rightIDt.getOr(DataType.UNDEFINED)
|
||||||
|
|
||||||
|
if(expr.operator=="+" || expr.operator=="-") {
|
||||||
|
if(leftDt == DataType.STR || rightDt == DataType.STR || leftDt in ArrayDatatypes || rightDt in ArrayDatatypes) {
|
||||||
|
errors.err("missing & (address-of) on the string operand", expr.position)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
when(expr.operator){
|
when(expr.operator){
|
||||||
"/", "%" -> {
|
"/", "%" -> {
|
||||||
val constvalRight = expr.right.constValue(program)
|
val constvalRight = expr.right.constValue(program)
|
||||||
|
@ -56,4 +56,45 @@ class TestAstChecks: FunSpec({
|
|||||||
errors.errors[0] shouldContain ":7:28) assignment value is invalid"
|
errors.errors[0] shouldContain ":7:28) assignment value is invalid"
|
||||||
errors.errors[1] shouldContain ":8:28) assignment value is invalid"
|
errors.errors[1] shouldContain ":8:28) assignment value is invalid"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("can't do str or array expression without using address-of") {
|
||||||
|
val text = """
|
||||||
|
%import textio
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
ubyte[] array = [1,2,3,4]
|
||||||
|
str s1 = "test"
|
||||||
|
ubyte ff = 1
|
||||||
|
txt.print(s1+ff)
|
||||||
|
txt.print(array+ff)
|
||||||
|
txt.print_uwhex(s1+ff, true)
|
||||||
|
txt.print_uwhex(array+ff, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
val errors = ErrorReporterForTests()
|
||||||
|
compileText(C64Target, false, text, writeAssembly = false, errors=errors).assertFailure()
|
||||||
|
errors.errors.filter { it.contains("missing &") }.size shouldBe 4
|
||||||
|
}
|
||||||
|
|
||||||
|
test("str or array expression with address-of") {
|
||||||
|
val text = """
|
||||||
|
%import textio
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
ubyte[] array = [1,2,3,4]
|
||||||
|
str s1 = "test"
|
||||||
|
ubyte ff = 1
|
||||||
|
txt.print(&s1+ff)
|
||||||
|
txt.print(&array+ff)
|
||||||
|
txt.print_uwhex(&s1+ff, true)
|
||||||
|
txt.print_uwhex(&array+ff, true)
|
||||||
|
; also good:
|
||||||
|
ff = (s1 == "derp")
|
||||||
|
ff = (s1 != "derp")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
compileText(C64Target, false, text, writeAssembly = false).assertSuccess()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
@ -3,8 +3,6 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
- str s1, ubyte ff, txt.print_uwhex(s1+ff, true) ; TODO fix compiler crash on s1+ff. why no crash when using 1-argument functioncall?
|
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,43 +4,19 @@
|
|||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
str s1 = "irmen@razorvine.net"
|
str s1 = "irmen"
|
||||||
|
ubyte ff = 1
|
||||||
|
txt.print(&s1+ff)
|
||||||
|
txt.nl()
|
||||||
|
txt.print(&s1+ff)
|
||||||
|
txt.nl()
|
||||||
|
txt.print_uwhex(&s1+ff, true)
|
||||||
|
|
||||||
ubyte qq = '@'
|
|
||||||
|
|
||||||
if qq in s1
|
ubyte[] array = [1,2,3,4]
|
||||||
txt.print("good1\n")
|
txt.print_uwhex(&array+ff, true)
|
||||||
else
|
txt.nl()
|
||||||
txt.print("error1\n")
|
txt.print_uwhex(&array+ff, true)
|
||||||
|
txt.nl()
|
||||||
if 'r' in s1
|
|
||||||
txt.print("good2\n")
|
|
||||||
else
|
|
||||||
txt.print("error2\n")
|
|
||||||
|
|
||||||
if qq in "irmen22@razorvine.netirmen22@razorvine.netirmen22@razorvine.netirmen22@razorvine.net"
|
|
||||||
txt.print("good3\n")
|
|
||||||
else
|
|
||||||
txt.print("error3\n")
|
|
||||||
|
|
||||||
qq = 2
|
|
||||||
if qq in [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
|
|
||||||
txt.print("good4\n")
|
|
||||||
else
|
|
||||||
txt.print("error4\n")
|
|
||||||
|
|
||||||
qq='z'
|
|
||||||
if qq in "irm@razo"
|
|
||||||
txt.print("good5\n")
|
|
||||||
else
|
|
||||||
txt.print("error5\n")
|
|
||||||
|
|
||||||
uword zz = 2222
|
|
||||||
if zz in [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2222,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
|
|
||||||
txt.print("good6\n")
|
|
||||||
else
|
|
||||||
txt.print("error6\n")
|
|
||||||
|
|
||||||
; str s1, ubyte ff, txt.print_uwhex(s1+ff, true) ; TODO fix compiler crash on s1+ff. why no crash when using 1-argument functioncall?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user