From: John McCall Date: Sat, 24 Jul 2010 01:17:35 +0000 (+0000) Subject: Mangle enum constant expressions. Fixes rdar://problem/8204122 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3dc7e7b9c59b9a2ed4f530b32e710a3738611df7;p=clang 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 --- 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>); +}