https://github.com/zyn0217 updated https://github.com/llvm/llvm-project/pull/102131
>From aa99ac433c9d383bfca732c19e5082a555f64c2d Mon Sep 17 00:00:00 2001 From: Younan Zhang <zyn7...@gmail.com> Date: Tue, 6 Aug 2024 20:08:43 +0800 Subject: [PATCH] [Clang][Concepts] Fix the constraint equivalence checking for TemplateTypeParmTypes --- clang/lib/Sema/SemaConcept.cpp | 11 +++++++-- .../SemaTemplate/concepts-out-of-line-def.cpp | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index d4c9d044985e34..14a67f35a8f9f8 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -972,8 +972,15 @@ static const Expr *SubstituteConstraintExpressionWithoutSatisfaction( // equivalence. LocalInstantiationScope ScopeForParameters(S); if (auto *FD = DeclInfo.getDecl()->getAsFunction()) - for (auto *PVD : FD->parameters()) - ScopeForParameters.InstantiatedLocal(PVD, PVD); + for (auto *PVD : FD->parameters()) { + if (!PVD->isParameterPack()) { + ScopeForParameters.InstantiatedLocal(PVD, PVD); + continue; + } + // Parameter packs should expand to a size-of-1 argument. + ScopeForParameters.MakeInstantiatedLocalArgPack(PVD); + ScopeForParameters.InstantiatedLocalPackArg(PVD, PVD); + } std::optional<Sema::CXXThisScopeRAII> ThisScope; diff --git a/clang/test/SemaTemplate/concepts-out-of-line-def.cpp b/clang/test/SemaTemplate/concepts-out-of-line-def.cpp index 0142efcdc3ee86..333187b0d74ad6 100644 --- a/clang/test/SemaTemplate/concepts-out-of-line-def.cpp +++ b/clang/test/SemaTemplate/concepts-out-of-line-def.cpp @@ -599,3 +599,26 @@ template <class DerT> unsigned long DerivedCollection<DerTs...>::index() {} } // namespace GH72557 + +namespace GH101735 { + +template <class, class> +concept True = true; + +template <typename T> +class A { + template <typename... Ts> + void method(Ts&... ts) + requires requires (T t) { + { t.method(static_cast<Ts &&>(ts)...) } -> True<void>; + }; +}; + +template <typename T> +template <typename... Ts> +void A<T>::method(Ts&... ts) + requires requires (T t) { + { t.method(static_cast<Ts &&>(ts)...) } -> True<void>; + } {} + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits