Skip to content

Commit c1f7771

Browse files
authored
Merge pull request swiftlang#81998 from DougGregor/raw-conformance-isolation-cleanup
Make (Raw)ConformanceIsolation requests work on the normal protocol conformance
2 parents 352f392 + 6891452 commit c1f7771

File tree

5 files changed

+41
-42
lines changed

5 files changed

+41
-42
lines changed

include/swift/AST/ProtocolConformance.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class alignas(1 << DeclAlignInBits) ProtocolConformance
148148
Kind : bitmax(NumProtocolConformanceKindBits, 8),
149149

150150
/// Whether the "raw" conformance isolation is "inferred", which applies to most conformances.
151-
IsRawConformanceInferred : 1,
151+
IsRawIsolationInferred : 1,
152152

153153
/// Whether the computed actor isolation is nonisolated.
154154
IsComputedNonisolated : 1
@@ -205,16 +205,16 @@ class alignas(1 << DeclAlignInBits) ProtocolConformance
205205
ProtocolConformance(ProtocolConformanceKind kind, Type conformingType)
206206
: ConformingType(conformingType) {
207207
Bits.ProtocolConformance.Kind = unsigned(kind);
208-
Bits.ProtocolConformance.IsRawConformanceInferred = false;
208+
Bits.ProtocolConformance.IsRawIsolationInferred = false;
209209
Bits.ProtocolConformance.IsComputedNonisolated = false;
210210
}
211211

212-
bool isRawConformanceInferred() const {
213-
return Bits.ProtocolConformance.IsRawConformanceInferred;
212+
bool isRawIsolationInferred() const {
213+
return Bits.ProtocolConformance.IsRawIsolationInferred;
214214
}
215215

216216
void setRawConformanceInferred(bool value = true) {
217-
Bits.ProtocolConformance.IsRawConformanceInferred = value;
217+
Bits.ProtocolConformance.IsRawIsolationInferred = value;
218218
}
219219

220220
bool isComputedNonisolated() const {

include/swift/AST/TypeCheckRequests.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ class ConformanceHasEffectRequest :
477477

478478
class RawConformanceIsolationRequest :
479479
public SimpleRequest<RawConformanceIsolationRequest,
480-
std::optional<ActorIsolation>(ProtocolConformance *),
480+
std::optional<ActorIsolation>(NormalProtocolConformance *),
481481
RequestFlags::SeparatelyCached |
482482
RequestFlags::SplitCached> {
483483
public:
@@ -488,7 +488,7 @@ class RawConformanceIsolationRequest :
488488

489489
// Evaluation.
490490
std::optional<ActorIsolation>
491-
evaluate(Evaluator &evaluator, ProtocolConformance *conformance) const;
491+
evaluate(Evaluator &evaluator, NormalProtocolConformance *conformance) const;
492492

493493
public:
494494
// Separate caching.
@@ -499,7 +499,7 @@ class RawConformanceIsolationRequest :
499499

500500
class ConformanceIsolationRequest :
501501
public SimpleRequest<ConformanceIsolationRequest,
502-
ActorIsolation(ProtocolConformance *),
502+
ActorIsolation(NormalProtocolConformance *),
503503
RequestFlags::SeparatelyCached |
504504
RequestFlags::SplitCached> {
505505
public:
@@ -510,7 +510,7 @@ class ConformanceIsolationRequest :
510510

511511
// Evaluation.
512512
ActorIsolation
513-
evaluate(Evaluator &evaluator, ProtocolConformance *conformance) const;
513+
evaluate(Evaluator &evaluator, NormalProtocolConformance *conformance) const;
514514

515515
public:
516516
// Separate caching.

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,11 +407,11 @@ SWIFT_REQUEST(TypeChecker, ConformanceHasEffectRequest,
407407
bool(EffectKind, ProtocolConformanceRef),
408408
Cached, NoLocationInfo)
409409
SWIFT_REQUEST(TypeChecker, RawConformanceIsolationRequest,
410-
std::optional<ActorIsolation>(ProtocolConformance *),
410+
std::optional<ActorIsolation>(NormalProtocolConformance *),
411411
SeparatelyCached | SplitCached,
412412
NoLocationInfo)
413413
SWIFT_REQUEST(TypeChecker, ConformanceIsolationRequest,
414-
ActorIsolation(ProtocolConformance *),
414+
ActorIsolation(NormalProtocolConformance *),
415415
SeparatelyCached | SplitCached,
416416
NoLocationInfo)
417417
SWIFT_REQUEST(TypeChecker, ResolveTypeRequest,

lib/AST/TypeCheckRequests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1378,7 +1378,7 @@ RawConformanceIsolationRequest::getCachedResult() const {
13781378
auto conformance = std::get<0>(getStorage());
13791379

13801380
// Was actor isolation non-isolated?
1381-
if (conformance->isRawConformanceInferred())
1381+
if (conformance->isRawIsolationInferred())
13821382
return std::optional<ActorIsolation>();
13831383

13841384
ASTContext &ctx = conformance->getDeclContext()->getASTContext();

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7991,46 +7991,55 @@ bool swift::diagnoseNonSendableFromDeinit(
79917991
}
79927992

79937993
std::optional<ActorIsolation> ProtocolConformance::getRawIsolation() const {
7994+
// Only normal protocol conformances can be isolated.
7995+
auto rootNormal =
7996+
dyn_cast<NormalProtocolConformance>(this->getRootConformance());
7997+
if (!rootNormal)
7998+
return ActorIsolation::forNonisolated(false);
7999+
8000+
if (this != rootNormal)
8001+
return rootNormal->getRawIsolation();
8002+
79948003
ASTContext &ctx = getDeclContext()->getASTContext();
7995-
auto conformance = const_cast<ProtocolConformance *>(this);
8004+
auto conformance = const_cast<NormalProtocolConformance *>(rootNormal);
79968005
return evaluateOrDefault(
79978006
ctx.evaluator, RawConformanceIsolationRequest{conformance},
79988007
ActorIsolation());
79998008
}
80008009

80018010
ActorIsolation ProtocolConformance::getIsolation() const {
8011+
// Only normal protocol conformances can be isolated.
8012+
auto rootNormal =
8013+
dyn_cast<NormalProtocolConformance>(this->getRootConformance());
8014+
if (!rootNormal)
8015+
return ActorIsolation::forNonisolated(false);
8016+
8017+
if (this != rootNormal)
8018+
return rootNormal->getIsolation();
8019+
80028020
ASTContext &ctx = getDeclContext()->getASTContext();
8003-
auto conformance = const_cast<ProtocolConformance *>(this);
8021+
auto conformance = const_cast<NormalProtocolConformance *>(rootNormal);
80048022
return evaluateOrDefault(
80058023
ctx.evaluator, ConformanceIsolationRequest{conformance},
80068024
ActorIsolation());
80078025
}
80088026

80098027
std::optional<ActorIsolation>
80108028
RawConformanceIsolationRequest::evaluate(
8011-
Evaluator &evaluator, ProtocolConformance *conformance
8029+
Evaluator &evaluator, NormalProtocolConformance *conformance
80128030
) const {
8013-
// Only normal protocol conformances can be isolated.
8014-
auto rootNormal =
8015-
dyn_cast<NormalProtocolConformance>(conformance->getRootConformance());
8016-
if (!rootNormal)
8017-
return ActorIsolation::forNonisolated(false);
8018-
8019-
if (conformance != rootNormal)
8020-
return rootNormal->getRawIsolation();
8021-
80228031
// If the conformance is explicitly non-isolated, report that.
8023-
if (rootNormal->getOptions().contains(ProtocolConformanceFlags::Nonisolated))
8032+
if (conformance->getOptions().contains(ProtocolConformanceFlags::Nonisolated))
80248033
return ActorIsolation::forNonisolated(false);
80258034

80268035
// If there is an explicitly-specified global actor on the isolation,
80278036
// resolve it and report it.
8028-
if (auto globalActorTypeExpr = rootNormal->getExplicitGlobalActorIsolation()) {
8037+
if (auto globalActorTypeExpr = conformance->getExplicitGlobalActorIsolation()) {
80298038
// If we don't already have a resolved global actor type, resolve it now.
80308039
Type globalActorType = globalActorTypeExpr->getInstanceType();
80318040
if (!globalActorType) {
80328041
const auto resolution = TypeResolution::forInterface(
8033-
rootNormal->getDeclContext(), std::nullopt,
8042+
conformance->getDeclContext(), std::nullopt,
80348043
/*unboundTyOpener*/ nullptr,
80358044
/*placeholderHandler*/ nullptr,
80368045
/*packElementOpener*/ nullptr);
@@ -8048,9 +8057,9 @@ RawConformanceIsolationRequest::evaluate(
80488057
return ActorIsolation::forGlobalActor(globalActorType);
80498058
}
80508059

8051-
auto dc = rootNormal->getDeclContext();
8060+
auto dc = conformance->getDeclContext();
80528061
ASTContext &ctx = dc->getASTContext();
8053-
auto proto = rootNormal->getProtocol();
8062+
auto proto = conformance->getProtocol();
80548063

80558064
// If the protocol itself is isolated, don't infer isolation for the
80568065
// conformance.
@@ -8064,7 +8073,7 @@ RawConformanceIsolationRequest::evaluate(
80648073
return ActorIsolation::forNonisolated(false);
80658074

80668075
// @preconcurrency disables isolation inference.
8067-
if (rootNormal->isPreconcurrency())
8076+
if (conformance->isPreconcurrency())
80688077
return ActorIsolation::forNonisolated(false);
80698078

80708079
return std::nullopt;
@@ -8129,25 +8138,15 @@ ActorIsolation swift::inferConformanceIsolation(
81298138

81308139
ActorIsolation
81318140
ConformanceIsolationRequest::evaluate(
8132-
Evaluator &evaluator, ProtocolConformance *conformance
8141+
Evaluator &evaluator, NormalProtocolConformance *conformance
81338142
) const {
81348143
// If there is raw isolation, use that.
81358144
if (auto rawIsolation = conformance->getRawIsolation())
81368145
return *rawIsolation;
81378146

81388147
// Otherwise, we may infer isolation.
8139-
8140-
// Only normal protocol conformances can be isolated.
8141-
auto rootNormal =
8142-
dyn_cast<NormalProtocolConformance>(conformance->getRootConformance());
8143-
if (!rootNormal)
8144-
return ActorIsolation::forNonisolated(false);
8145-
8146-
if (conformance != rootNormal)
8147-
return rootNormal->getIsolation();
8148-
81498148
return inferConformanceIsolation(
8150-
rootNormal, /*hasKnownIsolatedWitness=*/false);
8149+
conformance, /*hasKnownIsolatedWitness=*/false);
81518150
}
81528151

81538152
namespace {

0 commit comments

Comments
 (0)