Skip to content

Commit 6205aac

Browse files
committed
[Sema] Factor out lookupPrecedenceGroupForRelation
And handle a cycle specially rather than defaulting to nullptr and doing another lookup to check.
1 parent 6290d8c commit 6205aac

File tree

1 file changed

+37
-29
lines changed

1 file changed

+37
-29
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,30 +1336,46 @@ lookupPrecedenceGroup(const PrecedenceGroupDescriptor &descriptor) {
13361336
}
13371337
}
13381338

1339+
static PrecedenceGroupDecl *lookupPrecedenceGroupForRelation(
1340+
DeclContext *dc, PrecedenceGroupDecl::Relation rel,
1341+
PrecedenceGroupDescriptor::PathDirection direction) {
1342+
auto &ctx = dc->getASTContext();
1343+
PrecedenceGroupDescriptor desc{dc, rel.Name, rel.NameLoc, direction};
1344+
auto result = ctx.evaluator(ValidatePrecedenceGroupRequest{desc});
1345+
if (!result) {
1346+
// Handle a cycle error specially. We don't want to default to an empty
1347+
// result, as we don't want to emit an error about not finding a precedence
1348+
// group.
1349+
using Error = CyclicalRequestError<ValidatePrecedenceGroupRequest>;
1350+
llvm::handleAllErrors(result.takeError(), [](const Error &E) {});
1351+
return nullptr;
1352+
}
1353+
if (!result.get()) {
1354+
ctx.Diags.diagnose(rel.NameLoc, diag::unknown_precedence_group, rel.Name);
1355+
}
1356+
return result.get();
1357+
}
1358+
13391359
void swift::validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
13401360
assert(PGD && "Cannot validate a null precedence group!");
13411361
if (PGD->isInvalid())
13421362
return;
13431363

13441364
auto &Diags = PGD->getASTContext().Diags;
1365+
auto *dc = PGD->getDeclContext();
13451366

13461367
// Validate the higherThan relationships.
13471368
bool addedHigherThan = false;
13481369
for (auto &rel : PGD->getMutableHigherThan()) {
13491370
if (rel.Group)
13501371
continue;
13511372

1352-
PrecedenceGroupDescriptor desc{PGD->getDeclContext(), rel.Name, rel.NameLoc,
1353-
PrecedenceGroupDescriptor::HigherThan};
1354-
auto group =
1355-
evaluateOrDefault(PGD->getASTContext().evaluator,
1356-
ValidatePrecedenceGroupRequest{desc}, nullptr);
1357-
if (group) {
1358-
rel.Group = group;
1373+
// TODO: Requestify the lookup of a relation's group.
1374+
rel.Group = lookupPrecedenceGroupForRelation(
1375+
dc, rel, PrecedenceGroupDescriptor::HigherThan);
1376+
if (rel.Group) {
13591377
addedHigherThan = true;
13601378
} else {
1361-
if (!lookupPrecedenceGroup(desc))
1362-
Diags.diagnose(rel.NameLoc, diag::unknown_precedence_group, rel.Name);
13631379
PGD->setInvalid();
13641380
}
13651381
}
@@ -1369,24 +1385,16 @@ void swift::validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
13691385
if (rel.Group)
13701386
continue;
13711387

1372-
auto dc = PGD->getDeclContext();
1373-
PrecedenceGroupDescriptor desc{PGD->getDeclContext(), rel.Name, rel.NameLoc,
1374-
PrecedenceGroupDescriptor::LowerThan};
1375-
auto group =
1376-
evaluateOrDefault(PGD->getASTContext().evaluator,
1377-
ValidatePrecedenceGroupRequest{desc}, nullptr);
1378-
bool hadError = false;
1379-
if (group) {
1380-
rel.Group = group;
1381-
} else {
1382-
hadError = true;
1383-
if (auto *rawGroup = lookupPrecedenceGroup(desc)) {
1384-
// We already know the lowerThan path is errant, try to use the results
1385-
// of a raw lookup to enforce the same-module restriction.
1386-
group = rawGroup;
1387-
} else {
1388-
Diags.diagnose(rel.NameLoc, diag::unknown_precedence_group, rel.Name);
1389-
}
1388+
auto *group = lookupPrecedenceGroupForRelation(
1389+
dc, rel, PrecedenceGroupDescriptor::LowerThan);
1390+
rel.Group = group;
1391+
1392+
// If we didn't find anything, try doing a raw lookup for the group before
1393+
// diagnosing the 'lowerThan' within the same-module restriction. This can
1394+
// allow us to diagnose even if we have a precedence group cycle.
1395+
if (!group) {
1396+
group = lookupPrecedenceGroup(PrecedenceGroupDescriptor{
1397+
dc, rel.Name, rel.NameLoc, PrecedenceGroupDescriptor::LowerThan});
13901398
}
13911399

13921400
if (group &&
@@ -1396,10 +1404,10 @@ void swift::validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
13961404
Diags.diagnose(group->getNameLoc(), diag::kind_declared_here,
13971405
DescriptiveDeclKind::PrecedenceGroup);
13981406
}
1399-
hadError = true;
1407+
PGD->setInvalid();
14001408
}
14011409

1402-
if (hadError)
1410+
if (!rel.Group)
14031411
PGD->setInvalid();
14041412
}
14051413

0 commit comments

Comments
 (0)