diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-07-27 22:04:00 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-27 22:04:00 -0700 |
| commit | c650ccfca719b695fe7752f9126e8dbcc2ab4d6d (patch) | |
| tree | dc112b2472f53e44e377dee68d30db02caed8c03 /test/behavior | |
| parent | dfc7493dcb049788b92137ca09b8bd47cee23865 (diff) | |
| parent | 3ccb6a0cd4d4f436a6009ed614436bb3e2e27a7c (diff) | |
| download | zig-c650ccfca719b695fe7752f9126e8dbcc2ab4d6d.tar.gz zig-c650ccfca719b695fe7752f9126e8dbcc2ab4d6d.zip | |
Merge pull request #12265 from ziglang/stage3-run-translated-c
CI: test-run-translated-c with stage3
Diffstat (limited to 'test/behavior')
| -rw-r--r-- | test/behavior/fn.zig | 14 | ||||
| -rw-r--r-- | test/behavior/packed-struct.zig | 22 | ||||
| -rw-r--r-- | test/behavior/union.zig | 30 |
3 files changed, 66 insertions, 0 deletions
diff --git a/test/behavior/fn.zig b/test/behavior/fn.zig index 383d553781..044e4ff049 100644 --- a/test/behavior/fn.zig +++ b/test/behavior/fn.zig @@ -408,3 +408,17 @@ test "function with inferred error set but returning no error" { const return_ty = @typeInfo(@TypeOf(S.foo)).Fn.return_type.?; try expectEqual(0, @typeInfo(@typeInfo(return_ty).ErrorUnion.error_set).ErrorSet.?.len); } + +test "import passed byref to function in return type" { + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const S = struct { + fn get() @import("std").ArrayListUnmanaged(i32) { + var x: @import("std").ArrayListUnmanaged(i32) = .{}; + return x; + } + }; + var list = S.get(); + try expect(list.items.len == 0); +} diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index 52083a492d..2dea485bf5 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -436,3 +436,25 @@ test "load pointer from packed struct" { try expect(i == 123); } } + +test "@ptrToInt on a packed struct field" { + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + + const S = struct { + const P = packed struct { + x: u8, + y: u8, + z: u32, + }; + var p0: P = P{ + .x = 1, + .y = 2, + .z = 0, + }; + }; + try expect(@ptrToInt(&S.p0.z) - @ptrToInt(&S.p0.x) == 2); +} diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 8e4b262565..2f6fa78f0c 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1226,3 +1226,33 @@ test "extern union most-aligned field is smaller" { var a: ?U = .{ .un = [_]u8{0} ** 110 }; try expect(a != null); } + +test "return an extern union from C calling convention" { + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const namespace = struct { + const S = extern struct { + x: c_int, + }; + const U = extern union { + l: c_long, + d: f64, + s: S, + }; + + fn bar(arg_u: U) callconv(.C) U { + var u = arg_u; + return u; + } + }; + + var u: namespace.U = namespace.U{ + .l = @as(c_long, 42), + }; + u = namespace.bar(namespace.U{ + .d = 4.0, + }); + try expect(u.d == 4.0); +} |
