diff --git a/lib/Sema/CSSimplify.cpp b/lib/Sema/CSSimplify.cpp index 77fdbaeb6f4b4..41e8fbbe8841d 100644 --- a/lib/Sema/CSSimplify.cpp +++ b/lib/Sema/CSSimplify.cpp @@ -8861,17 +8861,14 @@ static ConstraintFix *validateInitializerRef(ConstraintSystem &cs, if (!anchor) return nullptr; + // Avoid checking implicit conversions injected by the compiler. + if (locator->findFirst()) + return nullptr; + auto getType = [&cs](Expr *expr) -> Type { return cs.simplifyType(cs.getType(expr))->getRValueType(); }; - auto locatorEndsWith = - [](ConstraintLocator *locator, - ConstraintLocator::PathElementKind eltKind) -> bool { - auto path = locator->getPath(); - return !path.empty() && path.back().getKind() == eltKind; - }; - Expr *baseExpr = nullptr; Type baseType; @@ -8928,7 +8925,7 @@ static ConstraintFix *validateInitializerRef(ConstraintSystem &cs, // member. // We need to find type variable which represents contextual base. auto *baseLocator = cs.getConstraintLocator( - UME, locatorEndsWith(locator, ConstraintLocator::ConstructorMember) + UME, locator->isLastElement() ? ConstraintLocator::UnresolvedMember : ConstraintLocator::MemberRefBase); @@ -8943,7 +8940,7 @@ static ConstraintFix *validateInitializerRef(ConstraintSystem &cs, baseType = cs.simplifyType(*result)->getRValueType(); // Constraint for member base is formed as '$T.Type[.isLastElement()) baseType = MetatypeType::get(baseType); } else if (auto *keyPathExpr = getAsExpr(anchor)) { // Key path can't refer to initializers e.g. `\Type.init` diff --git a/test/Constraints/implicit_double_cgfloat_conversion.swift b/test/Constraints/implicit_double_cgfloat_conversion.swift index e32394cbe1f90..653e136f4d4f9 100644 --- a/test/Constraints/implicit_double_cgfloat_conversion.swift +++ b/test/Constraints/implicit_double_cgfloat_conversion.swift @@ -330,3 +330,15 @@ func test_implicit_conversion_clash_with_partial_application_check() { } } } + +// rdar://99352676 +func test_init_validation() { + class Foo { + static let bar = 100.0 + + func getBar() -> CGFloat? { + return Self.bar + // CHECK: function_ref @$s12CoreGraphics7CGFloatVyACSdcfC : $@convention(method) (Double, @thin CGFloat.Type) -> CGFloat + } + } +}