@@ -1875,6 +1875,13 @@ synthesizeModify2CoroutineSetterBody(AccessorDecl *setter, ASTContext &ctx) {
18751875 setter, TargetImpl::Implementation, setter->getStorage (), ctx);
18761876}
18771877
1878+ static std::pair<BraceStmt *, bool >
1879+ synthesizeMutateSetterBody (AccessorDecl *setter, ASTContext &ctx) {
1880+ // This should call the mutate accessor.
1881+ return synthesizeTrivialSetterBodyWithStorage (
1882+ setter, TargetImpl::Implementation, setter->getStorage (), ctx);
1883+ }
1884+
18781885static Expr *maybeWrapInOutExpr (Expr *expr, ASTContext &ctx) {
18791886 if (auto lvalueType = expr->getType ()->getAs <LValueType>()) {
18801887 auto type = lvalueType->getObjectType ();
@@ -2071,7 +2078,7 @@ synthesizeSetterBody(AccessorDecl *setter, ASTContext &ctx) {
20712078 return synthesizeModify2CoroutineSetterBody (setter, ctx);
20722079
20732080 case WriteImplKind::Mutate:
2074- llvm_unreachable ( " synthesizing setter from mutate " );
2081+ return synthesizeMutateSetterBody ( setter, ctx );
20752082 }
20762083 llvm_unreachable (" bad WriteImplKind" );
20772084}
@@ -2476,7 +2483,9 @@ static AccessorDecl *createSetterPrototype(AbstractStorageDecl *storage,
24762483 }
24772484 break ;
24782485 case WriteImplKind::Mutate:
2479- llvm_unreachable (" mutate accessor is not yet implemented" );
2486+ if (auto mutate = storage->getOpaqueAccessor (AccessorKind::Mutate)) {
2487+ asAvailableAs.push_back (mutate);
2488+ }
24802489 }
24812490
24822491 if (!asAvailableAs.empty ()) {
@@ -2804,11 +2813,6 @@ bool RequiresOpaqueModifyCoroutineRequest::evaluate(
28042813 if (protoDecl->isObjC ())
28052814 return false ;
28062815
2807- // If a mutate accessor is present, we don't need a modify coroutine
2808- if (storage->getAccessor (AccessorKind::Mutate)) {
2809- return false ;
2810- }
2811-
28122816 return true ;
28132817}
28142818
@@ -2937,9 +2941,8 @@ IsAccessorTransparentRequest::evaluate(Evaluator &evaluator,
29372941 case WriteImplKind::MutableAddress:
29382942 case WriteImplKind::Modify:
29392943 case WriteImplKind::Modify2:
2940- break ;
29412944 case WriteImplKind::Mutate:
2942- llvm_unreachable ( " mutate accessor is not yet implemented " ) ;
2945+ break ;
29432946 }
29442947 break ;
29452948
@@ -2950,14 +2953,12 @@ IsAccessorTransparentRequest::evaluate(Evaluator &evaluator,
29502953 case AccessorKind::Init:
29512954 break ;
29522955 case AccessorKind::Borrow:
2953- llvm_unreachable (" borrow accessor is not yet implemented" );
29542956 case AccessorKind::WillSet:
29552957 case AccessorKind::DidSet:
29562958 case AccessorKind::Address:
29572959 case AccessorKind::MutableAddress:
2958- llvm_unreachable (" bad synthesized function kind" );
29592960 case AccessorKind::Mutate:
2960- llvm_unreachable (" mutate accessor is not yet implemented " );
2961+ llvm_unreachable (" bad synthesized function kind " );
29612962 }
29622963
29632964 switch (storage->getReadWriteImpl ()) {
0 commit comments