aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/AST/Type.h21
-rw-r--r--lib/AST/ASTContext.cpp17
-rw-r--r--lib/AST/Type.cpp5
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());
}