From dd5b2d1b04197903489f5da9c178e17e61bb55e3 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 16 Sep 2018 11:23:38 -0400 Subject: [PATCH] fix crash when pointer casting a runtime extern function --- src/analyze.cpp | 7 ++++--- test/cases/align.zig | 9 +++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index c9ae86539..0401c7125 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3992,9 +3992,10 @@ uint32_t get_ptr_align(CodeGen *g, ZigType *type) { return (ptr_type->data.pointer.explicit_alignment == 0) ? get_abi_alignment(g, ptr_type->data.pointer.child_type) : ptr_type->data.pointer.explicit_alignment; } else if (ptr_type->id == ZigTypeIdFn) { - return (ptr_type->data.fn.fn_type_id.alignment == 0) ? - LLVMABIAlignmentOfType(g->target_data_ref, ptr_type->data.fn.raw_type_ref) : - ptr_type->data.fn.fn_type_id.alignment; + // I tried making this use LLVMABIAlignmentOfType but it trips this assertion in LLVM: + // "Cannot getTypeInfo() on a type that is unsized!" + // when getting the alignment of `?extern fn() void`. + return (ptr_type->data.fn.fn_type_id.alignment == 0) ? 1 : ptr_type->data.fn.fn_type_id.alignment; } else if (ptr_type->id == ZigTypeIdPromise) { return get_coro_frame_align_bytes(g); } else { diff --git a/test/cases/align.zig b/test/cases/align.zig index e052c3c3a..838935f53 100644 --- a/test/cases/align.zig +++ b/test/cases/align.zig @@ -219,3 +219,12 @@ test "alignment of structs" { b: *i32, }) == @alignOf(usize)); } + +test "alignment of extern() void" { + var runtime_nothing = nothing; + const casted1 = @ptrCast(*const u8, runtime_nothing); + const casted2 = @ptrCast(extern fn () void, casted1); + casted2(); +} + +extern fn nothing() void {}