diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 639d719b79fb..ff2388e79830 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -1149,6 +1149,12 @@ bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) { Out << "Sa"; return true; } + + // < ::= Sb # ::std::basic_string + if (TD->getIdentifier()->isStr("basic_string")) { + Out << "Sb"; + return true; + } } return false; diff --git a/clang/test/CodeGenCXX/mangle-subst-std.cpp b/clang/test/CodeGenCXX/mangle-subst-std.cpp index 0fd5eb1c9b90..c35804e2d35f 100644 --- a/clang/test/CodeGenCXX/mangle-subst-std.cpp +++ b/clang/test/CodeGenCXX/mangle-subst-std.cpp @@ -9,10 +9,19 @@ namespace std { }; namespace std { - template struct allocator { allocator(); }; + template struct allocator { }; } // FIXME: typename is really not allowed here, but it's kept // as a workaround for PR5061. // CHECK: define void @_Z1fSaIcESaIiE void f(typename std::allocator, typename std::allocator) { } + +namespace std { + template struct basic_string { }; +} + +// FIXME: typename is really not allowed here, but it's kept +// as a workaround for PR5061. +// CHECK: define void @_Z1fSbIcESbIiE +void f(typename std::basic_string, typename std::basic_string) { }