diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-26 17:36:28 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-26 17:36:28 +0000 |
commit | f3ea1ed1ad2d72f472ed672dd0118ad1a7cf39f4 (patch) | |
tree | a136850b482170cdb371c4a6ec30e5bd7e0a6db2 /clang/lib/AST/ItaniumMangle.cpp | |
parent | 54e462ac6ec9140c75d670cfa640ffb0aded114c (diff) | |
download | bcm5719-llvm-f3ea1ed1ad2d72f472ed672dd0118ad1a7cf39f4.tar.gz bcm5719-llvm-f3ea1ed1ad2d72f472ed672dd0118ad1a7cf39f4.zip |
Rvalue references for *this: add name mangling for ref-qualifiers,
using rules that I just made up this morning. This encoding has now
been proposed to the Itanium C++ ABI group for inclusion, but of
course it's still possible that the mangling will change.
llvm-svn: 124296
Diffstat (limited to 'clang/lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index af9e35bbfcd..3c7191a8e12 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -228,6 +228,7 @@ private: void mangleTemplatePrefix(TemplateName Template); void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity); void mangleQualifiers(Qualifiers Quals); + void mangleRefQualifier(RefQualifierKind RefQualifier); void mangleObjCMethodName(const ObjCMethodDecl *MD); @@ -817,13 +818,17 @@ void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { void CXXNameMangler::mangleNestedName(const NamedDecl *ND, const DeclContext *DC, bool NoFunction) { - // <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E - // ::= N [<CV-qualifiers>] <template-prefix> <template-args> E + // <nested-name> + // ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E + // ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> + // <template-args> E Out << 'N'; - if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND)) + if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND)) { mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers())); - + mangleRefQualifier(Method->getRefQualifier()); + } + // Check if we have a template. const TemplateArgumentList *TemplateArgs = 0; if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { @@ -1162,6 +1167,24 @@ void CXXNameMangler::mangleQualifiers(Qualifiers Quals) { // FIXME: For now, just drop all extension qualifiers on the floor. } +void CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { + // <ref-qualifier> ::= R # lvalue reference + // ::= O # rvalue-reference + // Proposal to Itanium C++ ABI list on 1/26/11 + switch (RefQualifier) { + case RQ_None: + break; + + case RQ_LValue: + Out << 'R'; + break; + + case RQ_RValue: + Out << 'O'; + break; + } +} + void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { llvm::SmallString<64> Buffer; Context.mangleObjCMethodName(MD, Buffer); @@ -1364,6 +1387,7 @@ void CXXNameMangler::mangleType(const MemberPointerType *T) { QualType PointeeType = T->getPointeeType(); if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) { mangleQualifiers(Qualifiers::fromCVRMask(FPT->getTypeQuals())); + mangleRefQualifier(FPT->getRefQualifier()); mangleType(FPT); // Itanium C++ ABI 5.1.8: |