[llvm-branch-commits] [clang] 91d740b - release/23.x: Backport '[Clang] Fix C++26 fold expression normalization of PackIndexingExpr'
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 2 02:13:41 PDT 2026
Author: Younan Zhang
Date: 2026-09-02T11:13:29+02:00
New Revision: 91d740bac95375dc51fd4042ff328670803ff451
URL: https://github.com/llvm/llvm-project/commit/91d740bac95375dc51fd4042ff328670803ff451
DIFF: https://github.com/llvm/llvm-project/commit/91d740bac95375dc51fd4042ff328670803ff451.diff
LOG: release/23.x: Backport '[Clang] Fix C++26 fold expression normalization of PackIndexingExpr'
It turns out that PackIndexingExpr doesn't create any PackExpansionTypes
for unexpanded packs and thus we don't have to remove the packs during the normalization.
Added:
Modified:
clang/lib/Sema/SemaConcept.cpp
clang/test/SemaCXX/cxx2c-fold-exprs.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index 476910a9db528..da0b9700504b9 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -267,6 +267,12 @@ class AdjustConstraints : public TreeTransform<AdjustConstraints> {
return Result;
}
+ QualType TransformPackIndexingType(TypeLocBuilder &TLB,
+ PackIndexingTypeLoc TL) {
+ llvm::SaveAndRestore _1(RemoveNonPackExpansionPacks, false);
+ return inherited::TransformPackIndexingType(TLB, TL);
+ }
+
bool AlreadyTransformed(QualType T) {
if (T.isNull())
return true;
diff --git a/clang/test/SemaCXX/cxx2c-fold-exprs.cpp b/clang/test/SemaCXX/cxx2c-fold-exprs.cpp
index 0312022912dca..87a3b311857f4 100644
--- a/clang/test/SemaCXX/cxx2c-fold-exprs.cpp
+++ b/clang/test/SemaCXX/cxx2c-fold-exprs.cpp
@@ -598,3 +598,33 @@ static_assert(MutabilityAlias<Constant::alias>);
static_assert(MutabilityAlias<Mutable::alias>);
}
+
+namespace GH218035 {
+
+template <class T, class UnusedParam>
+concept same_as_impl = sizeof(T) == 8;
+template <typename... P>
+void f()
+ requires(same_as_impl<P...[0], P> && ...)
+{}
+void g() { f<long long, float>(); }
+
+}
+
+namespace GH218548 {
+
+template <class T>
+concept same_as_impl = sizeof(T) == 2;
+template <typename... P>
+void f() requires(same_as_impl<P...[sizeof(P)]> && ...) // #GH218548_f
+{}
+void g() {
+ f<char, short, short>();
+
+ f<char, int, short>();
+ // expected-error at -1 {{no matching function}}
+ // expected-note@#GH218548_f {{constraints not satisfied}}
+ // expected-note@#GH218548_f {{invalid index}}
+}
+
+}
More information about the llvm-branch-commits
mailing list