From 51efd553ae94fbf958974284a2f30091e4e1a2fa Mon Sep 17 00:00:00 2001 From: Thomas Ives Date: Tue, 2 Nov 2021 22:43:51 +0000 Subject: C backend: Improve lowering of Zig types to C types 1. Changed Zig pointers to functions to be typedef'd so then we can treat them the same as other types. 2. Distinguished between const slices (zig_L prefix) and mut slices (zig_M prefix). 3. Changed lowering of Zig "const pointers" (e.g. *const u8) to to C "pointers to const" (e.g. const char *) rather than C "const pointers" (e.g. char * const) 4. Ensured that all typedefs are "linked" even if the decl doesn't require any forward declarations 5. Added test that exercises function pointer type rendering 6. Changed .slice_ptr instruction to allocate pointer local rather than a uintptr_t local --- test/behavior/basic.zig | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'test/behavior/basic.zig') diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index 93a1e676fe..cca2d63cd7 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -250,3 +250,45 @@ test "volatile load and store" { ptr.* += 1; try expect(ptr.* == 1235); } + +fn fA() []const u8 { + return "a"; +} +fn fB() []const u8 { + return "b"; +} + +test "call function pointer in struct" { + try expect(mem.eql(u8, f3(true), "a")); + try expect(mem.eql(u8, f3(false), "b")); +} + +fn f3(x: bool) []const u8 { + var wrapper: FnPtrWrapper = .{ + .fn_ptr = fB, + }; + + if (x) { + wrapper.fn_ptr = fA; + } + + return wrapper.fn_ptr(); +} + +const FnPtrWrapper = struct { + fn_ptr: fn () []const u8, +}; + +test "const ptr from var variable" { + var x: u64 = undefined; + var y: u64 = undefined; + + x = 78; + copy(&x, &y); + + try expect(x == y); +} + +fn copy(src: *const u64, dst: *u64) void { + dst.* = src.*; +} -- cgit v1.2.3