FIR checker: report UNSAFE_CALL for overloaded function calls

Previously if an unsafe call is to an overloaded function, FIR checkers
report NONE_APPLICABLE. This change instead report them as UNSAFE_CALL
or its variants.
This commit is contained in:
Tianyu Geng
2021-04-09 21:26:07 +03:00
committed by Mikhail Glukhikh
parent 92df1f575a
commit 454ae3b17a
30 changed files with 83 additions and 142 deletions
@@ -346,22 +346,22 @@ class case_14_class {
if (!funWithReturnsTrueAndInvertCondition(value_1 is Float? && value_1 != null && value_2 != null && o.prop_1 != null)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (funWithReturnsFalse(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (funWithReturnsNotNull(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null) == null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (funWithReturnsNull(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null) != null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
}
}
@@ -415,26 +415,26 @@ class case_17_class {
if (contracts.case_17_1(value_1, value_2, o.prop_1, this.prop_1)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (contracts.case_17_2(value_1, value_2, o.prop_1, this.prop_1)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (contracts.case_17_3(value_1, value_2, o.prop_1, this.prop_1) == null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (contracts.case_17_4(value_1, value_2, o.prop_1, this.prop_1) != null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(this.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
}
}
@@ -38,7 +38,7 @@ class case_5_class {
funWithReturns(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null)
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
}
@@ -131,22 +131,22 @@ class case_10_class {
if (funWithReturnsTrue(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (!funWithReturnsFalse(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (funWithReturnsNotNull(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null) != null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (funWithReturnsNull(value_1 !is Float? || value_1 == null || value_2 == null || o.prop_1 == null || this.prop_1 == null) == null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
}
}
@@ -105,7 +105,7 @@ class case_3_class {
contracts.case_3(value_1, value_2, o.prop_1, this.prop_1)
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
}
@@ -158,22 +158,22 @@ class case_6_class {
if (contracts.case_6_1(value_1, value_2, o.prop_1, this.prop_1)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (!contracts.case_6_2(value_1, value_2, o.prop_1, this.prop_1)) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (contracts.case_6_3(value_1, value_2, o.prop_1, this.prop_1) == null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
if (contracts.case_6_4(value_1, value_2, o.prop_1, this.prop_1) != null) {
println(value_1.<!INAPPLICABLE_CANDIDATE!>dec<!>())
println(value_2?.toByte())
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1.<!NONE_APPLICABLE!>plus<!>(3))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(o.prop_1<!UNSAFE_CALL!>.<!>plus(3))
}
}
}
@@ -14,7 +14,7 @@ fun case_1(x: Double?, y: Double?) : Double {
} else if (x == null && y != null) {
y
} else {
x <!NONE_APPLICABLE!>+<!> y
x <!UNSAFE_OPERATOR_CALL!>+<!> y
}
}