From 528908a06e9663a5e6595fc5ff80e017c663dc76 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 6 Nov 2019 22:49:24 +0100 Subject: [PATCH 1/2] Fix ptrCast of array references to fn Closes #3607 --- src/codegen.cpp | 12 ++++-------- test/stage1/behavior/cast.zig | 6 ++++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 154c21893a..7d3ae656fb 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -7050,16 +7050,12 @@ check: switch (const_val->special) { case ZigTypeIdEnum: return bigint_to_llvm_const(get_llvm_type(g, type_entry), &const_val->data.x_enum_tag); case ZigTypeIdFn: - 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->llvm_type; - uint64_t addr = const_val->data.x_ptr.data.hard_coded_addr.addr; - return LLVMConstIntToPtr(LLVMConstInt(usize_type_ref, addr, false), get_llvm_type(g, type_entry)); - } else { + if (const_val->data.x_ptr.special == ConstPtrSpecialFunction && + const_val->data.x_ptr.mut != ConstPtrMutComptimeConst) { zig_unreachable(); } + // Treat it the same as we do for pointers + return gen_const_val_ptr(g, const_val, name); case ZigTypeIdPointer: return gen_const_val_ptr(g, const_val, name); case ZigTypeIdErrorUnion: diff --git a/test/stage1/behavior/cast.zig b/test/stage1/behavior/cast.zig index 6bc8540b7d..e5650bc3fc 100644 --- a/test/stage1/behavior/cast.zig +++ b/test/stage1/behavior/cast.zig @@ -559,3 +559,9 @@ test "peer cast *[0]T to []const T" { var y = if (b) &[0]u8{} else buf; expect(mem.eql(u8, "abcde", y)); } + +var global_array: [4]u8 = undefined; +test "cast from array reference to fn" { + const f = @ptrCast(extern fn () void, &global_array); + expect(@ptrToInt(f) == @ptrToInt(&global_array)); +} From cf6fb89ced7d0f03b511dba19f02af4a87a70b62 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 6 Nov 2019 23:15:19 +0100 Subject: [PATCH 2/2] Add small tokenizer test case for #3468 --- lib/std/zig/tokenizer.zig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/std/zig/tokenizer.zig b/lib/std/zig/tokenizer.zig index 672bd482da..19488ba873 100644 --- a/lib/std/zig/tokenizer.zig +++ b/lib/std/zig/tokenizer.zig @@ -1625,6 +1625,16 @@ test "tokenizer - UTF-8 BOM is recognized and skipped" { }); } +test "correctly parse pointer assignment" { + testTokenize("b.*=3;\n", [_]Token.Id{ + Token.Id.Identifier, + Token.Id.PeriodAsterisk, + Token.Id.Equal, + Token.Id.IntegerLiteral, + Token.Id.Semicolon, + }); +} + fn testTokenize(source: []const u8, expected_tokens: []const Token.Id) void { var tokenizer = Tokenizer.init(source); for (expected_tokens) |expected_token_id| {