Author: Richard Smith Date: 2023-09-24T11:52:58-07:00 New Revision: 68765143c6765a694d40d4c3fea43893cc025433
URL: https://github.com/llvm/llvm-project/commit/68765143c6765a694d40d4c3fea43893cc025433 DIFF: https://github.com/llvm/llvm-project/commit/68765143c6765a694d40d4c3fea43893cc025433.diff LOG: Fix assertion failure mangling an unresolved template argument that corresponds to a parameter pack. Fixes #67244. Added: Modified: clang/lib/AST/ItaniumMangle.cpp clang/test/CodeGenCXX/mangle-concept.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index e7a5a6b6b8119c0..4cb1ab56a1e618a 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -5788,13 +5788,14 @@ struct CXXNameMangler::TemplateArgManglingInfo { "no parameter for argument"); Param = ResolvedTemplate->getTemplateParameters()->getParam(ParamIdx); - // If we reach an expanded parameter pack whose argument isn't in pack - // form, that means Sema couldn't figure out which arguments belonged to - // it, because it contains a pack expansion. Track the expanded pack for - // all further template arguments until we hit that pack expansion. + // If we reach a parameter pack whose argument isn't in pack form, that + // means Sema couldn't or didn't figure out which arguments belonged to + // it, because it contains a pack expansion or because Sema bailed out of + // computing parameter / argument correspondence before this point. Track + // the pack as the corresponding parameter for all further template + // arguments until we hit a pack expansion, at which point we don't know + // the correspondence between parameters and arguments at all. if (Param->isParameterPack() && Arg.getKind() != TemplateArgument::Pack) { - assert(getExpandedPackSize(Param) && - "failed to form pack argument for parameter pack"); UnresolvedExpandedPack = Param; } } diff --git a/clang/test/CodeGenCXX/mangle-concept.cpp b/clang/test/CodeGenCXX/mangle-concept.cpp index dec26aeaeca464c..391cf09ede8555d 100644 --- a/clang/test/CodeGenCXX/mangle-concept.cpp +++ b/clang/test/CodeGenCXX/mangle-concept.cpp @@ -220,3 +220,11 @@ namespace test7 { } template void f<int>(); } + +namespace gh67244 { + template<typename T, typename ...Ts> constexpr bool B = true; + template<typename T, typename ...Ts> concept C = B<T, Ts...>; + template<C<int, float> T> void f(T) {} + // CHECK: define {{.*}} @_ZN7gh672441fITkNS_1CIifEEiEEvT_( + template void f(int); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits