From 64e40c56fb5dd12930f287272a8bcc87c7880f53 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 10 Apr 2014 00:49:24 +0000 Subject: AST: Implement proposal for dependent elaborated type specifiers cxx-abi-dev came up with a way to disambiguate between different keywords used in elaborated type specifiers. This resolves certain collisions during mangling. llvm-svn: 205943 --- clang/lib/AST/ItaniumMangle.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'clang/lib') diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 27ba2bef674..21548a0b161 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -2361,8 +2361,35 @@ void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { void CXXNameMangler::mangleType(const DependentNameType *T) { // Typename types are always nested Out << 'N'; + // Proposal by cxx-abi-dev, 2014-03-26 + // ::= # non-dependent or dependent type name or + // # dependent elaborated type specifier using + // # ‘typename' + // ::= Ts # dependent elaborated type specifier using + // # ‘struct’ or ‘class' + // ::= Tu # dependent elaborated type specifier using + // # ‘union' + // ::= Te # dependent elaborated type specifier using + // # ‘enum’ + switch (T->getKeyword()) { + case ETK_Typename: + break; + case ETK_Struct: + case ETK_Class: + case ETK_Interface: + Out << "Ts"; + break; + case ETK_Union: + Out << "Tu"; + break; + case ETK_Enum: + Out << "Te"; + break; + default: + llvm_unreachable("unexpected keyword for dependent type name"); + } manglePrefix(T->getQualifier()); - mangleSourceName(T->getIdentifier()); + mangleSourceName(T->getIdentifier()); Out << 'E'; } -- cgit v1.2.3