Skip to content

Commit 124ccbc

Browse files
mizvekovYilin Li
authored and
Yilin Li
committed
[clang] fix unresolved dependent template specialization mangling (llvm#135111)
This fixes a regression introduced in llvm#133610 which was reported here llvm#133610 (comment) When mangling a dependent template specialization appearing within an unresolved prefix, translate the dtst back to a dependent template name including the prefix, and mangle following the nested unresolved-type production. There are no release notes, since this regression was never released.
1 parent 6257d7f commit 124ccbc

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

clang/lib/AST/ItaniumMangle.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -1404,9 +1404,19 @@ void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,
14041404
// - a template type parameter
14051405
// - a template template parameter with arguments
14061406
// In all of these cases, we should have no prefix.
1407-
if (qualifier->getPrefix()) {
1408-
mangleUnresolvedPrefix(qualifier->getPrefix(),
1409-
/*recursive*/ true);
1407+
if (NestedNameSpecifier *Prefix = qualifier->getPrefix()) {
1408+
if (const auto *DTST =
1409+
dyn_cast<DependentTemplateSpecializationType>(type)) {
1410+
Out << "srN";
1411+
TemplateName Template = getASTContext().getDependentTemplateName(
1412+
{Prefix, DTST->getDependentTemplateName().getName(),
1413+
/*HasTemplateKeyword=*/true});
1414+
mangleTemplatePrefix(Template);
1415+
mangleTemplateArgs(Template, DTST->template_arguments());
1416+
break;
1417+
}
1418+
mangleUnresolvedPrefix(Prefix,
1419+
/*recursive=*/true);
14101420
} else {
14111421
// Otherwise, all the cases want this.
14121422
Out << "sr";

clang/test/CodeGenCXX/mangle-template.cpp

+19-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ namespace test7 {
7070
static const unsigned value = sizeof(T);
7171
};
7272

73-
template<unsigned> struct int_c {
73+
template<unsigned> struct int_c {
7474
typedef float type;
7575
};
7676

@@ -92,7 +92,7 @@ namespace test8 {
9292
};
9393
};
9494

95-
template<unsigned> struct int_c {
95+
template<unsigned> struct int_c {
9696
typedef float type;
9797
};
9898

@@ -399,3 +399,20 @@ namespace type_qualifier {
399399
// CHECK: @_ZN14type_qualifier1gIPiEEvDTcmcvv_ELi1EE
400400
template void g<int*>(int);
401401
}
402+
403+
namespace unresolved_template_specialization_type {
404+
template <int> struct enable_if {};
405+
struct Foo {
406+
static const int value = true;
407+
};
408+
struct HashStateBase {
409+
template <typename> using is_hashable = Foo;
410+
};
411+
template <class> struct raw_hash_set {
412+
template <typename H>
413+
static enable_if<H::template is_hashable<int>::value>
414+
AbslHashValue() {}
415+
};
416+
template enable_if<true> raw_hash_set<int>::AbslHashValue<HashStateBase>();
417+
// CHECH: @_ZN39unresolved_template_specialization_type12raw_hash_setIiE13AbslHashValueINS_13HashStateBaseEEENS_9enable_ifIXsrNT_11is_hashableIiEE5valueEEEv
418+
} // namespace unresolved_template_specialization_type

0 commit comments

Comments
 (0)