diff options
author | Chris Lattner <sabre@nondot.org> | 2008-07-23 06:31:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-07-23 06:31:27 +0000 |
commit | f31627f676374812d0355d7e34fd2e940b400757 (patch) | |
tree | 4a6013b085d83f98b1310f28d4558cc8d1a69e76 /lib/CodeGen/CGExprScalar.cpp | |
parent | 395aaf20d6e1ab04741562dc6b7d47164bcbd87e (diff) |
Fix a codegen crash on:
int foo(void) {
float x[2];
return x;
}
rdar://6093986
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53946 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index f3ac6a61f4..5a75e53669 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -533,12 +533,16 @@ Value *ScalarExprEmitter::VisitImplicitCastExpr(const ImplicitCastExpr *E) { V = Builder.CreateStructGEP(V, 0, "arraydecay"); // The resultant pointer type can be implicitly casted to other pointer - // types as well, for example void*. - const llvm::Type *DestPTy = ConvertType(E->getType()); - assert(isa<llvm::PointerType>(DestPTy) && - "Only expect implicit cast to pointer"); - if (V->getType() != DestPTy) - V = Builder.CreateBitCast(V, DestPTy, "ptrconv"); + // types as well (e.g. void*) and can be implicitly converted to integer. + const llvm::Type *DestTy = ConvertType(E->getType()); + if (V->getType() != DestTy) { + if (isa<llvm::PointerType>(DestTy)) + V = Builder.CreateBitCast(V, DestTy, "ptrconv"); + else { + assert(isa<llvm::IntegerType>(DestTy) && "Unknown array decay"); + V = Builder.CreatePtrToInt(V, DestTy, "ptrconv"); + } + } return V; } else if (E->getType()->isReferenceType()) { |