@@ -759,22 +759,27 @@ namespace {
759759 new (ctx) DeclRefExpr (ref, loc, implicit, semantics, fullType);
760760 cs.cacheType (declRefExpr);
761761 declRefExpr->setFunctionRefKind (choice.getFunctionRefKind ());
762- Expr *result = adjustTypeForDeclReference (
763- declRefExpr, fullType, adjustedFullType, locator);
764- // If we have to load, do so now.
765- if (loadImmediately)
766- result = cs.addImplicitLoadExpr (result);
767762
768- result = forceUnwrapIfExpected (result , locator);
763+ Expr * result = forceUnwrapIfExpected (declRefExpr , locator);
769764
770765 if (auto *fnDecl = dyn_cast<AbstractFunctionDecl>(decl)) {
771766 if (AnyFunctionRef (fnDecl).hasExternalPropertyWrapperParameters () &&
772767 (declRefExpr->getFunctionRefKind () == FunctionRefKind::Compound ||
773768 declRefExpr->getFunctionRefKind () == FunctionRefKind::Unapplied)) {
774- result = buildSingleCurryThunk (result, fnDecl, locator);
769+ // We don't need to do any further adjustment once we've built the
770+ // curry thunk.
771+ return buildSingleCurryThunk (result, fnDecl,
772+ adjustedFullType->castTo <FunctionType>(),
773+ locator);
775774 }
776775 }
777776
777+ result = adjustTypeForDeclReference (result, fullType, adjustedFullType,
778+ locator);
779+ // If we have to load, do so now.
780+ if (loadImmediately)
781+ result = cs.addImplicitLoadExpr (result);
782+
778783 return result;
779784 }
780785
@@ -1406,41 +1411,20 @@ namespace {
14061411 // / parameters.
14071412 // / \param declOrClosure The underlying function-like declaration or
14081413 // / closure we're going to call.
1414+ // / \param thunkTy The type of the resulting thunk. This should be the
1415+ // / type of the \c fnExpr, with any potential adjustments for things like
1416+ // / concurrency.
14091417 // / \param locator The locator pinned on the function reference carried
14101418 // / by \p fnExpr. If the function has associated applied property wrappers,
14111419 // / the locator is used to pull them in.
14121420 AutoClosureExpr *buildSingleCurryThunk (Expr *fnExpr,
14131421 DeclContext *declOrClosure,
1422+ FunctionType *thunkTy,
14141423 ConstraintLocatorBuilder locator) {
1415- auto *const thunkTy = cs.getType (fnExpr)->castTo <FunctionType>();
1416-
14171424 return buildSingleCurryThunk (/* baseExpr=*/ nullptr , fnExpr, declOrClosure,
14181425 thunkTy, locator);
14191426 }
14201427
1421- // / Build a "{ args in base.fn(args) }" single-expression curry thunk.
1422- // /
1423- // / \param baseExpr The base expression to be captured.
1424- // / \param fnExpr The expression to be called by consecutively applying
1425- // / the \p baseExpr and thunk parameters.
1426- // / \param declOrClosure The underlying function-like declaration or
1427- // / closure we're going to call.
1428- // / \param locator The locator pinned on the function reference carried
1429- // / by \p fnExpr. If the function has associated applied property wrappers,
1430- // / the locator is used to pull them in.
1431- AutoClosureExpr *buildSingleCurryThunk (Expr *baseExpr, Expr *fnExpr,
1432- DeclContext *declOrClosure,
1433- ConstraintLocatorBuilder locator) {
1434- assert (baseExpr);
1435- auto *const thunkTy = cs.getType (fnExpr)
1436- ->castTo <FunctionType>()
1437- ->getResult ()
1438- ->castTo <FunctionType>();
1439-
1440- return buildSingleCurryThunk (baseExpr, fnExpr, declOrClosure, thunkTy,
1441- locator);
1442- }
1443-
14441428 // / Build a "{ self in { args in self.fn(args) } }" nested curry thunk.
14451429 // /
14461430 // / \param memberRef The expression to be called in the inner thunk by
@@ -1577,8 +1561,8 @@ namespace {
15771561 ConstraintLocatorBuilder memberLocator, bool Implicit,
15781562 AccessSemantics semantics) {
15791563 const auto &choice = overload.choice ;
1580- const auto openedType = overload.openedType ;
1581- const auto adjustedOpenedType = overload.adjustedOpenedType ;
1564+ const auto openedType = simplifyType ( overload.openedType ) ;
1565+ const auto adjustedOpenedType = simplifyType ( overload.adjustedOpenedType ) ;
15821566
15831567 ValueDecl *member = choice.getDecl ();
15841568
@@ -1639,7 +1623,7 @@ namespace {
16391623 // If we're referring to a member type, it's just a type
16401624 // reference.
16411625 if (auto *TD = dyn_cast<TypeDecl>(member)) {
1642- Type refType = simplifyType ( adjustedOpenedType) ;
1626+ Type refType = adjustedOpenedType;
16431627 auto ref = TypeExpr::createForDecl (memberLoc, TD, dc);
16441628 cs.setType (ref, refType);
16451629 auto *result = new (context) DotSyntaxBaseIgnoredExpr (
@@ -1770,10 +1754,8 @@ namespace {
17701754 ref->setImplicit (Implicit);
17711755 // FIXME: FunctionRefKind
17721756
1773- auto computeRefType = [&](Type openedType) {
1774- // Compute the type of the reference.
1775- Type refType = simplifyType (openedType);
1776-
1757+ // Compute the type of the reference.
1758+ auto computeRefType = [&](Type refType) {
17771759 // If the base was an opened existential, erase the opened
17781760 // existential.
17791761 if (openedExistential) {
@@ -1859,7 +1841,7 @@ namespace {
18591841 // type having 'Self' swapped for the appropriate replacement
18601842 // type -- usually the base object type.
18611843 if (hasDynamicSelf) {
1862- const auto conversionTy = simplifyType ( adjustedOpenedType) ;
1844+ const auto conversionTy = adjustedOpenedType;
18631845 if (!containerTy->isEqual (conversionTy)) {
18641846 result = cs.cacheType (new (context) CovariantReturnConversionExpr (
18651847 result, conversionTy));
@@ -1911,9 +1893,10 @@ namespace {
19111893 // have side effects, instead of abstracting out a 'self' parameter.
19121894 const auto isSuperPartialApplication = needsCurryThunk && isSuper;
19131895 if (isSuperPartialApplication) {
1914- ref = buildSingleCurryThunk (base, declRefExpr,
1915- cast<AbstractFunctionDecl>(member),
1916- memberLocator);
1896+ ref = buildSingleCurryThunk (
1897+ base, declRefExpr, cast<AbstractFunctionDecl>(member),
1898+ adjustedOpenedType->castTo <FunctionType>(),
1899+ memberLocator);
19171900 } else if (needsCurryThunk) {
19181901 // Another case where we want to build a single closure is when
19191902 // we have a partial application of a static member. It is better
@@ -1929,14 +1912,13 @@ namespace {
19291912 cs.getType (base));
19301913 cs.setType (base, base->getType ());
19311914
1932- auto *closure = buildSingleCurryThunk (
1933- base, declRefExpr, cast<AbstractFunctionDecl>(member),
1934- memberLocator);
1935-
19361915 // Skip the code below -- we're not building an extra level of
19371916 // call by applying the metatype; instead, the closure we just
19381917 // built is the curried reference.
1939- return closure;
1918+ return buildSingleCurryThunk (
1919+ base, declRefExpr, cast<AbstractFunctionDecl>(member),
1920+ adjustedOpenedType->castTo <FunctionType>(),
1921+ memberLocator);
19401922 } else {
19411923 // Add a useless ".self" to avoid downstream diagnostics, in case
19421924 // the type ref is still a TypeExpr.
@@ -1967,7 +1949,7 @@ namespace {
19671949
19681950 auto *closure = buildSingleCurryThunk (
19691951 baseRef, declRefExpr, cast<AbstractFunctionDecl>(member),
1970- simplifyType ( adjustedOpenedType) ->castTo <FunctionType>(),
1952+ adjustedOpenedType->castTo <FunctionType>(),
19711953 memberLocator);
19721954
19731955 // Wrap the closure in a capture list.
@@ -1994,7 +1976,7 @@ namespace {
19941976 // must be downcast to the opened archetype before being erased to the
19951977 // subclass existential to cope with the expectations placed
19961978 // on 'CovariantReturnConversionExpr'.
1997- curryThunkTy = simplifyType ( adjustedOpenedType) ->castTo <FunctionType>();
1979+ curryThunkTy = adjustedOpenedType->castTo <FunctionType>();
19981980 } else {
19991981 curryThunkTy = adjustedRefTy->castTo <FunctionType>();
20001982
@@ -2060,7 +2042,7 @@ namespace {
20602042 apply = ConstructorRefCallExpr::create (context, ref, base);
20612043 } else if (isUnboundInstanceMember) {
20622044 ref = adjustTypeForDeclReference (
2063- ref, cs.getType (ref), cs. simplifyType ( adjustedOpenedType) ,
2045+ ref, cs.getType (ref), adjustedOpenedType,
20642046 locator);
20652047
20662048 // Reference to an unbound instance method.
@@ -8876,8 +8858,10 @@ namespace {
88768858 rewriteFunction (closure);
88778859
88788860 if (AnyFunctionRef (closure).hasExternalPropertyWrapperParameters ()) {
8861+ auto *thunkTy = Rewriter.cs .getType (closure)->castTo <FunctionType>();
88798862 return Action::SkipNode (Rewriter.buildSingleCurryThunk (
8880- closure, closure, Rewriter.cs .getConstraintLocator (closure)));
8863+ closure, closure, thunkTy,
8864+ Rewriter.cs .getConstraintLocator (closure)));
88818865 }
88828866
88838867 return Action::SkipNode (closure);
0 commit comments