diff options
Diffstat (limited to 'clang/lib/AST/Interp/Record.h')
-rw-r--r-- | clang/lib/AST/Interp/Record.h | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/clang/lib/AST/Interp/Record.h b/clang/lib/AST/Interp/Record.h index 9cdee9003752..1742cb1cc4ee 100644 --- a/clang/lib/AST/Interp/Record.h +++ b/clang/lib/AST/Interp/Record.h @@ -13,14 +13,16 @@ #ifndef LLVM_CLANG_AST_INTERP_RECORD_H #define LLVM_CLANG_AST_INTERP_RECORD_H -#include "Pointer.h" +#include "Descriptor.h" +#include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" namespace clang { namespace interp { class Program; /// Structure/Class descriptor. -class Record { +class Record final { public: /// Describes a record field. struct Field { @@ -47,6 +49,8 @@ public: public: /// Returns the underlying declaration. const RecordDecl *getDecl() const { return Decl; } + /// Returns the name of the underlying declaration. + const std::string getName() const { return Decl->getNameAsString(); } /// Checks if the record is a union. bool isUnion() const { return getDecl()->isUnion(); } /// Returns the size of the record. @@ -59,13 +63,20 @@ public: const Base *getBase(const RecordDecl *FD) const; /// Returns a virtual base descriptor. const Base *getVirtualBase(const RecordDecl *RD) const; + // Returns the destructor of the record, if any. + const CXXDestructorDecl *getDestructor() const { + if (const auto *CXXDecl = dyn_cast<CXXRecordDecl>(Decl)) + return CXXDecl->getDestructor(); + return nullptr; + } using const_field_iter = FieldList::const_iterator; llvm::iterator_range<const_field_iter> fields() const { return llvm::make_range(Fields.begin(), Fields.end()); } - unsigned getNumFields() { return Fields.size(); } + unsigned getNumFields() const { return Fields.size(); } + const Field *getField(unsigned I) const { return &Fields[I]; } Field *getField(unsigned I) { return &Fields[I]; } using const_base_iter = BaseList::const_iterator; @@ -73,7 +84,7 @@ public: return llvm::make_range(Bases.begin(), Bases.end()); } - unsigned getNumBases() { return Bases.size(); } + unsigned getNumBases() const { return Bases.size(); } Base *getBase(unsigned I) { return &Bases[I]; } using const_virtual_iter = VirtualBaseList::const_iterator; @@ -81,7 +92,7 @@ public: return llvm::make_range(VirtualBases.begin(), VirtualBases.end()); } - unsigned getNumVirtualBases() { return VirtualBases.size(); } + unsigned getNumVirtualBases() const { return VirtualBases.size(); } Base *getVirtualBase(unsigned I) { return &VirtualBases[I]; } private: @@ -108,7 +119,6 @@ private: llvm::DenseMap<const FieldDecl *, Field *> FieldMap; /// Mapping from declarations to virtual bases. llvm::DenseMap<const RecordDecl *, Base *> VirtualBaseMap; - /// Mapping from /// Size of the structure. unsigned BaseSize; /// Size of all virtual bases. |