mirror of
https://github.com/irmen/prog8.git
synced 2025-11-02 13:16:07 +00:00
rollback implicit casts to boolean in struct initializers and function call arguments
This commit is contained in:
@@ -679,14 +679,8 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val
|
||||
val sourceDt = expressionToCast.inferType(program).getOrUndef()
|
||||
if(sourceDt.base == requiredType.base)
|
||||
return
|
||||
if(requiredType.isBool) {
|
||||
if(sourceDt.isNumeric || sourceDt.isPointer) {
|
||||
// only allow numerics and pointers to be implicitly cast to bool
|
||||
val cast = TypecastExpression(expressionToCast, DataType.BOOL, true, expressionToCast.position)
|
||||
modifications += IAstModification.ReplaceNode(expressionToCast, cast, parent)
|
||||
}
|
||||
return
|
||||
}
|
||||
if(requiredType.isBool)
|
||||
return // don't allow any implicit cast to bool
|
||||
|
||||
// uwords are allowed to be assigned to pointers without a cast
|
||||
if(requiredType.isPointer && sourceDt.isUnsignedWord)
|
||||
|
||||
@@ -1356,8 +1356,8 @@ main {
|
||||
val errors=ErrorReporterForTests()
|
||||
compileText(VMTarget(), false, src, outputDir, errors=errors) shouldBe null
|
||||
errors.errors.size shouldBe 4
|
||||
errors.errors[0] shouldContain "doesn't match target type"
|
||||
errors.errors[1] shouldContain "doesn't match target type"
|
||||
errors.errors[0] shouldContain "incompatible type"
|
||||
errors.errors[1] shouldContain "incompatible type"
|
||||
errors.errors[2] shouldContain "doesn't match target type"
|
||||
errors.errors[3] shouldContain "doesn't match target type"
|
||||
}
|
||||
|
||||
@@ -679,7 +679,7 @@ main {
|
||||
errors.errors[3] shouldContain ("value type bool doesn't match target")
|
||||
}
|
||||
|
||||
test("bool function parameters correct typing and implicit casts to bool") {
|
||||
test("bool function parameters correct typing and no implicit casts to bool") {
|
||||
val src = """
|
||||
main {
|
||||
sub start() {
|
||||
@@ -703,8 +703,15 @@ main {
|
||||
}"""
|
||||
val errors = ErrorReporterForTests()
|
||||
compileText(C64Target(), false, src, outputDir, writeAssembly = false, errors = errors) shouldBe null
|
||||
errors.errors.size shouldBe 1
|
||||
errors.errors[0] shouldContain ("value type bool doesn't match target")
|
||||
errors.errors.size shouldBe 8
|
||||
errors.errors[0] shouldContain ("type mismatch")
|
||||
errors.errors[1] shouldContain ("type mismatch")
|
||||
errors.errors[2] shouldContain ("type mismatch")
|
||||
errors.errors[3] shouldContain ("type mismatch")
|
||||
errors.errors[4] shouldContain ("type mismatch")
|
||||
errors.errors[5] shouldContain ("type mismatch")
|
||||
errors.errors[6] shouldContain ("type mismatch")
|
||||
errors.errors[7] shouldContain ("value type bool doesn't match target")
|
||||
}
|
||||
|
||||
test("no implicit bool-to-int cast in assignment") {
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
TODO
|
||||
====
|
||||
|
||||
initializing a struct with a numberic for a boolean field, should give a type error (seems to silently cast to bool now)
|
||||
|
||||
|
||||
STRUCTS and TYPED POINTERS
|
||||
--------------------------
|
||||
|
||||
@@ -6,9 +6,20 @@ main {
|
||||
}
|
||||
|
||||
sub start() {
|
||||
bool @shared b1
|
||||
|
||||
b1 = 4.44
|
||||
b1 = 99
|
||||
bfunc(4.44)
|
||||
bfunc(99)
|
||||
|
||||
^^Enemy @shared e1 = Enemy()
|
||||
^^Enemy @shared e2 = Enemy(1,2,3,true)
|
||||
^^Enemy @shared e3 = Enemy(1,2,3,4) ; TODO type error for the boolean
|
||||
^^Enemy @shared e4 = Enemy(1,2,3,4.555) ; TODO type error for the boolean
|
||||
^^Enemy @shared e3 = Enemy(1,2,3,4)
|
||||
^^Enemy @shared e4 = Enemy(1,2,3,4.555)
|
||||
}
|
||||
|
||||
sub bfunc(bool bb) {
|
||||
cx16.r0++
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user