From 6f9f25dfc7bf9cc1ab1282d6d7e9cf7916d8a09c Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Fri, 11 Dec 2009 20:21:38 +0000 Subject: [PATCH] Make sure mangling doesn't crash in another case. Add some more tests. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91149 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/Mangle.cpp | 2 +- test/CodeGenCXX/mangle-unnamed.cpp | 39 ++++++++++++++++++++++++++++++ test/CodeGenCXX/mangle.cpp | 8 ------ 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 test/CodeGenCXX/mangle-unnamed.cpp diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 57f125e336..afc70fa479 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -548,7 +548,7 @@ void CXXNameMangler::mangleLocalName(const NamedDecl *ND) { mangleFunctionEncoding(cast(ND->getDeclContext())); Out << 'E'; - mangleSourceName(ND->getIdentifier()); + mangleUnqualifiedName(ND); } void CXXNameMangler::manglePrefix(const DeclContext *DC) { diff --git a/test/CodeGenCXX/mangle-unnamed.cpp b/test/CodeGenCXX/mangle-unnamed.cpp new file mode 100644 index 0000000000..66c81e5932 --- /dev/null +++ b/test/CodeGenCXX/mangle-unnamed.cpp @@ -0,0 +1,39 @@ +// RUN: clang-cc -emit-llvm-only -verify %s + +struct S { + virtual ~S() { } +}; + +// PR5706 +// Make sure this doesn't crash; the mangling doesn't matter because the name +// doesn't have linkage. +static struct : S { } obj8; + +void f() { + // Make sure this doesn't crash; the mangling doesn't matter because the + // generated vtable/etc. aren't modifiable (although it would be nice for + // codesize to make it consistent inside inline functions). + static struct : S { } obj8; +} + +inline int f2() { + // FIXME: We don't mangle the names of a or x correctly! + static struct { int a() { static int x; return ++x; } } obj; + return obj.a(); +} + +int f3() { return f2(); } + +struct A { + typedef struct { int x; } *ptr; + ptr m; + int a() { + static struct x { + // FIXME: We don't mangle the names of a or x correctly! + int a(ptr A::*memp) { static int x; return ++x; } + } a; + return a.a(&A::m); + } +}; + +int f4() { return A().a(); } diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index a2e92e9738..38f3c8bd3f 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -228,11 +228,3 @@ template typename __enable_if<(__is_scalar::__value), void>::__ty template void ft8(); // CHECK: @_Z3ft8IPvEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv template void ft8(); - -// PR5706 -// This example was crashing in the mangler code -struct S8 { - virtual ~S8() { } -}; - -static struct : S8 { } obj8;