]> granicus.if.org Git - clang/commitdiff
AST: Elaborated type specifier mangling occurs before nested-name
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 15 Apr 2014 05:51:25 +0000 (05:51 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 15 Apr 2014 05:51:25 +0000 (05:51 +0000)
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

lib/AST/ItaniumMangle.cpp
test/CodeGenCXX/mangle.cpp

index 24e643e1f2c4b231e0fd9fb62ca2188bb8495d5c..bb7de2f0809b1a17ae3c67b5c5e3c011dc494253 100644 (file)
@@ -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';
index 24207dbce64720b2d9862bd22c02aa84174905d5..c55e3e0f8a5ae7ee79f8738ee23b5d71a104f60e 100644 (file)
@@ -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"*)
 }