diff options
Diffstat (limited to 'CodeGen')
-rw-r--r-- | CodeGen/CGExprConstant.cpp | 24 | ||||
-rw-r--r-- | CodeGen/CGExprScalar.cpp | 6 |
2 files changed, 13 insertions, 17 deletions
diff --git a/CodeGen/CGExprConstant.cpp b/CodeGen/CGExprConstant.cpp index 5808da4212..da2fef66f0 100644 --- a/CodeGen/CGExprConstant.cpp +++ b/CodeGen/CGExprConstant.cpp @@ -68,26 +68,18 @@ public: } llvm::Constant *VisitInitListExpr(InitListExpr *ILE) { - if (ILE->getType()->isVoidType()) { - // FIXME: Remove this when sema of initializers is finished (and the code - // below). - CGM.WarnUnsupported(ILE, "initializer"); - return 0; + const llvm::CompositeType *CType = + dyn_cast<llvm::CompositeType>(ConvertType(ILE->getType())); + + if (!CType) { + // We have a scalar in braces. Just use the first element. + return Visit(ILE->getInit(0)); } - - assert((ILE->getType()->isArrayType() || ILE->getType()->isStructureType() || - ILE->getType()->isVectorType()) && - "Bad type for init list!"); - CodeGenTypes& Types = CGM.getTypes(); - + unsigned NumInitElements = ILE->getNumInits(); unsigned NumInitableElts = NumInitElements; - - const llvm::CompositeType *CType = - cast<llvm::CompositeType>(Types.ConvertType(ILE->getType())); - assert(CType); std::vector<llvm::Constant*> Elts; - + // Initialising an array requires us to automatically initialise any // elements that have not been initialised explicitly const llvm::ArrayType *AType = 0; diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index 8ec1a83318..652729ac27 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -130,7 +130,11 @@ public: unsigned NumInitElements = E->getNumInits(); const llvm::VectorType *VType = - cast<llvm::VectorType>(ConvertType(E->getType())); + dyn_cast<llvm::VectorType>(ConvertType(E->getType())); + + // We have a scalar in braces. Just use the first element. + if (!VType) + return Visit(E->getInit(0)); unsigned NumVectorElements = VType->getNumElements(); const llvm::Type *ElementType = VType->getElementType(); |