From 6bd8b56b66026676ee2466889ba62b13c5689f71 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Fri, 8 Aug 2014 01:28:12 -0400 Subject: [PATCH] Fix #7897 --- src/cgutils.cpp | 10 ++++++++-- test/core.jl | 13 +++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index bae1edb922e12..94119e9f492f2 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -1520,8 +1520,14 @@ static Value *boxed(Value *v, jl_codectx_t *ctx, jl_value_t *jt) if (jl_subtype(jt2, jt, 0)) jt = jt2; } - - if (jt == jl_bottom_type || v == NULL || dyn_cast(v) != 0 || t == NoopType) { + UndefValue *uv = NULL; + if (jt == jl_bottom_type || v == NULL || (uv = dyn_cast(v)) != 0 || t == NoopType) { + if (uv != NULL && jl_is_datatype(jt)) { + jl_datatype_t *jb = (jl_datatype_t*)jt; + // We have an undef value on a hopefully dead branch + if (jl_isbits(jb) && jb->size != 0) + return UndefValue::get(jl_pvalue_llvmt); + } jl_value_t *s = static_void_instance(jt); if (jl_is_tuple(jt) && jl_tuple_len(jt) > 0) jl_add_linfo_root(ctx->linfo, s); diff --git a/test/core.jl b/test/core.jl index 14551b40bfba6..f26a3d1fb5d4d 100644 --- a/test/core.jl +++ b/test/core.jl @@ -1813,3 +1813,16 @@ type Foo7810{T<:AbstractVector} end bar7810() = [Foo7810([(a,b) for a in 1:2]) for b in 3:4] @test Base.return_types(bar7810,())[1] == Array{Foo7810{Array{(Int,Int),1}},1} + +# issue 7897 +function issue7897!(data, arr) + data = reinterpret(Uint32, data) + a = arr[1] +end + +a = ones(Uint8, 10) +sa = sub(a,4:6) +# This can throw an error, but shouldn't segfault +try + issue7897!(sa, zeros(10)) +end