]> granicus.if.org Git - clang/commitdiff
Add CXXRecordType class.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 7 Aug 2008 20:55:28 +0000 (20:55 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 7 Aug 2008 20:55:28 +0000 (20:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54488 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Type.h
lib/AST/ASTContext.cpp
lib/AST/Type.cpp

index 4b349f4d108eaa8677506626709ea84e0398a4e8..21541792d58edae4606e9b73761be0e342181a06 100644 (file)
@@ -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 {
index 002a51f877a3a7f7a5fce77c0542bab22b3bc27b..f47855a5c6ed6560ad2aaf163a15112d0c053b46 100644 (file)
@@ -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
index f9f6ecac071786c880fe9fc16aa1339caaa708a8..c4b44afd329ed4a177a012b1f3826b47ef66d08a 100644 (file)
@@ -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());
 }