From 2e0b114fdce1a10b8433438d8e2251cf708a72ec Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 17 Apr 2017 19:28:33 -0400 Subject: [PATCH] add compile error for intToPtr with a 0-bit ptr See #323 --- src/ir.cpp | 7 +++++++ test/run_tests.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/ir.cpp b/src/ir.cpp index 2159e8472..e22f96fba 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -12473,6 +12473,13 @@ static TypeTableEntry *ir_analyze_instruction_int_to_ptr(IrAnalyze *ira, IrInstr return ira->codegen->builtin_types.entry_invalid; } + type_ensure_zero_bits_known(ira->codegen, dest_type); + if (!type_has_bits(dest_type)) { + ir_add_error(ira, dest_type_value, + buf_sprintf("type '%s' has 0 bits and cannot store information", buf_ptr(&dest_type->name))); + return ira->codegen->builtin_types.entry_invalid; + } + IrInstruction *target = instruction->target->other; if (type_is_invalid(target->value.type)) return ira->codegen->builtin_types.entry_invalid; diff --git a/test/run_tests.cpp b/test/run_tests.cpp index 1a5b309a1..c50996634 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1895,6 +1895,13 @@ export fn entry() { const foo = Arch.x86; } )SOURCE", 1, ".tmp_source.zig:3:21: error: container 'Arch' has no member called 'x86'"); + + add_compile_fail_case("int to ptr of 0 bits", R"SOURCE( +export fn foo() { + var x: usize = 0x1000; + var y: &void = @intToPtr(&void, x); +} + )SOURCE", 1, ".tmp_source.zig:4:31: error: type '&void' has 0 bits and cannot store information"); } //////////////////////////////////////////////////////////////////////////////