Skip to content

Commit 5c6128f

Browse files
authored
Merge pull request swiftlang#78547 from xedin/rdar-139675914-6.1
[6.1][CSSimplify] CGFloat-Double: Fix ambiguity when assigning CGFloat to …
2 parents 87f4cae + 005576d commit 5c6128f

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

lib/Sema/CSSimplify.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -14805,13 +14805,26 @@ ConstraintSystem::simplifyRestrictedConstraintImpl(
1480514805
case ConversionRestrictionKind::CGFloatToDouble: {
1480614806
// Prefer CGFloat -> Double over other way araund.
1480714807
auto impact =
14808-
restriction == ConversionRestrictionKind::CGFloatToDouble ? 1 : 10;
14808+
restriction == ConversionRestrictionKind::CGFloatToDouble ? 2 : 10;
1480914809

1481014810
if (restriction == ConversionRestrictionKind::DoubleToCGFloat) {
1481114811
if (auto *anchor = locator.trySimplifyToExpr()) {
1481214812
if (auto depth = getExprDepth(anchor))
1481314813
impact = (*depth + 1) * impact;
1481414814
}
14815+
} else if (locator.directlyAt<AssignExpr>() ||
14816+
locator.endsWith<LocatorPathElt::ContextualType>()) {
14817+
// Situations like:
14818+
//
14819+
// let _: Double = <<CGFloat>>
14820+
// <var/property of type Double> = <<CGFloat>>
14821+
//
14822+
// Used to be supported due to an incorrect fix added in
14823+
// diagnostic mode. Lower impact here means that right-hand
14824+
// side of the assignment is allowed to maintain CGFloat
14825+
// until the very end which minimizes the number of conversions
14826+
// used and keeps literals as Double when possible.
14827+
impact = 1;
1481514828
}
1481614829

1481714830
increaseScore(SK_ImplicitValueConversion, locator, impact);
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)