add a new TypeDecl class, which shares commonality between TypedefDecl and TagDecl instances.

llvm-svn: 39309
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index ce1ff6c..97c56bc 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -93,27 +93,7 @@
   static bool classof(const Decl *) { return true; }
 };
 
-class TypedefDecl : public Decl {
-  /// UnderlyingType - This is the type the typedef is set to.
-  TypeRef UnderlyingType;
-  
-  /// TypeForDecl - This indicates the Type object that represents this
-  /// TypedefDecl.  It is a cache maintained by ASTContext::getTypedefType.
-  Type *TypeForDecl;
-  friend class ASTContext;
-public:
-  // FIXME: Remove Declarator argument.
-  TypedefDecl(SourceLocation L, IdentifierInfo *Id, TypeRef T)
-    : Decl(Typedef, L, Id), UnderlyingType(T), TypeForDecl(0) {}
-
-  TypeRef getUnderlyingType() const { return UnderlyingType; }
-
-  // Implement isa/cast/dyncast/etc.
-  static bool classof(const Decl *D) { return D->getKind() == Typedef; }
-  static bool classof(const TypedefDecl *D) { return true; }
-};
-
-/// ObjectDecl - ObjectDecl - Represents a declaration of a value.
+/// ObjectDecl - Represents a declaration of a value.
 class ObjectDecl : public Decl {
   TypeRef DeclType;
 protected:
@@ -214,20 +194,51 @@
 };
 
 
-
-/// TagDecl - Represents the declaration of a struct/union/class/enum.
-class TagDecl : public Decl {
-  /// TypeForDecl - This indicates the Type object that represents this TagDecl.
-  /// It is a cache maintained by ASTContext::getTagDeclType.
+/// TypeDecl - Represents a declaration of a type.
+///
+class TypeDecl : public Decl {
+  /// TypeForDecl - This indicates the Type object that represents this
+  /// TypeDecl.  It is a cache maintained by ASTContext::getTypeDeclType.
   Type *TypeForDecl;
   friend class ASTContext;
+protected:
+  TypeDecl(Kind DK, SourceLocation L, IdentifierInfo *Id)
+    : Decl(DK, L, Id), TypeForDecl(0) {}
+public:
   
+  // Implement isa/cast/dyncast/etc.
+  static bool classof(const Decl *D) {
+    return D->getKind() == Typedef ||
+           D->getKind() == Struct || D->getKind() == Union ||
+           D->getKind() == Class || D->getKind() == Enum;
+  }
+  static bool classof(const TypeDecl *D) { return true; }
+};
+
+
+class TypedefDecl : public TypeDecl {
+  /// UnderlyingType - This is the type the typedef is set to.
+  TypeRef UnderlyingType;
+public:
+    // FIXME: Remove Declarator argument.
+    TypedefDecl(SourceLocation L, IdentifierInfo *Id, TypeRef T)
+    : TypeDecl(Typedef, L, Id), UnderlyingType(T) {}
+  
+  TypeRef getUnderlyingType() const { return UnderlyingType; }
+  
+  // Implement isa/cast/dyncast/etc.
+  static bool classof(const Decl *D) { return D->getKind() == Typedef; }
+  static bool classof(const TypedefDecl *D) { return true; }
+};
+
+
+/// TagDecl - Represents the declaration of a struct/union/class/enum.
+class TagDecl : public TypeDecl {
   /// IsDefinition - True if this is a definition ("struct foo {};"), false if
   /// it is a declaration ("struct foo;").
   bool IsDefinition : 1;
 protected:
-  TagDecl(Kind DK, SourceLocation L, IdentifierInfo *Id) : Decl(DK, L, Id) {
-    TypeForDecl = 0;
+  TagDecl(Kind DK, SourceLocation L, IdentifierInfo *Id) : TypeDecl(DK, L, Id) {
     IsDefinition = false;
   }
 public: