commit 697c4ffd41cb99efbcf2e2c5393dd07533552881 (tree)
parent c7fd414dab3c69819c6528e8dcbb9de8ab17cdf9
Author: Andrew Kelley <andrew@ziglang.org>
Date: Thu, 7 Nov 2019 02:46:20 -0500
Merge branch 'LemonBoy-fix-more-things'
closes #3621
Diffstat:
3 files changed, 20 insertions(+), 8 deletions(-)
diff --git 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| {
diff --git 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
@@ -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));
+}