Author: Younan Zhang Date: 2025-05-27T15:10:24+08:00 New Revision: f8d63168b6b9928ffed6b068fb35fa26a70f996d
URL: https://github.com/llvm/llvm-project/commit/f8d63168b6b9928ffed6b068fb35fa26a70f996d DIFF: https://github.com/llvm/llvm-project/commit/f8d63168b6b9928ffed6b068fb35fa26a70f996d.diff LOG: [Clang] Fix a pack expansion bug in template argument deduction (#141547) I think the intent of df18ee96206 was to substitute only those non-packs into a pack expansion type (e.g. `T` in `T::pack...`), so let's hold off pack expansions explicitly, in case there are calls coming from a substitution of pack expansion. Fixes https://github.com/llvm/llvm-project/issues/53609 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaTemplateDeduction.cpp clang/test/CXX/temp/temp.fct.spec/temp.deduct/p7.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 780716b089e41..35ab1461e7b89 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -798,6 +798,7 @@ Bug Fixes to C++ Support - Fix instantiation of default-initialized variable template specialization. (#GH140632) (#GH140622) - Clang modules now allow a module and its user to diff er on TrivialAutoVarInit* - Fixed an access checking bug when initializing non-aggregates in default arguments (#GH62444), (#GH83608) +- Fixed a pack substitution bug in deducing class template partial specializations. (#GH53609) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 217d57d67f067..75ae04b27d06a 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -2946,6 +2946,7 @@ ConvertDeducedTemplateArgument(Sema &S, NamedDecl *Param, LocalInstantiationScope Scope(S); MultiLevelTemplateArgumentList Args(Template, CTAI.SugaredConverted, /*Final=*/true); + Sema::ArgPackSubstIndexRAII OnlySubstNonPackExpansion(S, std::nullopt); if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) { Sema::InstantiatingTemplate Inst(S, Template->getLocation(), Template, diff --git a/clang/test/CXX/temp/temp.fct.spec/temp.deduct/p7.cpp b/clang/test/CXX/temp/temp.fct.spec/temp.deduct/p7.cpp index f0ab7b8ea7612..de6fa0c837e2a 100644 --- a/clang/test/CXX/temp/temp.fct.spec/temp.deduct/p7.cpp +++ b/clang/test/CXX/temp/temp.fct.spec/temp.deduct/p7.cpp @@ -54,3 +54,20 @@ namespace reversed_operator_substitution_order { float &s = no_adl::f<int>(true); } #endif + +namespace GH53609 { + +template <class, int> +struct a; + +template <class, class...> +struct b; + +template <class x, class... y, y... z> +struct b<x, a<y, z>...> {}; + +template <class... x> struct c: b<x>... {}; + +c<int> d; + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits