File tree 2 files changed +63
-1
lines changed
2 files changed +63
-1
lines changed Original file line number Diff line number Diff line change @@ -14805,13 +14805,26 @@ ConstraintSystem::simplifyRestrictedConstraintImpl(
14805
14805
case ConversionRestrictionKind::CGFloatToDouble: {
14806
14806
// Prefer CGFloat -> Double over other way araund.
14807
14807
auto impact =
14808
- restriction == ConversionRestrictionKind::CGFloatToDouble ? 1 : 10;
14808
+ restriction == ConversionRestrictionKind::CGFloatToDouble ? 2 : 10;
14809
14809
14810
14810
if (restriction == ConversionRestrictionKind::DoubleToCGFloat) {
14811
14811
if (auto *anchor = locator.trySimplifyToExpr()) {
14812
14812
if (auto depth = getExprDepth(anchor))
14813
14813
impact = (*depth + 1) * impact;
14814
14814
}
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;
14815
14828
}
14816
14829
14817
14830
increaseScore(SK_ImplicitValueConversion, locator, impact);
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments