Skip to content

Commit 1cce903

Browse files
committed
fix nested diags and canonicalization
1 parent 99a1db5 commit 1cce903

File tree

3 files changed

+15
-24
lines changed

3 files changed

+15
-24
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14856,8 +14856,9 @@ class Sema final : public SemaBase {
1485614856

1485714857
/// \brief Emit diagnostics explaining why a constraint expression was deemed
1485814858
/// unsatisfied.
14859-
void DiagnoseUnsatisfiedConstraint(
14860-
const ConceptSpecializationExpr *ConstraintExpr);
14859+
void
14860+
DiagnoseUnsatisfiedConstraint(const ConceptSpecializationExpr *ConstraintExpr,
14861+
bool First = true);
1486114862

1486214863
const NormalizedConstraint *getNormalizedAssociatedConstraints(
1486314864
ConstrainedDeclOrNestedRequirement Entity,

clang/lib/Sema/SemaConcept.cpp

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -380,11 +380,12 @@ SubstitutionInTemplateArguments(
380380
if (I < Used.size() && Used[I]) {
381381
// SubstitutedOuterMost[I].dump();
382382
// SubstArgs[MappedIndex].getArgument().dump();
383+
TemplateArgument Arg = S.Context.getCanonicalTemplateArgument(
384+
SubstArgs[MappedIndex++].getArgument());
383385
if (I < SubstitutedOuterMost.size())
384-
SubstitutedOuterMost[I] = SubstArgs[MappedIndex++].getArgument();
386+
SubstitutedOuterMost[I] = Arg;
385387
else
386-
SubstitutedOuterMost.push_back(
387-
SubstArgs[MappedIndex++].getArgument());
388+
SubstitutedOuterMost.push_back(Arg);
388389
}
389390
MLTAL.replaceOutermostTemplateArguments(
390391
const_cast<NamedDecl *>(Constraint.getConstraintDecl()),
@@ -548,10 +549,6 @@ static bool calculateConstraintSatisfaction(
548549
*SubstitutedArgs, Satisfaction, UnsignedOrNone(I));
549550
if (!Success)
550551
return false;
551-
if(!Satisfaction.IsSatisfied || Satisfaction.ContainsErrors) {
552-
if(Conjunction)
553-
return true;
554-
}
555552
if (!Conjunction && Satisfaction.IsSatisfied) {
556553
auto EffectiveDetailEnd = Satisfaction.Details.begin();
557554
std::advance(EffectiveDetailEnd, EffectiveDetailEndIndex);
@@ -1337,21 +1334,14 @@ static void diagnoseUnsatisfiedConstraintExpr(
13371334
static void DiagnoseUnsatisfiedConstraint(
13381335
Sema &S, ArrayRef<UnsatisfiedConstraintRecord> Records, SourceLocation Loc,
13391336
bool First = true, concepts::NestedRequirement *Req = nullptr) {
1340-
std::vector<bool> Prevs;
13411337
for (auto &Record : Records) {
13421338
if (Record.isNull()) {
1343-
First = Prevs.back();
1344-
Prevs.pop_back();
1339+
First = false;
13451340
continue;
13461341
}
13471342
diagnoseUnsatisfiedConstraintExpr(S, Record, Loc, First, Req);
13481343
Loc = {};
1349-
if (isa<const ConceptReference *>(Record)) {
1350-
Prevs.push_back(First);
1351-
First = true;
1352-
continue;
1353-
}
1354-
First = false;
1344+
First = isa<const ConceptReference *>(Record);
13551345
}
13561346
}
13571347

@@ -1444,7 +1434,7 @@ static void diagnoseWellFormedUnsatisfiedConstraintExpr(Sema &S,
14441434
return;
14451435
} else if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(SubstExpr)) {
14461436
// Drill down concept ids treated as atomic constraints
1447-
S.DiagnoseUnsatisfiedConstraint(CSE);
1437+
S.DiagnoseUnsatisfiedConstraint(CSE, First);
14481438
return;
14491439
} else if (auto *TTE = dyn_cast<TypeTraitExpr>(SubstExpr);
14501440
TTE && TTE->getTrait() == clang::TypeTrait::BTT_IsDeducible) {
@@ -1494,7 +1484,7 @@ void Sema::DiagnoseUnsatisfiedConstraint(
14941484
}
14951485

14961486
void Sema::DiagnoseUnsatisfiedConstraint(
1497-
const ConceptSpecializationExpr *ConstraintExpr) {
1487+
const ConceptSpecializationExpr *ConstraintExpr, bool First) {
14981488

14991489
const ASTConstraintSatisfaction &Satisfaction =
15001490
ConstraintExpr->getSatisfaction();
@@ -1503,7 +1493,7 @@ void Sema::DiagnoseUnsatisfiedConstraint(
15031493
"Attempted to diagnose a satisfied constraint");
15041494

15051495
::DiagnoseUnsatisfiedConstraint(*this, Satisfaction.records(),
1506-
ConstraintExpr->getBeginLoc());
1496+
ConstraintExpr->getBeginLoc(), First);
15071497
}
15081498

15091499
const NormalizedConstraint *Sema::getNormalizedAssociatedConstraints(
@@ -1602,11 +1592,9 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
16021592
if (S.SubstTemplateArgumentsInParameterMapping(N.getParameterMapping(), MLTAL,
16031593
SubstArgs))
16041594
return true;
1605-
16061595
TemplateArgumentLoc *TempArgs =
16071596
new (S.Context) TemplateArgumentLoc[SubstArgs.size()];
1608-
std::copy(SubstArgs.arguments().begin(), SubstArgs.arguments().end(),
1609-
TempArgs);
1597+
llvm::copy(SubstArgs.arguments(), TempArgs);
16101598
N.updateParameterMapping(
16111599
N.mappingOccurenceList(),
16121600
MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size()));

clang/test/SemaTemplate/instantiate-abbreviated-template.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify
2+
// RUN: %clang_cc1 -std=c++2c -x c++ %s -verify
3+
24

35
template<typename...>
46
concept C = false; // expected-note 9{{because}}

0 commit comments

Comments
 (0)