From 01c5d1ddc8bd589b629b8c0185c279d090bba115 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 22 Jul 2011 06:27:26 +0000 Subject: [PATCH] fix PR10384: C++ allows external arrays of incomplete type as well. Many thanks to Eli for reducing this great testcase. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135752 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenTypes.cpp | 8 ++++++++ test/CodeGenCXX/incomplete-types.cpp | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp index ee629ec9b0..87b3da5000 100644 --- a/lib/CodeGen/CodeGenTypes.cpp +++ b/lib/CodeGen/CodeGenTypes.cpp @@ -419,6 +419,14 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) { case Type::ConstantArray: { const ConstantArrayType *A = cast(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; } diff --git a/test/CodeGenCXX/incomplete-types.cpp b/test/CodeGenCXX/incomplete-types.cpp index 4f37eeb975..1d4f430e5c 100644 --- a/test/CodeGenCXX/incomplete-types.cpp +++ b/test/CodeGenCXX/incomplete-types.cpp @@ -35,3 +35,9 @@ namespace PR10395 { extern T x[]; T* f() { return x; } } + +namespace PR10384 { + struct X; + extern X x[1]; + X* f() { return x; } +} -- 2.40.0