Skip to content

Commit 99a1db5

Browse files
committed
Fold expression fixes
1 parent b9ce9a4 commit 99a1db5

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

clang/lib/Sema/SemaConcept.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -533,15 +533,26 @@ static bool calculateConstraintSatisfaction(
533533
if (!NumExpansions)
534534
return false;
535535

536+
if(*NumExpansions == 0) {
537+
Satisfaction.IsSatisfied = Conjunction;
538+
return true;
539+
}
540+
541+
//bool HasAnyFailed = false;
536542
for (unsigned I = 0; I < *NumExpansions; I++) {
537543
Sema::ArgPackSubstIndexRAII SubstIndex(S, I);
544+
Satisfaction.IsSatisfied = false;
545+
Satisfaction.ContainsErrors = false;
538546
bool Success = calculateConstraintSatisfaction(
539547
S, FE.getNormalizedPattern(), Template, TemplateNameLoc,
540548
*SubstitutedArgs, Satisfaction, UnsignedOrNone(I));
541549
if (!Success)
542550
return false;
543-
bool IsRHSSatisfied = Satisfaction.IsSatisfied;
544-
if (!Conjunction && IsRHSSatisfied) {
551+
if(!Satisfaction.IsSatisfied || Satisfaction.ContainsErrors) {
552+
if(Conjunction)
553+
return true;
554+
}
555+
if (!Conjunction && Satisfaction.IsSatisfied) {
545556
auto EffectiveDetailEnd = Satisfaction.Details.begin();
546557
std::advance(EffectiveDetailEnd, EffectiveDetailEndIndex);
547558
Satisfaction.Details.erase(EffectiveDetailEnd,

clang/test/SemaCXX/cxx2c-fold-exprs.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %clang_cc1 -std=c++2c -verify %s
22

3-
template <class T> concept A = true;
3+
template <class T> concept A = (T(), true);
44
template <class T> concept C = A<T> && true;
55
template <class T> concept D = A<T> && __is_same(T, int);
66

0 commit comments

Comments
 (0)