diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/contrib/llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp b/contrib/llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp index 444e55f777fa..f9f9fe985b6f 100644 --- a/contrib/llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp +++ b/contrib/llvm-project/clang/lib/AST/MicrosoftCXXABI.cpp @@ -14,6 +14,7 @@ #include "CXXABI.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/CXXInheritance.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/MangleNumberingContext.h" #include "clang/AST/RecordLayout.h" @@ -132,7 +133,7 @@ public: std::unique_ptr<MangleNumberingContext> createMangleNumberingContext() const override { - return llvm::make_unique<MicrosoftNumberingContext>(); + return std::make_unique<MicrosoftNumberingContext>(); } }; } @@ -154,27 +155,32 @@ static bool usesMultipleInheritanceModel(const CXXRecordDecl *RD) { return false; } -MSInheritanceAttr::Spelling CXXRecordDecl::calculateInheritanceModel() const { +MSInheritanceModel CXXRecordDecl::calculateInheritanceModel() const { if (!hasDefinition() || isParsingBaseSpecifiers()) - return MSInheritanceAttr::Keyword_unspecified_inheritance; + return MSInheritanceModel::Unspecified; if (getNumVBases() > 0) - return MSInheritanceAttr::Keyword_virtual_inheritance; + return MSInheritanceModel::Virtual; if (usesMultipleInheritanceModel(this)) - return MSInheritanceAttr::Keyword_multiple_inheritance; - return MSInheritanceAttr::Keyword_single_inheritance; + return MSInheritanceModel::Multiple; + return MSInheritanceModel::Single; } -MSInheritanceAttr::Spelling -CXXRecordDecl::getMSInheritanceModel() const { +MSInheritanceModel CXXRecordDecl::getMSInheritanceModel() const { MSInheritanceAttr *IA = getAttr<MSInheritanceAttr>(); assert(IA && "Expected MSInheritanceAttr on the CXXRecordDecl!"); - return IA->getSemanticSpelling(); + return IA->getInheritanceModel(); } -MSVtorDispAttr::Mode CXXRecordDecl::getMSVtorDispMode() const { +bool CXXRecordDecl::nullFieldOffsetIsZero() const { + return !inheritanceModelHasOnlyOneField(/*IsMemberFunction=*/false, + getMSInheritanceModel()) || + (hasDefinition() && isPolymorphic()); +} + +MSVtorDispMode CXXRecordDecl::getMSVtorDispMode() const { if (MSVtorDispAttr *VDA = getAttr<MSVtorDispAttr>()) return VDA->getVtorDispMode(); - return MSVtorDispAttr::Mode(getASTContext().getLangOpts().VtorDispMode); + return getASTContext().getLangOpts().getVtorDispMode(); } // Returns the number of pointer and integer slots used to represent a member @@ -209,19 +215,19 @@ MSVtorDispAttr::Mode CXXRecordDecl::getMSVtorDispMode() const { static std::pair<unsigned, unsigned> getMSMemberPointerSlots(const MemberPointerType *MPT) { const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl(); - MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel(); + MSInheritanceModel Inheritance = RD->getMSInheritanceModel(); unsigned Ptrs = 0; unsigned Ints = 0; if (MPT->isMemberFunctionPointer()) Ptrs = 1; else Ints = 1; - if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(), + if (inheritanceModelHasNVOffsetField(MPT->isMemberFunctionPointer(), Inheritance)) Ints++; - if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) + if (inheritanceModelHasVBPtrOffsetField(Inheritance)) Ints++; - if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance)) + if (inheritanceModelHasVBTableOffsetField(Inheritance)) Ints++; return std::make_pair(Ptrs, Ints); } |
