Make IRGen compatible with declaring a function with incomplete 
return/argument types.  (The generated IR isn't ideal, but we can't 
really do better in general.)



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66132 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 422415c..a187f8a 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -779,13 +779,24 @@
 llvm::GlobalValue *
 CodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D,
                                              const llvm::Type *Ty) {
-  if (!Ty)
+  bool DoSetAttributes = true;
+  if (!Ty) {
     Ty = getTypes().ConvertType(D->getType());
+    if (!isa<llvm::FunctionType>(Ty)) {
+      // This function doesn't have a complete type (for example, the return
+      // type is an incomplete struct). Use a fake type instead, and make
+      // sure not to try to set attributes.
+      Ty = llvm::FunctionType::get(llvm::Type::VoidTy,
+                                   std::vector<const llvm::Type*>(), false);
+      DoSetAttributes = false;
+    }
+  }
   llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty), 
                                              llvm::Function::ExternalLinkage,
                                              getMangledName(D),
                                              &getModule());
-  SetFunctionAttributes(D, F);
+  if (DoSetAttributes)
+    SetFunctionAttributes(D, F);
   return F;
 }