From: Devang Patel Date: Tue, 29 Jan 2008 23:23:18 +0000 (+0000) Subject: Handle incomplete struct initializer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=47fb6977509a285501d02611845e9f8e081a15e1;p=clang Handle incomplete struct initializer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46534 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CGExprConstant.cpp b/CodeGen/CGExprConstant.cpp index e03db991c4..070ce1d734 100644 --- a/CodeGen/CGExprConstant.cpp +++ b/CodeGen/CGExprConstant.cpp @@ -80,19 +80,26 @@ public: unsigned NumInitableElts = NumInitElements; std::vector Elts; - // Initialising an array requires us to automatically initialise any - // elements that have not been initialised explicitly + // Initialising an array or structure requires us to automatically + // initialise any elements that have not been initialised explicitly const llvm::ArrayType *AType = 0; - const llvm::Type *AElemTy = 0; - unsigned NumArrayElements = 0; + const llvm::StructType *SType = 0; + const llvm::Type *ElemTy = 0; + unsigned NumElements = 0; // If this is an array, we may have to truncate the initializer if ((AType = dyn_cast(CType))) { - NumArrayElements = AType->getNumElements(); - AElemTy = AType->getElementType(); - NumInitableElts = std::min(NumInitableElts, NumArrayElements); + NumElements = AType->getNumElements(); + ElemTy = AType->getElementType(); + NumInitableElts = std::min(NumInitableElts, NumElements); } - + + // If this is a structure, we may have to truncate the initializer + if ((SType = dyn_cast(CType))) { + NumElements = SType->getNumElements(); + NumInitableElts = std::min(NumInitableElts, NumElements); + } + // Copy initializer elements. unsigned i = 0; for (i = 0; i < NumInitableElts; ++i) { @@ -107,19 +114,25 @@ public: Elts.push_back(C); } - if (ILE->getType()->isStructureType()) - return llvm::ConstantStruct::get(cast(CType), Elts); + if (SType) { + // Initialize remaining structure elements. + for (; i < NumElements; ++i) { + ElemTy = SType->getElementType(i); + Elts.push_back(llvm::Constant::getNullValue(ElemTy)); + } + return llvm::ConstantStruct::get(SType, Elts); + } if (ILE->getType()->isVectorType()) return llvm::ConstantVector::get(cast(CType), Elts); // Make sure we have an array at this point assert(AType); - + // Initialize remaining array elements. - for (; i < NumArrayElements; ++i) - Elts.push_back(llvm::Constant::getNullValue(AElemTy)); - + for (; i < NumElements; ++i) + Elts.push_back(llvm::Constant::getNullValue(ElemTy)); + return llvm::ConstantArray::get(AType, Elts); } diff --git a/test/CodeGen/struct.c b/test/CodeGen/struct.c index be5917a3da..919983938f 100644 --- a/test/CodeGen/struct.c +++ b/test/CodeGen/struct.c @@ -135,4 +135,8 @@ void f12() const struct _a a2; a1 = a2; -} \ No newline at end of file +} + +/* struct initialization */ +struct a13 {int b; int c}; +struct a13 c13 = {5};