From 726bbd7afda4373e10b8ab1eac9dfb53c81c8755 Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Thu, 24 Nov 2022 12:30:00 +0100 Subject: [PATCH] Fix regression in generic_bitcast with Union{} arguments. (#47605) --- src/intrinsics.cpp | 7 ++++++- test/compiler/codegen.jl | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/intrinsics.cpp b/src/intrinsics.cpp index 7893a37664508..38d923cb5a99e 100644 --- a/src/intrinsics.cpp +++ b/src/intrinsics.cpp @@ -1134,7 +1134,12 @@ static jl_cgval_t emit_intrinsic(jl_codectx_t &ctx, intrinsic f, jl_value_t **ar jl_cgval_t *argv = (jl_cgval_t*)alloca(sizeof(jl_cgval_t) * nargs); for (size_t i = 0; i < nargs; ++i) { - argv[i] = emit_expr(ctx, args[i + 1]); + jl_cgval_t arg = emit_expr(ctx, args[i + 1]); + if (arg.typ == jl_bottom_type) { + // intrinsics generally don't handle buttom values, so bail out early + return jl_cgval_t(); + } + argv[i] = arg; } // this forces everything to use runtime-intrinsics (e.g. for testing) diff --git a/test/compiler/codegen.jl b/test/compiler/codegen.jl index 4bc7eb8f6d856..11cbd21b793a1 100644 --- a/test/compiler/codegen.jl +++ b/test/compiler/codegen.jl @@ -785,3 +785,8 @@ f_isa_type(@nospecialize(x)) = isa(x, Type) # Issue #47247 f47247(a::Ref{Int}, b::Nothing) = setfield!(a, :x, b) @test_throws TypeError f47247(Ref(5), nothing) + +@testset "regression in generic_bitcast: should support Union{} values" begin + f(x) = Core.bitcast(UInt64, x) + @test occursin("llvm.trap", get_llvm(f, Tuple{Union{}})) +end