diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index f03f029198de..629b46bf9449 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -456,7 +456,7 @@ void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { void CXXNameMangler::mangleNestedName(const NamedDecl *ND) { // ::= N [] E // ::= N [] E - // FIXME: no class template support + Out << 'N'; if (const CXXMethodDecl *Method = dyn_cast(ND)) mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers())); @@ -1077,6 +1077,11 @@ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { } bool CXXNameMangler::mangleSubstitution(QualType T) { + if (!T.getCVRQualifiers()) { + if (const RecordType *RT = T->getAs()) + return mangleSubstitution(RT->getDecl()); + } + uintptr_t TypePtr = reinterpret_cast(T.getAsOpaquePtr()); return mangleSubstitution(TypePtr); @@ -1117,6 +1122,13 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { } void CXXNameMangler::addSubstitution(QualType T) { + if (!T.getCVRQualifiers()) { + if (const RecordType *RT = T->getAs()) { + addSubstitution(RT->getDecl()); + return; + } + } + uintptr_t TypePtr = reinterpret_cast(T.getAsOpaquePtr()); addSubstitution(TypePtr); } @@ -1144,6 +1156,10 @@ namespace clang { assert(!isa(D) && "Use mangleCXXDtor for destructor decls!"); + PrettyStackTraceDecl CrashInfo(const_cast(D), SourceLocation(), + Context.getSourceManager(), + "Mangling declaration"); + CXXNameMangler Mangler(Context, os); if (!Mangler.mangle(D)) return false; diff --git a/clang/test/CodeGenCXX/PR5050-constructor-conversion.cpp b/clang/test/CodeGenCXX/PR5050-constructor-conversion.cpp index 7c7068742d5c..e5f722c513de 100644 --- a/clang/test/CodeGenCXX/PR5050-constructor-conversion.cpp +++ b/clang/test/CodeGenCXX/PR5050-constructor-conversion.cpp @@ -12,8 +12,8 @@ A f(const B &b) { return b; } -// CHECK-LP64: call __ZN1AC1ERK1Ai +// CHECK-LP64: call __ZN1AC1ERKS_i -// CHECK-LP32: call L__ZN1AC1ERK1Ai +// CHECK-LP32: call L__ZN1AC1ERKS_i diff --git a/clang/test/CodeGenCXX/constructor-default-arg.cpp b/clang/test/CodeGenCXX/constructor-default-arg.cpp index 6691912b6f7b..7e6a7cd8f71a 100644 --- a/clang/test/CodeGenCXX/constructor-default-arg.cpp +++ b/clang/test/CodeGenCXX/constructor-default-arg.cpp @@ -31,10 +31,10 @@ int main() { X d(a, 5, 6); } -// CHECK-LP64: call __ZN1XC1ERK1Xiii -// CHECK-LP64: call __ZN1XC1ERK1Xiii -// CHECK-LP64: call __ZN1XC1ERK1Xiii +// CHECK-LP64: call __ZN1XC1ERKS_iii +// CHECK-LP64: call __ZN1XC1ERKS_iii +// CHECK-LP64: call __ZN1XC1ERKS_iii -// CHECK-LP32: call L__ZN1XC1ERK1Xiii -// CHECK-LP32: call L__ZN1XC1ERK1Xiii -// CHECK-LP32: call L__ZN1XC1ERK1Xiii +// CHECK-LP32: call L__ZN1XC1ERKS_iii +// CHECK-LP32: call L__ZN1XC1ERKS_iii +// CHECK-LP32: call L__ZN1XC1ERKS_iii diff --git a/clang/test/CodeGenCXX/copy-assign-synthesis-1.cpp b/clang/test/CodeGenCXX/copy-assign-synthesis-1.cpp index 3c24b1275282..d4a93afefbfa 100644 --- a/clang/test/CodeGenCXX/copy-assign-synthesis-1.cpp +++ b/clang/test/CodeGenCXX/copy-assign-synthesis-1.cpp @@ -93,17 +93,17 @@ int main() { dstY.pr(); } -// CHECK-LP64: .globl __ZN1XaSERK1X -// CHECK-LP64: .weak_definition __ZN1XaSERK1X -// CHECK-LP64: __ZN1XaSERK1X: -// CHECK-LP64: .globl __ZN1QaSERK1Q -// CHECK-LP64: .weak_definition __ZN1QaSERK1Q -// CHECK-LP64: __ZN1QaSERK1Q: +// CHECK-LP64: .globl __ZN1XaSERKS_ +// CHECK-LP64: .weak_definition __ZN1XaSERKS_ +// CHECK-LP64: __ZN1XaSERKS_: +// CHECK-LP64: .globl __ZN1QaSERKS_ +// CHECK-LP64: .weak_definition __ZN1QaSERKS_ +// CHECK-LP64: __ZN1QaSERKS_: -// CHECK-LP32: .globl __ZN1XaSERK1X -// CHECK-LP32: .weak_definition __ZN1XaSERK1X -// CHECK-LP32: __ZN1XaSERK1X: -// CHECK-LP32: .globl __ZN1QaSERK1Q -// CHECK-LP32: .weak_definition __ZN1QaSERK1Q -// CHECK-LP32: __ZN1QaSERK1Q: +// CHECK-LP32: .globl __ZN1XaSERKS_ +// CHECK-LP32: .weak_definition __ZN1XaSERKS_ +// CHECK-LP32: __ZN1XaSERKS_: +// CHECK-LP32: .globl __ZN1QaSERKS_ +// CHECK-LP32: .weak_definition __ZN1QaSERKS_ +// CHECK-LP32: __ZN1QaSERKS_: diff --git a/clang/test/CodeGenCXX/copy-constructor-synthesis.cpp b/clang/test/CodeGenCXX/copy-constructor-synthesis.cpp index 37550c42193c..47971afe61d4 100644 --- a/clang/test/CodeGenCXX/copy-constructor-synthesis.cpp +++ b/clang/test/CodeGenCXX/copy-constructor-synthesis.cpp @@ -101,10 +101,10 @@ int main() { m1.pr(); } -// CHECK-LP64: .globl __ZN1XC1ERK1X -// CHECK-LP64: .weak_definition __ZN1XC1ERK1X -// CHECK-LP64: __ZN1XC1ERK1X: +// CHECK-LP64: .globl __ZN1XC1ERKS_ +// CHECK-LP64: .weak_definition __ZN1XC1ERKS_ +// CHECK-LP64: __ZN1XC1ERKS_: -// CHECK-LP32: .globl __ZN1XC1ERK1X -// CHECK-LP32: .weak_definition __ZN1XC1ERK1X -// CHECK-LP32: __ZN1XC1ERK1X: +// CHECK-LP32: .globl __ZN1XC1ERKS_ +// CHECK-LP32: .weak_definition __ZN1XC1ERKS_ +// CHECK-LP32: __ZN1XC1ERKS_: diff --git a/clang/test/CodeGenCXX/mangle-subst.cpp b/clang/test/CodeGenCXX/mangle-subst.cpp index fb0e99090250..2ff375e711c6 100644 --- a/clang/test/CodeGenCXX/mangle-subst.cpp +++ b/clang/test/CodeGenCXX/mangle-subst.cpp @@ -24,3 +24,10 @@ namespace A { // CHECK: define void @_Z1fN1A1AENS_1BE( void f(A::A a, A::B b) { } + +struct C { + struct D { }; +}; + +// CHECK: define void @_Z1fN1C1DERS_PS_S1_( +void f(C::D, C&, C*, C&) { } diff --git a/clang/test/CodeGenCXX/member-functions.cpp b/clang/test/CodeGenCXX/member-functions.cpp index 8ada907117be..29629d5bf824 100644 --- a/clang/test/CodeGenCXX/member-functions.cpp +++ b/clang/test/CodeGenCXX/member-functions.cpp @@ -58,6 +58,6 @@ struct T { void test3() { T t1, t2; - // RUN: grep "call void @_ZN1TpsERK1T" %t + // RUN: grep "call void @_ZN1TpsERKS_" %t T result = t1 + t2; }