Finish off the refactoring of type handling stuff.  Now we recompile every
tag decl after it has been completed


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46798 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/ModuleBuilder.cpp b/CodeGen/ModuleBuilder.cpp
index c59ef44..8d3207a 100644
--- a/CodeGen/ModuleBuilder.cpp
+++ b/CodeGen/ModuleBuilder.cpp
@@ -71,9 +71,19 @@
         // FIXME: implement C++ linkage, C linkage works mostly by C
         // language reuse already.
       } else {
-        Builder->EmitType(cast<TypeDecl>(D));
+        assert(isa<TypeDecl>(D) && "Unknown top level decl");
+        // TODO: handle debug info?
       }
     }
+    
+    /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl
+    /// (e.g. struct, union, enum, class) is completed.  This allows the client to
+    /// hack on the type, which can occur at any point in the file (because these
+    /// can be defined in declspecs).
+    virtual void HandleTagDeclDefinition(TagDecl *D) {
+      Builder->EmitType(D);
+    }
+    
   };
 }