From 048f90cc04a4914d6427cde22b3d185f344e8ca5 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 9 Dec 2013 04:28:34 +0000 Subject: [-cxx-abi microsoft] Properly mangle enums While testing our ability to mangle large constants (PR18175), I incidentally discovered that we did not properly mangle enums correctly. Previously, we would append the width of the enum in bytes after the type-tag differentiator. This would mean "enum : short" would be mangled as 'W2' while "enum : char" would be mangled as 'W1'. Upon testing this with several versions of MSVC, I found that this did not match their behavior: they always use 'W4'. N.B. Quick testing uncovered that undname allows different numbers to follow the 'W' in the following way: 'W0' -> "enum char" 'W1' -> "enum unsigned char" 'W2' -> "enum short" 'W3' -> "enum unsigned short" 'W4' -> "enum" 'W5' -> "enum unsigned int" 'W6' -> "enum long" 'W7' -> "enum unsigned long" However this scheme appears abandoned, I cannot get MSVC to trigger it. Furthermore, it's incomplete: it doesn't handle "bool" or "long long". llvm-svn: 196752 --- clang/lib/AST/MicrosoftMangle.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'clang/lib/AST/MicrosoftMangle.cpp') diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index ae4fbf7f048..0599d8af813 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1472,7 +1472,7 @@ void MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T, // ::= T // ::= U // ::= V -// ::= W +// ::= W4 void MicrosoftCXXNameMangler::mangleType(const EnumType *T, SourceRange) { mangleType(cast(T)->getDecl()); } @@ -1492,9 +1492,7 @@ void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) { Out << 'V'; break; case TTK_Enum: - Out << 'W'; - Out << getASTContext().getTypeSizeInChars( - cast(TD)->getIntegerType()).getQuantity(); + Out << "W4"; break; } mangleName(TD); -- cgit v1.2.3