diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 24e643e1f2c4b231e0fd9fb62ca2188bb8495d5c..bb7de2f0809b1a17ae3c67b5c5e3c011dc494253 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -2359,8 +2359,6 @@ void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { } void CXXNameMangler::mangleType(const DependentNameType *T) { - // Typename types are always nested - Out << 'N'; // Proposal by cxx-abi-dev, 2014-03-26 // <class-enum-type> ::= <name> # non-dependent or dependent type name or // # dependent elaborated type specifier using @@ -2388,6 +2386,8 @@ void CXXNameMangler::mangleType(const DependentNameType *T) { default: llvm_unreachable("unexpected keyword for dependent type name"); } + // Typename types are always nested + Out << 'N'; manglePrefix(T->getQualifier()); mangleSourceName(T->getIdentifier()); Out << 'E'; diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index 24207dbce64720b2d9862bd22c02aa84174905d5..c55e3e0f8a5ae7ee79f8738ee23b5d71a104f60e 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -959,7 +959,7 @@ namespace test45 { template <typename T> void f(enum T::e *) {} template void f<S>(S::e *); - // CHECK-LABEL: define weak_odr void @_ZN6test451fINS_1SEEEvPNTeT_1eE(i32*) + // CHECK-LABEL: define weak_odr void @_ZN6test451fINS_1SEEEvPTeNT_1eE(i32*) } namespace test46 { @@ -969,7 +969,7 @@ namespace test46 { template <typename T> void f(struct T::s *) {} template void f<S>(S::s *); - // CHECK-LABEL: define weak_odr void @_ZN6test461fINS_1SEEEvPNTsT_1sE(%"struct.test46::S::s"*) + // CHECK-LABEL: define weak_odr void @_ZN6test461fINS_1SEEEvPTsNT_1sE(%"struct.test46::S::s"*) } namespace test47 { @@ -979,7 +979,7 @@ namespace test47 { template <typename T> void f(class T::c *) {} template void f<S>(S::c *); - // CHECK-LABEL: define weak_odr void @_ZN6test471fINS_1SEEEvPNTsT_1cE(%"class.test47::S::c"*) + // CHECK-LABEL: define weak_odr void @_ZN6test471fINS_1SEEEvPTsNT_1cE(%"class.test47::S::c"*) } namespace test48 { @@ -989,5 +989,5 @@ namespace test48 { template <typename T> void f(union T::u *) {} template void f<S>(S::u *); - // CHECK-LABEL: define weak_odr void @_ZN6test481fINS_1SEEEvPNTuT_1uE(%"union.test48::S::u"*) + // CHECK-LABEL: define weak_odr void @_ZN6test481fINS_1SEEEvPTuNT_1uE(%"union.test48::S::u"*) }