aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-07-22 06:27:26 +0000
committerChris Lattner <sabre@nondot.org>2011-07-22 06:27:26 +0000
commit01c5d1ddc8bd589b629b8c0185c279d090bba115 (patch)
tree0fe92c4ee4f63714a551a66fc1e21e10d6c268b7
parent018ec4172ee2a021dc38bb274c8b21ff610e2b44 (diff)
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
-rw-r--r--lib/CodeGen/CodeGenTypes.cpp8
-rw-r--r--test/CodeGenCXX/incomplete-types.cpp6
2 files changed, 14 insertions, 0 deletions
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<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;
}
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; }
+}