Handle global variable definitions which change the type of a definition, such as:
extern int x[];
void foo() { x[0] = 1; }
int x[10];
void bar() { x[0] = 1; }



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44509 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CodeGenFunction.cpp b/CodeGen/CodeGenFunction.cpp
index aa9d2c6..3ee7d1f 100644
--- a/CodeGen/CodeGenFunction.cpp
+++ b/CodeGen/CodeGenFunction.cpp
@@ -59,42 +59,7 @@
                              SourceLocation()));
   
   CurFuncDecl = FD;
-  llvm::Constant *CurFnC = CGM.GetAddrOfGlobalDecl(FD);
-  if (!(CurFn = dyn_cast<llvm::Function>(CurFnC))) {
-    // If CurFnC is not a constant, it must be a bitcast of another function.
-    llvm::ConstantExpr *CurFnCE = cast<llvm::ConstantExpr>(CurFnC);
-    assert(CurFnCE->getOpcode() == llvm::Instruction::BitCast &&
-           "Unexpected name collision");
-    llvm::Function *OtherFunc = cast<llvm::Function>(CurFnCE->getOperand(0));
-    
-    // This happens if there is a prototype for a function (e.g. "int f()") and
-    // then a definition of a different type (e.g. "int f(int x)").  Start by
-    // making a new function of the correct type, RAUW, then steal the name.
-    const llvm::PointerType *PTy = cast<llvm::PointerType>(CurFnC->getType());
-    const llvm::FunctionType *FTy =
-      cast<llvm::FunctionType>(PTy->getElementType());
-    CurFn = new llvm::Function(FTy, llvm::Function::ExternalLinkage, "",
-                               &CGM.getModule());
-    CurFn->takeName(OtherFunc);
-    
-    // Replace uses of OtherFunc with the Function we will endow with a body.
-    llvm::Constant *NewPtrForOldDecl = 
-      llvm::ConstantExpr::getBitCast(CurFn, OtherFunc->getType());
-    OtherFunc->replaceAllUsesWith(NewPtrForOldDecl);
-    
-    // Make sure the GlobalDecl map for FD is up-to-date.
-    CGM.ChangeGlobalDeclMap(FD, CurFn);
-    
-    // FIXME: Update the globaldeclmap for the previous decl of this name.  We
-    // really want a way to walk all of these, but we don't have it yet.  This
-    // is incredibly slow!
-    CGM.ReplaceMapValuesWith(OtherFunc, NewPtrForOldDecl);
-    
-    // Ok, delete the old function now, which is dead.
-    assert(OtherFunc->isDeclaration() && "Shouldn't replace non-declaration");
-    OtherFunc->eraseFromParent();
-  }
-  
+  CurFn = cast<llvm::Function>(CGM.GetAddrOfFunctionDecl(FD, true));
   assert(CurFn->isDeclaration() && "Function already has body?");
   
   // TODO: Set up linkage and many other things.  Note, this is a simple