If we are linking two global variables and they have the same size, do not
authorChris Lattner <sabre@nondot.org>
Fri, 20 Aug 2004 00:30:39 +0000 (00:30 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 20 Aug 2004 00:30:39 +0000 (00:30 +0000)
spew warnings, even if the types don't match.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15933 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/FunctionResolution.cpp

index 9cf26b6192665c2361c32fb437f72524ef5436fe..8403226ba38dc7d8d373d57fe8a24214c8f38559 100644 (file)
@@ -236,14 +236,15 @@ static bool ProcessGlobalsWithSameName(Module &M, TargetData &TD,
       // size of 0, and the concrete global is an array with a real size, don't
       // warn.  This occurs due to declaring 'extern int A[];'.
       if (GlobalVariable *ConcreteGV = dyn_cast<GlobalVariable>(Concrete))
-        if (GlobalVariable *OtherGV = dyn_cast<GlobalVariable>(Other))
-          if (const ArrayType *OtherAT =
-              dyn_cast<ArrayType>(OtherGV->getType()->getElementType()))
-            if (const ArrayType *ConcreteAT =
-                dyn_cast<ArrayType>(ConcreteGV->getType()->getElementType()))
-              if (OtherAT->getElementType() == ConcreteAT->getElementType() &&
-                  OtherAT->getNumElements() == 0)
-                DontPrintWarning = true;
+        if (GlobalVariable *OtherGV = dyn_cast<GlobalVariable>(Other)) {
+          const Type *CTy = ConcreteGV->getType();
+          const Type *OTy = OtherGV->getType();
+
+          if (CTy->isSized())
+            if (!OTy->isSized() || !TD.getTypeSize(OTy) ||
+                TD.getTypeSize(OTy) == TD.getTypeSize(CTy))
+              DontPrintWarning = true;
+        }
     }
 
     if (!DontPrintWarning) {