@@ -1964,23 +1964,25 @@ namespace {
19641964 return forceUnwrapIfExpected (result, memberLocator);
19651965 }
19661966
1967+ Type refTySelf = refTy, adjustedRefTySelf = adjustedRefTy;
1968+
19671969 auto *func = dyn_cast<FuncDecl>(member);
19681970 if (func && func->getResultInterfaceType ()->hasDynamicSelfType ()) {
19691971 ASSERT (refTy->hasDynamicSelfType ());
1970- refTy = refTy->replaceDynamicSelfType (containerTy);
1971- adjustedRefTy = adjustedRefTy->replaceDynamicSelfType (
1972+ refTySelf = refTy->replaceDynamicSelfType (containerTy);
1973+ adjustedRefTySelf = adjustedRefTy->replaceDynamicSelfType (
19721974 containerTy);
19731975 }
19741976
19751977 // Handle all other references.
19761978 auto declRefExpr = new (ctx) DeclRefExpr (memberRef, memberLoc,
19771979 Implicit, semantics);
19781980 declRefExpr->setFunctionRefInfo (choice.getFunctionRefInfo ());
1979- declRefExpr->setType (refTy );
1980- cs.setType (declRefExpr, refTy );
1981+ declRefExpr->setType (refTySelf );
1982+ cs.setType (declRefExpr, refTySelf );
19811983 Expr *ref = declRefExpr;
19821984
1983- ref = adjustTypeForDeclReference (ref, refTy, adjustedRefTy , locator);
1985+ ref = adjustTypeForDeclReference (ref, refTySelf, adjustedRefTySelf , locator);
19841986
19851987 // A partial application thunk consists of two nested closures:
19861988 //
@@ -2087,7 +2089,7 @@ namespace {
20872089 // on 'CovariantReturnConversionExpr'.
20882090 curryThunkTy = adjustedOpenedType->castTo <FunctionType>();
20892091 } else {
2090- curryThunkTy = adjustedRefTy ->castTo <FunctionType>();
2092+ curryThunkTy = adjustedRefTySelf ->castTo <FunctionType>();
20912093
20922094 // Check if we need to open an existential stored inside 'self'.
20932095 auto knownOpened = solution.OpenedExistentialTypes .find (
@@ -2123,8 +2125,13 @@ namespace {
21232125 const Type replacementTy = getDynamicSelfReplacementType (
21242126 baseTy, member, memberLocator.getBaseLocator ());
21252127 if (!replacementTy->isEqual (containerTy)) {
2128+ if (isa<ConstructorDecl>(member)) {
2129+ adjustedRefTy = adjustedRefTy->withCovariantResultType ();
2130+ } else {
2131+ ASSERT (adjustedRefTy->hasDynamicSelfType ());
2132+ }
21262133 Type conversionTy =
2127- adjustedRefTy->replaceCovariantResultType (replacementTy, 2 );
2134+ adjustedRefTy->replaceDynamicSelfType (replacementTy);
21282135 if (isSuperPartialApplication) {
21292136 conversionTy =
21302137 conversionTy->castTo <FunctionType>()->getResult ();
0 commit comments