Skip to content

Commit 9665b0d

Browse files
authored
Merge pull request #77592 from xedin/rdar-139675914
[CSSimplify] CGFloat-Double: Fix ambiguity when assigning CGFloat to …
2 parents d3064c5 + 7c35c88 commit 9665b0d

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
@@ -14672,13 +14672,26 @@ ConstraintSystem::simplifyRestrictedConstraintImpl(
1467214672
case ConversionRestrictionKind::CGFloatToDouble: {
1467314673
// Prefer CGFloat -> Double over other way araund.
1467414674
auto impact =
14675-
restriction == ConversionRestrictionKind::CGFloatToDouble ? 1 : 10;
14675+
restriction == ConversionRestrictionKind::CGFloatToDouble ? 2 : 10;
1467614676

1467714677
if (restriction == ConversionRestrictionKind::DoubleToCGFloat) {
1467814678
if (auto *anchor = locator.trySimplifyToExpr()) {
1467914679
if (auto depth = getExprDepth(anchor))
1468014680
impact = (*depth + 1) * impact;
1468114681
}
14682+
} else if (locator.directlyAt<AssignExpr>() ||
14683+
locator.endsWith<LocatorPathElt::ContextualType>()) {
14684+
// Situations like:
14685+
//
14686+
// let _: Double = <<CGFloat>>
14687+
// <var/property of type Double> = <<CGFloat>>
14688+
//
14689+
// Used to be supported due to an incorrect fix added in
14690+
// diagnostic mode. Lower impact here means that right-hand
14691+
// side of the assignment is allowed to maintain CGFloat
14692+
// until the very end which minimizes the number of conversions
14693+
// used and keeps literals as Double when possible.
14694+
impact = 1;
1468214695
}
1468314696

1468414697
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)