Skip to content

Commit 7c35c88

Browse files
committed
[CSSimplify] CGFloat-Double: Fix ambiguity when assigning CGFloat to double property/variable
Situations like: ``` let _: Double = <<CGFloat>> <var/property of type Double> = <<CGFloat>> ``` Used to be supported due to an incorrect fix added in diagnostic mode. Lower impact here means that right-hand side of the assignment is allowed to maintain CGFloat until the very end which minimizes the number of conversions used and keeps literals as Double when possible. Resolves: rdar://139675914
1 parent 11f9ea7 commit 7c35c88

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

lib/Sema/CSSimplify.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14664,13 +14664,26 @@ ConstraintSystem::simplifyRestrictedConstraintImpl(
1466414664
case ConversionRestrictionKind::CGFloatToDouble: {
1466514665
// Prefer CGFloat -> Double over other way araund.
1466614666
auto impact =
14667-
restriction == ConversionRestrictionKind::CGFloatToDouble ? 1 : 10;
14667+
restriction == ConversionRestrictionKind::CGFloatToDouble ? 2 : 10;
1466814668

1466914669
if (restriction == ConversionRestrictionKind::DoubleToCGFloat) {
1467014670
if (auto *anchor = locator.trySimplifyToExpr()) {
1467114671
if (auto depth = getExprDepth(anchor))
1467214672
impact = (*depth + 1) * impact;
1467314673
}
14674+
} else if (locator.directlyAt<AssignExpr>() ||
14675+
locator.endsWith<LocatorPathElt::ContextualType>()) {
14676+
// Situations like:
14677+
//
14678+
// let _: Double = <<CGFloat>>
14679+
// <var/property of type Double> = <<CGFloat>>
14680+
//
14681+
// Used to be supported due to an incorrect fix added in
14682+
// diagnostic mode. Lower impact here means that right-hand
14683+
// side of the assignment is allowed to maintain CGFloat
14684+
// until the very end which minimizes the number of conversions
14685+
// used and keeps literals as Double when possible.
14686+
impact = 1;
1467414687
}
1467514688

1467614689
increaseScore(SK_ImplicitValueConversion, locator, impact);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
// REQUIRES: objc_interop
4+
5+
// Note this cannot use a fake Foundation because it lacks required operator overloads
6+
7+
import Foundation
8+
import CoreGraphics
9+
10+
do {
11+
func test(a: CGFloat, b: CGFloat) {
12+
let _: Double = a + b + 1 // Ok
13+
let _: Double = a + b + 1.0 // Ok
14+
15+
var test: Double
16+
17+
test = a + b + 1 // Ok
18+
test = a + b + 1.0 // Ok
19+
20+
_ = test
21+
22+
let _ = a + b + 1 // Ok
23+
let _ = a + b + 1.0 // Ok
24+
25+
let _: Double = 1 + 2 + 3 // Ok
26+
27+
test = 1 + 2 + 3 // Ok
28+
}
29+
}
30+
31+
func test(cond: Bool, a: CGFloat, b: CGFloat) {
32+
var test: Double
33+
34+
let width = a - b // CGFloat
35+
36+
if cond {
37+
test = (width - 10) / 2 // Ok
38+
} else {
39+
test = (width - 20.0) / 3 // Ok
40+
}
41+
42+
_ = test
43+
}
44+
45+
func test_atan_ambiguity(points: (CGPoint, CGPoint)) {
46+
var test = 0.0
47+
test = atan((points.1.y - points.0.y) / (points.1.x - points.0.x)) // Ok
48+
_ = test
49+
}

0 commit comments

Comments
 (0)