diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-04-10 00:49:24 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-04-10 00:49:24 +0000 |
commit | 64e40c56fb5dd12930f287272a8bcc87c7880f53 (patch) | |
tree | d23daef46d99f224f61e82b9cf4e0002c2953e5b /clang/lib | |
parent | 4469138e982b90bf369f831e41588c7326c55ed1 (diff) | |
download | bcm5719-llvm-64e40c56fb5dd12930f287272a8bcc87c7880f53.tar.gz bcm5719-llvm-64e40c56fb5dd12930f287272a8bcc87c7880f53.zip |
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
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
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 + // <class-enum-type> ::= <name> # non-dependent or dependent type name or + // # dependent elaborated type specifier using + // # ‘typename' + // ::= Ts <name> # dependent elaborated type specifier using + // # ‘struct’ or ‘class' + // ::= Tu <name> # dependent elaborated type specifier using + // # ‘union' + // ::= Te <name> # 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'; } |