Skip to content

Commit 45f7aa7

Browse files
zyn0217cor3ntin
authored andcommitted
Fix Modules/pr62943.cppm
Inspired by 72ac907
1 parent 0652dcc commit 45f7aa7

File tree

3 files changed

+25
-19
lines changed

3 files changed

+25
-19
lines changed

clang/lib/Sema/SemaConcept.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,22 +1556,15 @@ void Sema::DiagnoseUnsatisfiedConstraint(
15561556
const NormalizedConstraint *Sema::getNormalizedAssociatedConstraints(
15571557
ConstrainedDeclOrNestedRequirement ConstrainedDeclOrNestedReq,
15581558
ArrayRef<AssociatedConstraint> AssociatedConstraints) {
1559-
// In case the ConstrainedDecl comes from modules, it is necessary to use
1560-
// the canonical decl to avoid different atomic constraints with the 'same'
1561-
// declarations.
1562-
15631559
if (!ConstrainedDeclOrNestedReq)
15641560
return NormalizedConstraint::fromAssociatedConstraints(
15651561
*this, nullptr, AssociatedConstraints);
15661562

15671563
const NamedDecl *ND =
15681564
ConstrainedDeclOrNestedReq.dyn_cast<const NamedDecl *>();
1569-
if (ND)
1570-
ND = cast<NamedDecl>(ND->getCanonicalDecl());
1571-
15721565
auto CacheEntry = NormalizationCache.find(ConstrainedDeclOrNestedReq);
15731566
if (CacheEntry == NormalizationCache.end()) {
1574-
auto Normalized = NormalizedConstraint::fromAssociatedConstraints(
1567+
auto *Normalized = NormalizedConstraint::fromAssociatedConstraints(
15751568
*this, ND, AssociatedConstraints);
15761569
CacheEntry =
15771570
NormalizationCache.try_emplace(ConstrainedDeclOrNestedReq, Normalized)
@@ -1811,10 +1804,12 @@ NormalizedConstraint *NormalizedConstraint::fromConstraintExpr(
18111804
// constraint. If any such substitution results in an invalid type or
18121805
// expression, the program is ill-formed; no diagnostic is required.
18131806
// [...]
1814-
ConceptDecl *CD = CSE->getNamedConcept();
1807+
1808+
// Use canonical declarations to merge ConceptDecls across
1809+
// different modules.
1810+
ConceptDecl *CD = CSE->getNamedConcept()->getCanonicalDecl();
18151811
SubNF = NormalizedConstraint::fromAssociatedConstraints(
1816-
S, CSE->getNamedConcept(),
1817-
AssociatedConstraint(CD->getConstraintExpr(), SubstIndex));
1812+
S, CD, AssociatedConstraint(CD->getConstraintExpr(), SubstIndex));
18181813

18191814
if (!SubNF)
18201815
return nullptr;

clang/lib/Serialization/ASTReaderStmt.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,15 +802,20 @@ readConstraintSatisfaction(ASTRecordReader &Record) {
802802
if (!Satisfaction.IsSatisfied) {
803803
unsigned NumDetailRecords = Record.readInt();
804804
for (unsigned i = 0; i != NumDetailRecords; ++i) {
805-
if (/* IsDiagnostic */Record.readInt()) {
805+
auto Kind = Record.readInt();
806+
if (Kind == 0) {
806807
SourceLocation DiagLocation = Record.readSourceLocation();
807808
StringRef DiagMessage = C.backupStr(Record.readString());
808809

809810
Satisfaction.Details.emplace_back(
810811
new (C) ConstraintSatisfaction::SubstitutionDiagnostic(
811812
DiagLocation, DiagMessage));
812-
} else
813+
} else if (Kind == 1) {
813814
Satisfaction.Details.emplace_back(Record.readExpr());
815+
} else {
816+
assert(Kind == 2);
817+
Satisfaction.Details.emplace_back(Record.readConceptReference());
818+
}
814819
}
815820
}
816821
return Satisfaction;

clang/lib/Serialization/ASTWriterStmt.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -475,14 +475,20 @@ addConstraintSatisfaction(ASTRecordWriter &Record,
475475
if (!Satisfaction.IsSatisfied) {
476476
Record.push_back(Satisfaction.NumRecords);
477477
for (const auto &DetailRecord : Satisfaction) {
478-
auto *E = dyn_cast<const Expr *>(DetailRecord);
479-
Record.push_back(/* IsDiagnostic */ E == nullptr);
480-
if (E)
481-
Record.AddStmt(const_cast<Expr *>(E));
482-
else {
483-
auto *Diag = cast<std::pair<SourceLocation, StringRef> *>(DetailRecord);
478+
if (auto *Diag =
479+
dyn_cast<std::pair<SourceLocation, StringRef> *>(DetailRecord)) {
480+
Record.push_back(/*Kind=*/0);
484481
Record.AddSourceLocation(Diag->first);
485482
Record.AddString(Diag->second);
483+
continue;
484+
}
485+
if (auto *E = dyn_cast<const Expr *>(DetailRecord)) {
486+
Record.push_back(/*Kind=*/1);
487+
Record.AddStmt(const_cast<Expr *>(E));
488+
} else {
489+
Record.push_back(/*Kind=*/2);
490+
auto *CR = cast<const ConceptReference *>(DetailRecord);
491+
Record.AddConceptReference(CR);
486492
}
487493
}
488494
}

0 commit comments

Comments
 (0)