| author | |
| committer | |
| log | 24d9438bccde57a838df861aba394077b0c2a5cc |
| tree | 7d42c376274932f2d8e975d8b1afb5a44ac2d50c |
| parent | 9f0fd72321bf04654042a2191274cb31ba8f9110 |
4 files changed, 128 insertions(+), 96 deletions(-)
test/behavior.zig+2-1| ... | @@ -161,6 +161,7 @@ test { | ... | @@ -161,6 +161,7 @@ test { |
| 161 | _ = @import("behavior/enum.zig"); | 161 | _ = @import("behavior/enum.zig"); |
| 162 | _ = @import("behavior/error.zig"); | 162 | _ = @import("behavior/error.zig"); |
| 163 | _ = @import("behavior/eval.zig"); | 163 | _ = @import("behavior/eval.zig"); |
| 164 | _ = @import("behavior/export_builtin.zig"); | ||
| 164 | _ = @import("behavior/export_self_referential_type_info.zig"); | 165 | _ = @import("behavior/export_self_referential_type_info.zig"); |
| 165 | _ = @import("behavior/field_parent_ptr.zig"); | 166 | _ = @import("behavior/field_parent_ptr.zig"); |
| 166 | _ = @import("behavior/floatop.zig"); | 167 | _ = @import("behavior/floatop.zig"); |
| ... | @@ -254,6 +255,6 @@ test { | ... | @@ -254,6 +255,6 @@ test { |
| 254 | builtin.zig_backend != .stage2_c and | 255 | builtin.zig_backend != .stage2_c and |
| 255 | builtin.zig_backend != .stage2_spirv64) | 256 | builtin.zig_backend != .stage2_spirv64) |
| 256 | { | 257 | { |
| 257 | _ = @import("behavior/export.zig"); | 258 | _ = @import("behavior/export_keyword.zig"); |
| 258 | } | 259 | } |
| 259 | } | 260 | } |
test/behavior/export.zig deleted-95| ... | @@ -1,95 +0,0 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const expect = std.testing.expect; | ||
| 3 | const expectEqualSlices = std.testing.expectEqualSlices; | ||
| 4 | const expectEqualStrings = std.testing.expectEqualStrings; | ||
| 5 | const mem = std.mem; | ||
| 6 | const builtin = @import("builtin"); | ||
| 7 | |||
| 8 | // can't really run this test but we can make sure it has no compile error | ||
| 9 | // and generates code | ||
| 10 | const vram = @as([*]volatile u8, @ptrFromInt(0x20000000))[0..0x8000]; | ||
| 11 | export fn writeToVRam() void { | ||
| 12 | vram[0] = 'X'; | ||
| 13 | } | ||
| 14 | |||
| 15 | const PackedStruct = packed struct { | ||
| 16 | a: u8, | ||
| 17 | b: u8, | ||
| 18 | }; | ||
| 19 | const PackedUnion = packed union { | ||
| 20 | a: u8, | ||
| 21 | b: u32, | ||
| 22 | }; | ||
| 23 | |||
| 24 | test "packed struct, enum, union parameters in extern function" { | ||
| 25 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | ||
| 26 | |||
| 27 | testPackedStuff(&(PackedStruct{ | ||
| 28 | .a = 1, | ||
| 29 | .b = 2, | ||
| 30 | }), &(PackedUnion{ .a = 1 })); | ||
| 31 | } | ||
| 32 | |||
| 33 | export fn testPackedStuff(a: *const PackedStruct, b: *const PackedUnion) void { | ||
| 34 | if (false) { | ||
| 35 | a; | ||
| 36 | b; | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | test "exporting enum type and value" { | ||
| 41 | const S = struct { | ||
| 42 | const E = enum(c_int) { one, two }; | ||
| 43 | const e: E = .two; | ||
| 44 | comptime { | ||
| 45 | @export(e, .{ .name = "e" }); | ||
| 46 | } | ||
| 47 | }; | ||
| 48 | try expect(S.e == .two); | ||
| 49 | } | ||
| 50 | |||
| 51 | test "exporting with internal linkage" { | ||
| 52 | const S = struct { | ||
| 53 | fn foo() callconv(.C) void {} | ||
| 54 | comptime { | ||
| 55 | @export(foo, .{ .name = "exporting_with_internal_linkage_foo", .linkage = .Internal }); | ||
| 56 | } | ||
| 57 | }; | ||
| 58 | S.foo(); | ||
| 59 | } | ||
| 60 | |||
| 61 | test "exporting using field access" { | ||
| 62 | const S = struct { | ||
| 63 | const Inner = struct { | ||
| 64 | const x: u32 = 5; | ||
| 65 | }; | ||
| 66 | comptime { | ||
| 67 | @export(Inner.x, .{ .name = "foo", .linkage = .Internal }); | ||
| 68 | } | ||
| 69 | }; | ||
| 70 | |||
| 71 | _ = S.Inner.x; | ||
| 72 | } | ||
| 73 | |||
| 74 | test "exporting comptime-known value" { | ||
| 75 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | ||
| 76 | |||
| 77 | const x: u32 = 10; | ||
| 78 | @export(x, .{ .name = "exporting_comptime_known_value_foo" }); | ||
| 79 | const S = struct { | ||
| 80 | extern const exporting_comptime_known_value_foo: u32; | ||
| 81 | }; | ||
| 82 | try expect(S.exporting_comptime_known_value_foo == 10); | ||
| 83 | } | ||
| 84 | |||
| 85 | test "exporting comptime var" { | ||
| 86 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | ||
| 87 | |||
| 88 | comptime var x: u32 = 5; | ||
| 89 | @export(x, .{ .name = "exporting_comptime_var_foo" }); | ||
| 90 | x = 7; // modifying this now shouldn't change anything | ||
| 91 | const S = struct { | ||
| 92 | extern const exporting_comptime_var_foo: u32; | ||
| 93 | }; | ||
| 94 | try expect(S.exporting_comptime_var_foo == 5); | ||
| 95 | } | ||
test/behavior/export_builtin.zig created+88| ... | @@ -0,0 +1,88 @@ | ||
| 1 | const builtin = @import("builtin"); | ||
| 2 | const std = @import("std"); | ||
| 3 | const expect = std.testing.expect; | ||
| 4 | |||
| 5 | test "exporting enum type and value" { | ||
| 6 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 7 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | ||
| 8 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | ||
| 9 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 10 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | ||
| 11 | |||
| 12 | const S = struct { | ||
| 13 | const E = enum(c_int) { one, two }; | ||
| 14 | const e: E = .two; | ||
| 15 | comptime { | ||
| 16 | @export(e, .{ .name = "e" }); | ||
| 17 | } | ||
| 18 | }; | ||
| 19 | try expect(S.e == .two); | ||
| 20 | } | ||
| 21 | |||
| 22 | test "exporting with internal linkage" { | ||
| 23 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 24 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | ||
| 25 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | ||
| 26 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 27 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | ||
| 28 | |||
| 29 | const S = struct { | ||
| 30 | fn foo() callconv(.C) void {} | ||
| 31 | comptime { | ||
| 32 | @export(foo, .{ .name = "exporting_with_internal_linkage_foo", .linkage = .Internal }); | ||
| 33 | } | ||
| 34 | }; | ||
| 35 | S.foo(); | ||
| 36 | } | ||
| 37 | |||
| 38 | test "exporting using field access" { | ||
| 39 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 40 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | ||
| 41 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | ||
| 42 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 43 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | ||
| 44 | |||
| 45 | const S = struct { | ||
| 46 | const Inner = struct { | ||
| 47 | const x: u32 = 5; | ||
| 48 | }; | ||
| 49 | comptime { | ||
| 50 | @export(Inner.x, .{ .name = "foo", .linkage = .Internal }); | ||
| 51 | } | ||
| 52 | }; | ||
| 53 | |||
| 54 | _ = S.Inner.x; | ||
| 55 | } | ||
| 56 | |||
| 57 | test "exporting comptime-known value" { | ||
| 58 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | ||
| 59 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 60 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | ||
| 61 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | ||
| 62 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 63 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | ||
| 64 | |||
| 65 | const x: u32 = 10; | ||
| 66 | @export(x, .{ .name = "exporting_comptime_known_value_foo" }); | ||
| 67 | const S = struct { | ||
| 68 | extern const exporting_comptime_known_value_foo: u32; | ||
| 69 | }; | ||
| 70 | try expect(S.exporting_comptime_known_value_foo == 10); | ||
| 71 | } | ||
| 72 | |||
| 73 | test "exporting comptime var" { | ||
| 74 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | ||
| 75 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 76 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | ||
| 77 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | ||
| 78 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 79 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | ||
| 80 | |||
| 81 | comptime var x: u32 = 5; | ||
| 82 | @export(x, .{ .name = "exporting_comptime_var_foo" }); | ||
| 83 | x = 7; // modifying this now shouldn't change anything | ||
| 84 | const S = struct { | ||
| 85 | extern const exporting_comptime_var_foo: u32; | ||
| 86 | }; | ||
| 87 | try expect(S.exporting_comptime_var_foo == 5); | ||
| 88 | } | ||
test/behavior/export_keyword.zig created+38| ... | @@ -0,0 +1,38 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const expect = std.testing.expect; | ||
| 3 | const expectEqualSlices = std.testing.expectEqualSlices; | ||
| 4 | const expectEqualStrings = std.testing.expectEqualStrings; | ||
| 5 | const mem = std.mem; | ||
| 6 | const builtin = @import("builtin"); | ||
| 7 | |||
| 8 | // can't really run this test but we can make sure it has no compile error | ||
| 9 | // and generates code | ||
| 10 | const vram = @as([*]volatile u8, @ptrFromInt(0x20000000))[0..0x8000]; | ||
| 11 | export fn writeToVRam() void { | ||
| 12 | vram[0] = 'X'; | ||
| 13 | } | ||
| 14 | |||
| 15 | const PackedStruct = packed struct { | ||
| 16 | a: u8, | ||
| 17 | b: u8, | ||
| 18 | }; | ||
| 19 | const PackedUnion = packed union { | ||
| 20 | a: u8, | ||
| 21 | b: u32, | ||
| 22 | }; | ||
| 23 | |||
| 24 | test "packed struct, enum, union parameters in extern function" { | ||
| 25 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | ||
| 26 | |||
| 27 | testPackedStuff(&(PackedStruct{ | ||
| 28 | .a = 1, | ||
| 29 | .b = 2, | ||
| 30 | }), &(PackedUnion{ .a = 1 })); | ||
| 31 | } | ||
| 32 | |||
| 33 | export fn testPackedStuff(a: *const PackedStruct, b: *const PackedUnion) void { | ||
| 34 | if (false) { | ||
| 35 | a; | ||
| 36 | b; | ||
| 37 | } | ||
| 38 | } | ||