Skip to content

Commit 420cf6c

Browse files
committed
Improve "reference-to" message somewhat
1 parent 48b8ba3 commit 420cf6c

File tree

5 files changed

+25
-17
lines changed

5 files changed

+25
-17
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,8 @@ ERROR(precedence_group_redeclared,none,
894894
"precedence group redeclared", ())
895895
NOTE(previous_precedence_group_decl,none,
896896
"previous precedence group declaration here", ())
897+
NOTE(circular_reference_through_precedence_group, none,
898+
"through reference to precedence group %0 here", (Identifier))
897899

898900
//------------------------------------------------------------------------------
899901
// MARK: Expression Type Checking Errors

include/swift/AST/TypeCheckRequests.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1449,11 +1449,15 @@ class InterfaceTypeRequest :
14491449
};
14501450

14511451
struct PrecedenceGroupDescriptor {
1452+
enum PathDirection : bool {
1453+
LowerThan = false,
1454+
HigherThan = true,
1455+
};
14521456
DeclContext *dc;
14531457
Identifier ident;
14541458
SourceLoc nameLoc;
14551459
// Exists for diagnostics. Does not contribute to the descriptor otherwise.
1456-
Optional<bool> pathDirection;
1460+
Optional<PathDirection> pathDirection;
14571461

14581462
SourceLoc getLoc() const;
14591463

lib/AST/TypeCheckRequests.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,15 +1039,16 @@ SourceLoc LookupPrecedenceGroupRequest::getNearestLoc() const {
10391039
void LookupPrecedenceGroupRequest::diagnoseCycle(DiagnosticEngine &diags) const {
10401040
auto &desc = std::get<0>(getStorage());
10411041
if (auto pathDir = desc.pathDirection) {
1042-
diags.diagnose(desc.nameLoc, diag::precedence_group_cycle, *pathDir);
1042+
diags.diagnose(desc.nameLoc, diag::precedence_group_cycle, (bool)*pathDir);
10431043
} else {
10441044
diags.diagnose(desc.nameLoc, diag::circular_reference);
10451045
}
10461046
}
10471047

1048-
void LookupPrecedenceGroupRequest::noteCycleStep(DiagnosticEngine &diags) const {
1048+
void LookupPrecedenceGroupRequest::noteCycleStep(DiagnosticEngine &diag) const {
10491049
auto &desc = std::get<0>(getStorage());
1050-
diags.diagnose(desc.nameLoc, diag::circular_reference_through);
1050+
diag.diagnose(desc.nameLoc,
1051+
diag::circular_reference_through_precedence_group, desc.ident);
10511052
}
10521053

10531054
SourceLoc PrecedenceGroupDescriptor::getLoc() const {

lib/Sema/TypeCheckDecl.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,14 +1860,15 @@ static void validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
18601860
return;
18611861

18621862
auto &Diags = PGD->getASTContext().Diags;
1863-
1863+
18641864
// Validate the higherThan relationships.
18651865
bool addedHigherThan = false;
18661866
for (auto &rel : PGD->getMutableHigherThan()) {
1867-
if (rel.Group) continue;
1867+
if (rel.Group)
1868+
continue;
18681869

1869-
PrecedenceGroupDescriptor desc{PGD->getDeclContext(), rel.Name,
1870-
rel.NameLoc, true};
1870+
PrecedenceGroupDescriptor desc{PGD->getDeclContext(), rel.Name, rel.NameLoc,
1871+
PrecedenceGroupDescriptor::HigherThan};
18711872
auto group = evaluateOrDefault(PGD->getASTContext().evaluator,
18721873
LookupPrecedenceGroupRequest{desc}, nullptr);
18731874
if (group) {
@@ -1882,11 +1883,12 @@ static void validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
18821883

18831884
// Validate the lowerThan relationships.
18841885
for (auto &rel : PGD->getMutableLowerThan()) {
1885-
if (rel.Group) continue;
1886+
if (rel.Group)
1887+
continue;
18861888

18871889
auto dc = PGD->getDeclContext();
1888-
PrecedenceGroupDescriptor desc{PGD->getDeclContext(), rel.Name,
1889-
rel.NameLoc, false};
1890+
PrecedenceGroupDescriptor desc{PGD->getDeclContext(), rel.Name, rel.NameLoc,
1891+
PrecedenceGroupDescriptor::LowerThan};
18901892
auto group = evaluateOrDefault(PGD->getASTContext().evaluator,
18911893
LookupPrecedenceGroupRequest{desc}, nullptr);
18921894
bool hadError = false;
@@ -1906,8 +1908,7 @@ static void validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
19061908
if (group &&
19071909
group->getDeclContext()->getParentModule() == dc->getParentModule()) {
19081910
if (!PGD->isInvalid()) {
1909-
Diags.diagnose(rel.NameLoc,
1910-
diag::precedence_group_lower_within_module);
1911+
Diags.diagnose(rel.NameLoc, diag::precedence_group_lower_within_module);
19111912
Diags.diagnose(group->getNameLoc(), diag::kind_declared_here,
19121913
DescriptiveDeclKind::PrecedenceGroup);
19131914
}
@@ -1918,7 +1919,7 @@ static void validatePrecedenceGroup(PrecedenceGroupDecl *PGD) {
19181919
PGD->setInvalid();
19191920
}
19201921

1921-
// Try to catch trickier cycles that request evaluation alone can't.
1922+
// Try to diagnose trickier cycles that request evaluation alone can't catch.
19221923
if (addedHigherThan)
19231924
checkPrecedenceCircularity(Diags, PGD);
19241925
}

test/decl/precedencegroup/circularity.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ precedencegroup C0 {
1818
higherThan: C1 // expected-error {{cycle in 'higherThan' relation}}
1919
}
2020
precedencegroup C1 {
21-
higherThan: C0 // expected-note{{through reference here}}
21+
higherThan: C0 // expected-note{{through reference to precedence group 'C0' here}}
2222
}
2323

2424
precedencegroup D0 {
2525
higherThan: D1 // expected-error {{cycle in 'higherThan' relation}}
2626
}
2727
precedencegroup D1 {
28-
higherThan: D2 // expected-note{{through reference here}}
28+
higherThan: D2 // expected-note{{through reference to precedence group 'D2' here}}
2929
}
3030
precedencegroup D2 {
31-
higherThan: D0 // expected-note{{through reference here}}
31+
higherThan: D0 // expected-note{{through reference to precedence group 'D0' here}}
3232
}
3333

3434
precedencegroup E0 {

0 commit comments

Comments
 (0)