@@ -2849,8 +2849,13 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
28492849 /* dispatch*/ false );
28502850 case ReadWriteImplKind::StoredWithDidSet:
28512851 case ReadWriteImplKind::InheritedWithDidSet:
2852- if (storage->requiresOpaqueModifyCoroutine () &&
2852+ if (storage->requiresOpaqueModify2Coroutine () &&
28532853 storage->getParsedAccessor (AccessorKind::DidSet)->isSimpleDidSet ()) {
2854+ return AccessStrategy::getAccessor (AccessorKind::Modify2,
2855+ /* dispatch*/ false );
2856+ } else if (storage->requiresOpaqueModifyCoroutine () &&
2857+ storage->getParsedAccessor (AccessorKind::DidSet)
2858+ ->isSimpleDidSet ()) {
28542859 return AccessStrategy::getAccessor (AccessorKind::Modify,
28552860 /* dispatch*/ false );
28562861 } else {
@@ -2868,6 +2873,8 @@ getDirectReadWriteAccessStrategy(const AbstractStorageDecl *storage) {
28682873
28692874static AccessStrategy
28702875getOpaqueReadAccessStrategy (const AbstractStorageDecl *storage, bool dispatch) {
2876+ if (storage->requiresOpaqueRead2Coroutine ())
2877+ return AccessStrategy::getAccessor (AccessorKind::Read2, dispatch);
28712878 if (storage->requiresOpaqueReadCoroutine ())
28722879 return AccessStrategy::getAccessor (AccessorKind::Read, dispatch);
28732880 return AccessStrategy::getAccessor (AccessorKind::Get, dispatch);
@@ -2883,6 +2890,8 @@ getOpaqueWriteAccessStrategy(const AbstractStorageDecl *storage, bool dispatch)
28832890static AccessStrategy
28842891getOpaqueReadWriteAccessStrategy (const AbstractStorageDecl *storage,
28852892 bool dispatch) {
2893+ if (storage->requiresOpaqueModify2Coroutine ())
2894+ return AccessStrategy::getAccessor (AccessorKind::Modify2, dispatch);
28862895 if (storage->requiresOpaqueModifyCoroutine ())
28872896 return AccessStrategy::getAccessor (AccessorKind::Modify, dispatch);
28882897 return AccessStrategy::getMaterializeToTemporary (
@@ -2990,11 +2999,13 @@ bool AbstractStorageDecl::requiresOpaqueAccessor(AccessorKind kind) const {
29902999 case AccessorKind::Set:
29913000 return requiresOpaqueSetter ();
29923001 case AccessorKind::Read:
2993- case AccessorKind::Read2:
29943002 return requiresOpaqueReadCoroutine ();
3003+ case AccessorKind::Read2:
3004+ return requiresOpaqueRead2Coroutine ();
29953005 case AccessorKind::Modify:
2996- case AccessorKind::Modify2:
29973006 return requiresOpaqueModifyCoroutine ();
3007+ case AccessorKind::Modify2:
3008+ return requiresOpaqueModify2Coroutine ();
29983009
29993010 // Other accessors are never part of the opaque-accessors set.
30003011#define OPAQUE_ACCESSOR (ID, KEYWORD )
@@ -3006,11 +3017,37 @@ bool AbstractStorageDecl::requiresOpaqueAccessor(AccessorKind kind) const {
30063017 llvm_unreachable (" bad accessor kind" );
30073018}
30083019
3020+ bool AbstractStorageDecl::requiresOpaqueReadCoroutine () const {
3021+ ASTContext &ctx = getASTContext ();
3022+ if (ctx.LangOpts .hasFeature (Feature::CoroutineAccessors))
3023+ return requiresCorrespondingUnderscoredCoroutineAccessor (
3024+ AccessorKind::Read2);
3025+ return getOpaqueReadOwnership () != OpaqueReadOwnership::Owned;
3026+ }
3027+
3028+ bool AbstractStorageDecl::requiresOpaqueRead2Coroutine () const {
3029+ ASTContext &ctx = getASTContext ();
3030+ if (!ctx.LangOpts .hasFeature (Feature::CoroutineAccessors))
3031+ return false ;
3032+ return getOpaqueReadOwnership () != OpaqueReadOwnership::Owned;
3033+ }
3034+
30093035bool AbstractStorageDecl::requiresOpaqueModifyCoroutine () const {
30103036 ASTContext &ctx = getASTContext ();
3011- return evaluateOrDefault (ctx.evaluator ,
3012- RequiresOpaqueModifyCoroutineRequest{const_cast <AbstractStorageDecl *>(this )},
3013- false );
3037+ return evaluateOrDefault (
3038+ ctx.evaluator ,
3039+ RequiresOpaqueModifyCoroutineRequest{
3040+ const_cast <AbstractStorageDecl *>(this ), /* isUnderscored=*/ true },
3041+ false );
3042+ }
3043+
3044+ bool AbstractStorageDecl::requiresOpaqueModify2Coroutine () const {
3045+ ASTContext &ctx = getASTContext ();
3046+ return evaluateOrDefault (
3047+ ctx.evaluator ,
3048+ RequiresOpaqueModifyCoroutineRequest{
3049+ const_cast <AbstractStorageDecl *>(this ), /* isUnderscored=*/ false },
3050+ false );
30143051}
30153052
30163053AccessorDecl *AbstractStorageDecl::getSynthesizedAccessor (AccessorKind kind) const {
@@ -3109,13 +3146,19 @@ void AbstractStorageDecl::visitExpectedOpaqueAccessors(
31093146 if (requiresOpaqueReadCoroutine ())
31103147 visit (AccessorKind::Read);
31113148
3149+ if (requiresOpaqueRead2Coroutine ())
3150+ visit (AccessorKind::Read2);
3151+
31123152 // All mutable storage should have a setter.
31133153 if (requiresOpaqueSetter ())
31143154 visit (AccessorKind::Set);
31153155
31163156 // Include the modify coroutine if it's required.
31173157 if (requiresOpaqueModifyCoroutine ())
31183158 visit (AccessorKind::Modify);
3159+
3160+ if (requiresOpaqueModify2Coroutine ())
3161+ visit (AccessorKind::Modify2);
31193162}
31203163
31213164void AbstractStorageDecl::visitOpaqueAccessors (
0 commit comments