diff --git a/src/codegen.cpp b/src/codegen.cpp index 86ede7411d915fe92fb9481ec7706856d4929d87..d7d722365758756ee139fc6d350f385544fba0dd 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -5886,9 +5886,16 @@ static LLVMValueRef gen_const_val(CodeGen *g, ConstExprValue *const_val, const c case ZigTypeIdEnum: return bigint_to_llvm_const(type_entry->type_ref, &const_val->data.x_enum_tag); case ZigTypeIdFn: - assert(const_val->data.x_ptr.special == ConstPtrSpecialFunction); - assert(const_val->data.x_ptr.mut == ConstPtrMutComptimeConst); - return fn_llvm_value(g, const_val->data.x_ptr.data.fn.fn_entry); + if (const_val->data.x_ptr.special == ConstPtrSpecialFunction) { + assert(const_val->data.x_ptr.mut == ConstPtrMutComptimeConst); + return fn_llvm_value(g, const_val->data.x_ptr.data.fn.fn_entry); + } else if (const_val->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) { + LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->type_ref; + uint64_t addr = const_val->data.x_ptr.data.hard_coded_addr.addr; + return LLVMConstIntToPtr(LLVMConstInt(usize_type_ref, addr, false), type_entry->type_ref); + } else { + zig_unreachable(); + } case ZigTypeIdPointer: return gen_const_val_ptr(g, const_val, name); case ZigTypeIdErrorUnion: diff --git a/test/cases/cast.zig b/test/cases/cast.zig index e2b67f036d255ebafbc41c4f33fba73739869643..db482a124add569524e6f577b10da4b30dec4d3e 100644 --- a/test/cases/cast.zig +++ b/test/cases/cast.zig @@ -526,3 +526,14 @@ test "*usize to *void" { var v = @ptrCast(*void, &i); v.* = {}; } + +test "compile time int to ptr of function" { + foobar(FUNCTION_CONSTANT); +} + +pub const FUNCTION_CONSTANT = @intToPtr(PFN_void, @maxValue(usize)); +pub const PFN_void = extern fn (*c_void) void; + +fn foobar(func: PFN_void) void { + std.debug.assert(@ptrToInt(func) == @maxValue(usize)); +}