From f31627f676374812d0355d7e34fd2e940b400757 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 23 Jul 2008 06:31:27 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGExprScalar.cpp | 16 ++++++++++------ test/CodeGen/pointer-to-int.c | 9 ++++++++- 2 files changed, 18 insertions(+), 7 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(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(DestTy)) + V = Builder.CreateBitCast(V, DestTy, "ptrconv"); + else { + assert(isa(DestTy) && "Unknown array decay"); + V = Builder.CreatePtrToInt(V, DestTy, "ptrconv"); + } + } return V; } else if (E->getType()->isReferenceType()) { diff --git a/test/CodeGen/pointer-to-int.c b/test/CodeGen/pointer-to-int.c index 7599e0d4ab..a3eaf91bc1 100644 --- a/test/CodeGen/pointer-to-int.c +++ b/test/CodeGen/pointer-to-int.c @@ -1,6 +1,13 @@ -// RUN: clang -emit-llvm %s +// RUN: clang -emit-llvm %s -o - int test(void* i) { return (int)i; } + +// rdar://6093986 +int test2(void) { + float x[2]; + return x; +} + -- 2.40.0