From ce39faa836d0fe2f3be9ff11865c6433f734b2c6 Mon Sep 17 00:00:00 2001 From: Christopher Lamb Date: Sun, 2 Dec 2007 08:49:54 +0000 Subject: Treat discarding array initializer elements as an extwarn (so -pedantic-errors flags it). Allow CodeGen to truncate the initializer if needed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44518 91177308-0d34-0410-b5e6-96231b3b80d8 --- CodeGen/CodeGenModule.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'CodeGen/CodeGenModule.cpp') diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp index fdfb883c5e..c5e6a26859 100644 --- a/CodeGen/CodeGenModule.cpp +++ b/CodeGen/CodeGenModule.cpp @@ -22,6 +22,7 @@ #include "llvm/DerivedTypes.h" #include "llvm/Module.h" #include "llvm/Intrinsics.h" +#include using namespace clang; using namespace CodeGen; @@ -283,15 +284,29 @@ static llvm::Constant *GenerateAggregateInit(const InitListExpr *ILE, CodeGenTypes& Types = CGM.getTypes(); unsigned NumInitElements = ILE->getNumInits(); + unsigned NumInitableElts = NumInitElements; const llvm::CompositeType *CType = cast(Types.ConvertType(ILE->getType())); assert(CType); std::vector Elts; + // Initialising an array 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; + + // 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); + } + // Copy initializer elements. unsigned i = 0; - for (i = 0; i < NumInitElements; ++i) { + for (i = 0; i < NumInitableElts; ++i) { llvm::Constant *C = GenerateConstantExpr(ILE->getInit(i), CGM); assert (C && "Failed to create initialiser expression"); Elts.push_back(C); @@ -299,17 +314,14 @@ static llvm::Constant *GenerateAggregateInit(const InitListExpr *ILE, if (ILE->getType()->isStructureType()) return llvm::ConstantStruct::get(cast(CType), Elts); - - // Initialising an array requires us to automatically initialise any - // elements that have not been initialised explicitly - const llvm::ArrayType *AType = cast(CType); + + // Make sure we have an array at this point assert(AType); - const llvm::Type *AElemTy = AType->getElementType(); - unsigned NumArrayElements = AType->getNumElements(); + // Initialize remaining array elements. for (; i < NumArrayElements; ++i) Elts.push_back(llvm::Constant::getNullValue(AElemTy)); - + return llvm::ConstantArray::get(AType, Elts); } -- cgit v1.2.3-18-g5258