mirror of
				https://github.com/irmen/prog8.git
				synced 2025-11-03 19:16:13 +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