diff options
-rw-r--r-- | include/clang/AST/Type.h | 21 | ||||
-rw-r--r-- | lib/AST/ASTContext.cpp | 17 | ||||
-rw-r--r-- | lib/AST/Type.cpp | 5 |
3 files changed, 36 insertions, 7 deletions
diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index 4b349f4d10..21541792d5 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -31,6 +31,7 @@ namespace clang { class TypedefDecl; class TagDecl; class RecordDecl; + class CXXRecordDecl; class EnumDecl; class FieldDecl; class ObjCInterfaceDecl; @@ -1042,6 +1043,7 @@ protected: /// RecordType - This is a helper class that allows the use of isa/cast/dyncast /// to detect TagType objects of structs/unions/classes. class RecordType : public TagType { +protected: explicit RecordType(RecordDecl *D) : TagType(cast<TagDecl>(D), QualType()) { } friend class ASTContext; // ASTContext creates these. public: @@ -1066,6 +1068,25 @@ public: static bool classof(const RecordType *) { return true; } }; +/// CXXRecordType - This is a helper class that allows the use of +/// isa/cast/dyncast to detect TagType objects of C++ structs/unions/classes. +class CXXRecordType : public RecordType { + explicit CXXRecordType(CXXRecordDecl *D) + : RecordType(reinterpret_cast<RecordDecl*>(D)) { } + friend class ASTContext; // ASTContext creates these. +public: + + CXXRecordDecl *getDecl() const { + return reinterpret_cast<CXXRecordDecl*>(RecordType::getDecl()); + } + + static bool classof(const TagType *T); + static bool classof(const Type *T) { + return isa<TagType>(T) && classof(cast<TagType>(T)); + } + static bool classof(const CXXRecordType *) { return true; } +}; + /// EnumType - This is a helper class that allows the use of isa/cast/dyncast /// to detect TagType objects of enums. class EnumType : public TagType { diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 002a51f877..f47855a5c6 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -13,6 +13,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/Basic/TargetInfo.h" #include "llvm/ADT/SmallVector.h" @@ -851,16 +852,18 @@ QualType ASTContext::getTypeDeclType(TypeDecl *Decl) { else if (ObjCInterfaceDecl *ObjCInterface = dyn_cast_or_null<ObjCInterfaceDecl>(Decl)) return getObjCInterfaceType(ObjCInterface); - else if (RecordDecl *Record = dyn_cast_or_null<RecordDecl>(Decl)) { + + if (CXXRecordDecl *CXXRecord = dyn_cast_or_null<CXXRecordDecl>(Decl)) + Decl->TypeForDecl = new CXXRecordType(CXXRecord); + else if (RecordDecl *Record = dyn_cast_or_null<RecordDecl>(Decl)) Decl->TypeForDecl = new RecordType(Record); - Types.push_back(Decl->TypeForDecl); - return QualType(Decl->TypeForDecl, 0); - } else if (EnumDecl *Enum = dyn_cast_or_null<EnumDecl>(Decl)) { + else if (EnumDecl *Enum = dyn_cast_or_null<EnumDecl>(Decl)) Decl->TypeForDecl = new EnumType(Enum); - Types.push_back(Decl->TypeForDecl); - return QualType(Decl->TypeForDecl, 0); - } else + else assert(false && "TypeDecl without a type?"); + + Types.push_back(Decl->TypeForDecl); + return QualType(Decl->TypeForDecl, 0); } /// getTypedefType - Return the unique reference to the type for the diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index f9f6ecac07..c4b44afd32 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -13,6 +13,7 @@ #include "clang/AST/Type.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/Expr.h" #include "clang/Basic/IdentifierTable.h" @@ -739,6 +740,10 @@ bool RecordType::classof(const TagType *TT) { return isa<RecordDecl>(TT->getDecl()); } +bool CXXRecordType::classof(const TagType *TT) { + return isa<CXXRecordDecl>(TT->getDecl()); +} + bool EnumType::classof(const TagType *TT) { return isa<EnumDecl>(TT->getDecl()); } |