From: David Majnemer Date: Tue, 15 Apr 2014 05:51:25 +0000 (+0000) Subject: AST: Elaborated type specifier mangling occurs before nested-name X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=52b4da7388815cac3a9d53c136121bcd22da23aa;p=clang AST: Elaborated type specifier mangling occurs before nested-name The Ts/Tu/Te manglings should occur before the nested-name's N. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206247 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 24e643e1f2..bb7de2f080 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 // ::= # 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 24207dbce6..c55e3e0f8a 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -959,7 +959,7 @@ namespace test45 { template void f(enum T::e *) {} template void f(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 void f(struct T::s *) {} template void f(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 void f(class T::c *) {} template void f(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 void f(union T::u *) {} template void f(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"*) }