diff options
author | Anders Carlsson <andersca@mac.com> | 2008-01-29 01:15:48 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-01-29 01:15:48 +0000 |
commit | f6884ac7cfc4c5562c0678ad65b3460a38f56e23 (patch) | |
tree | 6bf6cb0df06894c5a37b8c41027105fecddc0b64 | |
parent | ff6e3c596e38328447461894cb8fd3ae22f499c4 (diff) |
Correctly handle scalars in braces.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46480 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | CodeGen/CGExprConstant.cpp | 24 | ||||
-rw-r--r-- | CodeGen/CGExprScalar.cpp | 6 | ||||
-rw-r--r-- | test/CodeGen/globalinit.c | 3 | ||||
-rw-r--r-- | test/CodeGen/init.c | 7 |
4 files changed, 23 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(); diff --git a/test/CodeGen/globalinit.c b/test/CodeGen/globalinit.c index 717b0c1cfb..13a9e930bd 100644 --- a/test/CodeGen/globalinit.c +++ b/test/CodeGen/globalinit.c @@ -32,3 +32,6 @@ void booltest2() { static _Bool booltest3 = 4; } +// Braces in a scalar +int a = { 1 }; +int b = { 1, 2 }; diff --git a/test/CodeGen/init.c b/test/CodeGen/init.c new file mode 100644 index 0000000000..77a85fa75c --- /dev/null +++ b/test/CodeGen/init.c @@ -0,0 +1,7 @@ +// RUN: clang -emit-llvm %s +void f1() +{ + // Braces in a scalar + int a = { 1 }; + int b = { 1, 2 }; +}
\ No newline at end of file |