]> granicus.if.org Git - clang/commitdiff
PR6400: Handle an extreme edge case in mangling correctly.
authorEli Friedman <eli.friedman@gmail.com>
Tue, 23 Feb 2010 18:20:18 +0000 (18:20 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 23 Feb 2010 18:20:18 +0000 (18:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96961 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Mangle.cpp
test/CodeGenCXX/mangle-subst-std.cpp

index a302225c7f772a696ce13603b4904baade55ddb8..123ce6133878504088bfc74587a8c61978209f53 100644 (file)
@@ -1652,6 +1652,9 @@ bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) {
     //                            ::std::char_traits<char>,
     //                            ::std::allocator<char> >
     if (SD->getIdentifier()->isStr("basic_string")) {
+      if (!isStdNamespace(SD->getDeclContext()))
+        return false;
+
       const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs();
 
       if (TemplateArgs.size() != 3)
index 913c8f101b54d13dd922596e41393f1ead587d26..062610bd74a640936bcf4ea92cb14b3f77658245 100644 (file)
@@ -55,3 +55,9 @@ namespace std
   terminate_handler set_terminate(terminate_handler) { return 0; }
 }
 }
+
+// Make sure we don't treat the following like std::string
+// CHECK: define void @_Z1f12basic_stringIcSt11char_traitsIcESaIcEE
+template<typename, typename, typename> struct basic_string { };
+typedef basic_string<char, std::char_traits<char>, std::allocator<char> > not_string;
+void f(not_string) { }