From 3dc7e7b9c59b9a2ed4f530b32e710a3738611df7 Mon Sep 17 00:00:00 2001 From: John McCall Date: Sat, 24 Jul 2010 01:17:35 +0000 Subject: [PATCH] Mangle enum constant expressions. Fixes rdar://problem/8204122 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109315 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/Mangle.cpp | 6 ++++++ test/CodeGenCXX/mangle.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index f408849e95..b5f629aeb5 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -1873,6 +1873,12 @@ void CXXNameMangler::mangleExpression(const Expr *E) { Out << 'E'; break; + case Decl::EnumConstant: { + const EnumConstantDecl *ED = cast(D); + mangleIntegerLiteral(ED->getType(), ED->getInitVal()); + break; + } + case Decl::NonTypeTemplateParm: { const NonTypeTemplateParmDecl *PD = cast(D); mangleTemplateParameter(PD->getIndex()); diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index 37af79b0f9..3a2e112f16 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -518,3 +518,14 @@ namespace test14 { int S::a() { return S::x; } } } + +// rdar://problem/8204122 +namespace test15 { + enum E { e = 3 }; + template struct S {}; + + template void f(S) {} + + // CHECK: define weak_odr void @_ZN6test151fILi7EEEvNS_1SIXplT_LNS_1EE3EEEE( + template void f<7>(S<7 + e>); +} -- 2.40.0