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@-1 {{no matching function}} + // expected-note@#GH218548_f {{constraints not satisfied}} + // expected-note@#GH218548_f {{invalid index}} +} + +} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
