Commit 45e72c0b39

Jimmi Holst Christensen <jimmi@ziglang.org>
2018-12-19 15:39:18
Fixed intToPtr to fn type when the address is hardcoded (#1842)
* Fixed intToPtr to fn type * Added test * Import inttoptr.zig in behavior.zig
1 parent 260c3d9
Changed files (3)
src/ir.cpp
@@ -12495,6 +12495,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira, IrInstruct
     case ReqCompTimeNo:
         if (casted_init_value->value.special == ConstValSpecialStatic &&
             casted_init_value->value.type->id == ZigTypeIdFn &&
+            casted_init_value->value.data.x_ptr.special != ConstPtrSpecialHardCodedAddr &&
             casted_init_value->value.data.x_ptr.data.fn.fn_entry->fn_inline == FnInlineAlways)
         {
             var_class_requires_const = true;
test/cases/inttoptr.zig
@@ -0,0 +1,13 @@
+const builtin = @import("builtin");
+const std = @import("std");
+const assertOrPanic = std.debug.assertOrPanic;
+
+test "casting random address to function pointer" {
+    randomAddressToFunction();
+    comptime randomAddressToFunction();
+}
+
+fn randomAddressToFunction() void {
+    var addr: usize = 0xdeadbeef;
+    var ptr = @intToPtr(fn () void, addr);
+}
test/behavior.zig
@@ -42,6 +42,7 @@ comptime {
     _ = @import("cases/if.zig");
     _ = @import("cases/import.zig");
     _ = @import("cases/incomplete_struct_param_tld.zig");
+    _ = @import("cases/inttoptr.zig");
     _ = @import("cases/ir_block_deps.zig");
     _ = @import("cases/math.zig");
     _ = @import("cases/merge_error_sets.zig");