@@ -157,21 +157,30 @@ static void computeLoweredProperties(NominalTypeDecl *decl,
157157 if (classDecl->isActor ()) {
158158 ASTContext &ctx = decl->getASTContext ();
159159
160- if (auto actorProto = ctx.getProtocol (KnownProtocolKind::Actor)) {
161- SmallVector<ProtocolConformance *, 1 > conformances;
162- classDecl->lookupConformance (actorProto, conformances);
163- for (auto conformance : conformances)
164- TypeChecker::checkConformance (conformance->getRootNormalConformance ());
165- }
166-
167- // If this is a distributed actor, synthesize its special stored properties.
168- if (classDecl->isDistributedActor ()) {
169- if (auto actorProto = ctx.getProtocol (KnownProtocolKind::DistributedActor)) {
160+ auto evaluateConformance = [&](KnownProtocolKind Kind) {
161+ if (auto actorProto = ctx.getProtocol (Kind)) {
170162 SmallVector<ProtocolConformance *, 1 > conformances;
171163 classDecl->lookupConformance (actorProto, conformances);
172- for (auto conformance : conformances)
173- TypeChecker::checkConformance (conformance->getRootNormalConformance ());
164+ for (auto conformance : conformances) {
165+ // FIXME: This is too much. Instead, we should force the witnesses.
166+ // that we actually need.
167+
168+ auto *normal = conformance->getRootNormalConformance ();
169+ evaluateOrDefault (ctx.evaluator ,
170+ ResolveTypeWitnessesRequest{normal},
171+ evaluator::SideEffect ());
172+ evaluateOrDefault (ctx.evaluator ,
173+ ResolveValueWitnessesRequest{normal},
174+ evaluator::SideEffect ());
175+ }
174176 }
177+ };
178+
179+ evaluateConformance (KnownProtocolKind::Actor);
180+
181+ // If this is a distributed actor, synthesize its special stored properties.
182+ if (classDecl->isDistributedActor ()) {
183+ evaluateConformance (KnownProtocolKind::DistributedActor);
175184 }
176185 }
177186 }
0 commit comments