Relax an assertion, fixing PR1968
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46742 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index 382f651..9de5d34 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -123,6 +123,12 @@
return Entry = NewFn;
}
+static bool IsZeroElementArray(const llvm::Type *Ty) {
+ if (const llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(Ty))
+ return ATy->getNumElements() == 0;
+ return false;
+}
+
llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
bool isDefinition) {
assert(D->hasGlobalStorage() && "Not a global variable");
@@ -178,8 +184,13 @@
// is incredibly slow!
ReplaceMapValuesWith(GV, NewPtrForOldDecl);
+ // Verify that GV was a declaration or something like x[] which turns into
+ // [0 x type].
+ assert((GV->isDeclaration() ||
+ IsZeroElementArray(GV->getType()->getElementType())) &&
+ "Shouldn't replace non-declaration");
+
// Ok, delete the old global now, which is dead.
- assert(GV->isDeclaration() && "Shouldn't replace non-declaration");
GV->eraseFromParent();
// Return the new global which has the right type.
diff --git a/test/CodeGen/globalinit.c b/test/CodeGen/globalinit.c
index e880b9a..a5535b5 100644
--- a/test/CodeGen/globalinit.c
+++ b/test/CodeGen/globalinit.c
@@ -45,3 +45,8 @@
// Binary operators
int d[] = { EnumA | EnumB };
+
+// PR1968
+static int array[];
+static int array[4];
+