Skip to content

Commit ab53f2d

Browse files
authored
Merge pull request #50 from zyn0217/fix-access-checking-after-normalization
Fix Modules/pr62943.cppm
2 parents ba2fdcd + ff30282 commit ab53f2d

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
@@ -1540,22 +1540,15 @@ void Sema::DiagnoseUnsatisfiedConstraint(
15401540
const NormalizedConstraint *Sema::getNormalizedAssociatedConstraints(
15411541
ConstrainedDeclOrNestedRequirement ConstrainedDeclOrNestedReq,
15421542
ArrayRef<AssociatedConstraint> AssociatedConstraints) {
1543-
// In case the ConstrainedDecl comes from modules, it is necessary to use
1544-
// the canonical decl to avoid different atomic constraints with the 'same'
1545-
// declarations.
1546-
15471543
if (!ConstrainedDeclOrNestedReq)
15481544
return NormalizedConstraint::fromAssociatedConstraints(
15491545
*this, nullptr, AssociatedConstraints);
15501546

15511547
const NamedDecl *ND =
15521548
ConstrainedDeclOrNestedReq.dyn_cast<const NamedDecl *>();
1553-
if (ND)
1554-
ND = cast<NamedDecl>(ND->getCanonicalDecl());
1555-
15561549
auto CacheEntry = NormalizationCache.find(ConstrainedDeclOrNestedReq);
15571550
if (CacheEntry == NormalizationCache.end()) {
1558-
auto Normalized = NormalizedConstraint::fromAssociatedConstraints(
1551+
auto *Normalized = NormalizedConstraint::fromAssociatedConstraints(
15591552
*this, ND, AssociatedConstraints);
15601553
CacheEntry =
15611554
NormalizationCache.try_emplace(ConstrainedDeclOrNestedReq, Normalized)
@@ -1795,10 +1788,12 @@ NormalizedConstraint *NormalizedConstraint::fromConstraintExpr(
17951788
// constraint. If any such substitution results in an invalid type or
17961789
// expression, the program is ill-formed; no diagnostic is required.
17971790
// [...]
1798-
ConceptDecl *CD = CSE->getNamedConcept();
1791+
1792+
// Use canonical declarations to merge ConceptDecls across
1793+
// different modules.
1794+
ConceptDecl *CD = CSE->getNamedConcept()->getCanonicalDecl();
17991795
SubNF = NormalizedConstraint::fromAssociatedConstraints(
1800-
S, CSE->getNamedConcept(),
1801-
AssociatedConstraint(CD->getConstraintExpr(), SubstIndex));
1796+
S, CD, AssociatedConstraint(CD->getConstraintExpr(), SubstIndex));
18021797

18031798
if (!SubNF)
18041799
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)