Merge pull request #60883 from xedin/rdar-99352676

[ConstraintSystem] Teach `init` ref validation about implicit conversions
This commit is contained in:
Pavel Yaskevich
2022-08-31 17:57:42 -07:00
committed by GitHub
2 changed files with 18 additions and 9 deletions

View File

@@ -8861,17 +8861,14 @@ static ConstraintFix *validateInitializerRef(ConstraintSystem &cs,
if (!anchor)
return nullptr;
// Avoid checking implicit conversions injected by the compiler.
if (locator->findFirst<LocatorPathElt::ImplicitConversion>())
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<LocatorPathElt::ConstructorMember>()
? 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[.<member] = ...`
// which means MetatypeType has to be added after finding a type variable.
if (locatorEndsWith(baseLocator, ConstraintLocator::MemberRefBase))
if (baseLocator->isLastElement<LocatorPathElt::MemberRefBase>())
baseType = MetatypeType::get(baseType);
} else if (auto *keyPathExpr = getAsExpr<KeyPathExpr>(anchor)) {
// Key path can't refer to initializers e.g. `\Type.init`

View File

@@ -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
}
}
}