[cfe-commits] r135752 - in /cfe/trunk: lib/CodeGen/CodeGenTypes.cpp test/CodeGenCXX/incomplete-types.cpp

Chris Lattner sabre at nondot.org
Thu Jul 21 23:27:26 PDT 2011


Author: lattner
Date: Fri Jul 22 01:27:26 2011
New Revision: 135752

URL: http://llvm.org/viewvc/llvm-project?rev=135752&view=rev
Log:
fix PR10384: C++ allows external arrays of incomplete type as well.
Many thanks to Eli for reducing this great testcase.


Modified:
    cfe/trunk/lib/CodeGen/CodeGenTypes.cpp
    cfe/trunk/test/CodeGenCXX/incomplete-types.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTypes.cpp?rev=135752&r1=135751&r2=135752&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenTypes.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenTypes.cpp Fri Jul 22 01:27:26 2011
@@ -419,6 +419,14 @@
   case Type::ConstantArray: {
     const ConstantArrayType *A = cast<ConstantArrayType>(Ty);
     llvm::Type *EltTy = ConvertTypeForMem(A->getElementType());
+    
+    // Lower arrays of undefined struct type to arrays of i8 just to have a 
+    // concrete type.
+    if (!EltTy->isSized()) {
+      SkippedLayout = true;
+      EltTy = llvm::Type::getInt8Ty(getLLVMContext());
+    }
+
     ResultType = llvm::ArrayType::get(EltTy, A->getSize().getZExtValue());
     break;
   }

Modified: cfe/trunk/test/CodeGenCXX/incomplete-types.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/incomplete-types.cpp?rev=135752&r1=135751&r2=135752&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/incomplete-types.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/incomplete-types.cpp Fri Jul 22 01:27:26 2011
@@ -35,3 +35,9 @@
   extern T x[];
   T* f() { return x; }
 }
+
+namespace PR10384 {
+  struct X;
+  extern X x[1];
+  X* f() { return x; }
+}





More information about the cfe-commits mailing list