@@ -1964,23 +1964,25 @@ namespace {
1964
1964
return forceUnwrapIfExpected (result, memberLocator);
1965
1965
}
1966
1966
1967
+ Type refTySelf = refTy, adjustedRefTySelf = adjustedRefTy;
1968
+
1967
1969
auto *func = dyn_cast<FuncDecl>(member);
1968
1970
if (func && func->getResultInterfaceType ()->hasDynamicSelfType ()) {
1969
1971
ASSERT (refTy->hasDynamicSelfType ());
1970
- refTy = refTy->replaceDynamicSelfType (containerTy);
1971
- adjustedRefTy = adjustedRefTy->replaceDynamicSelfType (
1972
+ refTySelf = refTy->replaceDynamicSelfType (containerTy);
1973
+ adjustedRefTySelf = adjustedRefTy->replaceDynamicSelfType (
1972
1974
containerTy);
1973
1975
}
1974
1976
1975
1977
// Handle all other references.
1976
1978
auto declRefExpr = new (ctx) DeclRefExpr (memberRef, memberLoc,
1977
1979
Implicit, semantics);
1978
1980
declRefExpr->setFunctionRefInfo (choice.getFunctionRefInfo ());
1979
- declRefExpr->setType (refTy );
1980
- cs.setType (declRefExpr, refTy );
1981
+ declRefExpr->setType (refTySelf );
1982
+ cs.setType (declRefExpr, refTySelf );
1981
1983
Expr *ref = declRefExpr;
1982
1984
1983
- ref = adjustTypeForDeclReference (ref, refTy, adjustedRefTy , locator);
1985
+ ref = adjustTypeForDeclReference (ref, refTySelf, adjustedRefTySelf , locator);
1984
1986
1985
1987
// A partial application thunk consists of two nested closures:
1986
1988
//
@@ -2087,7 +2089,7 @@ namespace {
2087
2089
// on 'CovariantReturnConversionExpr'.
2088
2090
curryThunkTy = adjustedOpenedType->castTo <FunctionType>();
2089
2091
} else {
2090
- curryThunkTy = adjustedRefTy ->castTo <FunctionType>();
2092
+ curryThunkTy = adjustedRefTySelf ->castTo <FunctionType>();
2091
2093
2092
2094
// Check if we need to open an existential stored inside 'self'.
2093
2095
auto knownOpened = solution.OpenedExistentialTypes .find (
@@ -2123,8 +2125,13 @@ namespace {
2123
2125
const Type replacementTy = getDynamicSelfReplacementType (
2124
2126
baseTy, member, memberLocator.getBaseLocator ());
2125
2127
if (!replacementTy->isEqual (containerTy)) {
2128
+ if (isa<ConstructorDecl>(member)) {
2129
+ adjustedRefTy = adjustedRefTy->withCovariantResultType ();
2130
+ } else {
2131
+ ASSERT (adjustedRefTy->hasDynamicSelfType ());
2132
+ }
2126
2133
Type conversionTy =
2127
- adjustedRefTy->replaceCovariantResultType (replacementTy, 2 );
2134
+ adjustedRefTy->replaceDynamicSelfType (replacementTy);
2128
2135
if (isSuperPartialApplication) {
2129
2136
conversionTy =
2130
2137
conversionTy->castTo <FunctionType>()->getResult ();
0 commit comments