zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 2291560424b3cfa614cb0320d73e41aa1f5fa221 (tree)
parent 556db2ca36afccd623d80b620139a1428c7b65fa
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date:   Tue, 20 Feb 2024 10:15:10 +0100

c_import: extract behavior tests that use `@cImport`

This introduces the new test step `test-c-import`, and removes the
ability of the behavior tests to `@cImport` paths relative to `test`.
This allows the behavior tests to be run without translate c.

Diffstat:
Mbuild.zig | 17+++++++++++++++++
Mci/aarch64-linux-debug.sh | 4++--
Mci/aarch64-linux-release.sh | 4++--
Mci/x86_64-linux-debug.sh | 7+++----
Mci/x86_64-linux-release.sh | 7+++----
Mci/x86_64-macos-release.sh | 3+--
Mci/x86_64-windows-debug.ps1 | 2--
Mci/x86_64-windows-release.ps1 | 2--
Mtest/behavior.zig | 2--
Dtest/behavior/translate_c_macros.zig | 242-------------------------------------------------------------------------------
Atest/c_import.zig | 4++++
Rtest/behavior/c_char_signedness.zig -> test/c_import/c_char_signedness.zig | 0
Rtest/behavior/translate_c_macros.h -> test/c_import/macros.h | 0
Atest/c_import/macros.zig | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rtest/behavior/translate_c_macros_not_utf8.h -> test/c_import/macros_not_utf8.h | 0
Mtest/tests.zig | 3++-
16 files changed, 276 insertions(+), 263 deletions(-)

diff --git a/build.zig b/build.zig @@ -471,6 +471,7 @@ pub fn build(b: *std.Build) !void { .name = "behavior", .desc = "Run the behavior tests", .optimize_modes = optimization_modes, + .include_paths = &.{}, .skip_single_threaded = skip_single_threaded, .skip_non_native = skip_non_native, .skip_cross_glibc = skip_cross_glibc, @@ -480,10 +481,24 @@ pub fn build(b: *std.Build) !void { test_step.dependOn(tests.addModuleTests(b, .{ .test_filter = test_filter, + .root_src = "test/c_import.zig", + .name = "c-import", + .desc = "Run the @cImport tests", + .optimize_modes = optimization_modes, + .include_paths = &.{"test/c_import"}, + .skip_single_threaded = true, + .skip_non_native = skip_non_native, + .skip_cross_glibc = skip_cross_glibc, + .skip_libc = skip_libc, + })); + + test_step.dependOn(tests.addModuleTests(b, .{ + .test_filter = test_filter, .root_src = "lib/compiler_rt.zig", .name = "compiler-rt", .desc = "Run the compiler_rt tests", .optimize_modes = optimization_modes, + .include_paths = &.{}, .skip_single_threaded = true, .skip_non_native = skip_non_native, .skip_cross_glibc = skip_cross_glibc, @@ -496,6 +511,7 @@ pub fn build(b: *std.Build) !void { .name = "universal-libc", .desc = "Run the universal libc tests", .optimize_modes = optimization_modes, + .include_paths = &.{}, .skip_single_threaded = true, .skip_non_native = skip_non_native, .skip_cross_glibc = skip_cross_glibc, @@ -527,6 +543,7 @@ pub fn build(b: *std.Build) !void { .name = "std", .desc = "Run the standard library tests", .optimize_modes = optimization_modes, + .include_paths = &.{}, .skip_single_threaded = skip_single_threaded, .skip_non_native = skip_non_native, .skip_cross_glibc = skip_cross_glibc, diff --git a/ci/aarch64-linux-debug.sh b/ci/aarch64-linux-debug.sh @@ -99,11 +99,11 @@ unset CXX ninja install -stage3/bin/zig test ../test/behavior.zig -I../test +stage3/bin/zig test ../test/behavior.zig stage3/bin/zig build -p stage4 \ -Dstatic-llvm \ -Dtarget=native-native-musl \ -Dno-lib \ --search-prefix "$PREFIX" \ --zig-lib-dir "$(pwd)/../lib" -stage4/bin/zig test ../test/behavior.zig -I../test +stage4/bin/zig test ../test/behavior.zig diff --git a/ci/aarch64-linux-release.sh b/ci/aarch64-linux-release.sh @@ -99,11 +99,11 @@ unset CXX ninja install -stage3/bin/zig test ../test/behavior.zig -I../test +stage3/bin/zig test ../test/behavior.zig stage3/bin/zig build -p stage4 \ -Dstatic-llvm \ -Dtarget=native-native-musl \ -Dno-lib \ --search-prefix "$PREFIX" \ --zig-lib-dir "$(pwd)/../lib" -stage4/bin/zig test ../test/behavior.zig -I../test +stage4/bin/zig test ../test/behavior.zig diff --git a/ci/x86_64-linux-debug.sh b/ci/x86_64-linux-debug.sh @@ -25,8 +25,7 @@ rm -rf zig-out cc -o bootstrap bootstrap.c ./bootstrap ./zig2 build -Dno-lib -# In order to run these behavior tests we need to move the `@cImport` ones to somewhere else. -# ./zig-out/bin/zig test test/behavior.zig +./zig-out/bin/zig test test/behavior.zig export CC="$ZIG cc -target $TARGET -mcpu=$MCPU" export CXX="$ZIG c++ -target $TARGET -mcpu=$MCPU" @@ -108,11 +107,11 @@ unset CXX ninja install -stage3/bin/zig test ../test/behavior.zig -I../test +stage3/bin/zig test ../test/behavior.zig stage3/bin/zig build -p stage4 \ -Dstatic-llvm \ -Dtarget=native-native-musl \ -Dno-lib \ --search-prefix "$PREFIX" \ --zig-lib-dir "$(pwd)/../lib" -stage4/bin/zig test ../test/behavior.zig -I../test +stage4/bin/zig test ../test/behavior.zig diff --git a/ci/x86_64-linux-release.sh b/ci/x86_64-linux-release.sh @@ -25,8 +25,7 @@ rm -rf zig-out cc -o bootstrap bootstrap.c ./bootstrap ./zig2 build -Dno-lib -# In order to run these behavior tests we need to move the `@cImport` ones to somewhere else. -# ./zig-out/bin/zig test test/behavior.zig +./zig-out/bin/zig test test/behavior.zig export CC="$ZIG cc -target $TARGET -mcpu=$MCPU" export CXX="$ZIG c++ -target $TARGET -mcpu=$MCPU" @@ -125,11 +124,11 @@ unset CXX ninja install -stage3/bin/zig test ../test/behavior.zig -I../test +stage3/bin/zig test ../test/behavior.zig stage3/bin/zig build -p stage4 \ -Dstatic-llvm \ -Dtarget=native-native-musl \ -Dno-lib \ --search-prefix "$PREFIX" \ --zig-lib-dir "$(pwd)/../lib" -stage4/bin/zig test ../test/behavior.zig -I../test +stage4/bin/zig test ../test/behavior.zig diff --git a/ci/x86_64-macos-release.sh b/ci/x86_64-macos-release.sh @@ -31,8 +31,7 @@ rm -rf zig-out cc -o bootstrap bootstrap.c ./bootstrap ./zig2 build -Dno-lib -# In order to run these behavior tests we need to move the `@cImport` ones to somewhere else. -# ./zig-out/bin/zig test test/behavior.zig +./zig-out/bin/zig test test/behavior.zig rm -rf build mkdir build diff --git a/ci/x86_64-windows-debug.ps1 b/ci/x86_64-windows-debug.ps1 @@ -66,8 +66,6 @@ Write-Output "Build x86_64-windows-msvc behavior tests using the C backend..." & "stage3-debug\bin\zig.exe" test ` ..\test\behavior.zig ` --zig-lib-dir "$ZIG_LIB_DIR" ` - -I..\test ` - -I..\lib ` -ofmt=c ` -femit-bin="test-x86_64-windows-msvc.c" ` --test-no-exec ` diff --git a/ci/x86_64-windows-release.ps1 b/ci/x86_64-windows-release.ps1 @@ -65,8 +65,6 @@ Write-Output "Build x86_64-windows-msvc behavior tests using the C backend..." & "stage3-release\bin\zig.exe" test ` ..\test\behavior.zig ` --zig-lib-dir "$ZIG_LIB_DIR" ` - -I..\test ` - -I..\lib ` -ofmt=c ` -femit-bin="test-x86_64-windows-msvc.c" ` --test-no-exec ` diff --git a/test/behavior.zig b/test/behavior.zig @@ -14,7 +14,6 @@ test { _ = @import("behavior/bool.zig"); _ = @import("behavior/byteswap.zig"); _ = @import("behavior/byval_arg_var.zig"); - _ = @import("behavior/c_char_signedness.zig"); _ = @import("behavior/call.zig"); _ = @import("behavior/call_tail.zig"); _ = @import("behavior/cast.zig"); @@ -92,7 +91,6 @@ test { _ = @import("behavior/switch_prong_implicit_cast.zig"); _ = @import("behavior/this.zig"); _ = @import("behavior/threadlocal.zig"); - _ = @import("behavior/translate_c_macros.zig"); _ = @import("behavior/truncate.zig"); _ = @import("behavior/try.zig"); _ = @import("behavior/tuple.zig"); diff --git a/test/behavior/translate_c_macros.zig b/test/behavior/translate_c_macros.zig @@ -1,242 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; -const expectEqual = std.testing.expectEqual; -const expectEqualStrings = std.testing.expectEqualStrings; - -const h = @cImport(@cInclude("behavior/translate_c_macros.h")); -const latin1 = @cImport(@cInclude("behavior/translate_c_macros_not_utf8.h")); - -test "casting to void with a macro" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - h.IGNORE_ME_1(42); - h.IGNORE_ME_2(42); - h.IGNORE_ME_3(42); - h.IGNORE_ME_4(42); - h.IGNORE_ME_5(42); - h.IGNORE_ME_6(42); - h.IGNORE_ME_7(42); - h.IGNORE_ME_8(42); - h.IGNORE_ME_9(42); - h.IGNORE_ME_10(42); -} - -test "initializer list expression" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(h.Color{ - .r = 200, - .g = 200, - .b = 200, - .a = 255, - }, h.LIGHTGRAY); -} - -test "sizeof in macros" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expect(@as(c_int, @sizeOf(u32)) == h.MY_SIZEOF(u32)); - try expect(@as(c_int, @sizeOf(u32)) == h.MY_SIZEOF2(u32)); -} - -test "reference to a struct type" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expect(@sizeOf(h.struct_Foo) == h.SIZE_OF_FOO); -} - -test "cast negative integer to pointer" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(@as(?*anyopaque, @ptrFromInt(@as(usize, @bitCast(@as(isize, -1))))), h.MAP_FAILED); -} - -test "casting to union with a macro" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const l: c_long = 42; - const d: f64 = 2.0; - - var casted = h.UNION_CAST(l); - try expect(l == casted.l); - - casted = h.UNION_CAST(d); - try expect(d == casted.d); -} - -test "casting or calling a value with a paren-surrounded macro" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const l: c_long = 42; - const casted = h.CAST_OR_CALL_WITH_PARENS(c_int, l); - try expect(casted == @as(c_int, @intCast(l))); - - const Helper = struct { - fn foo(n: c_int) !void { - try expect(n == 42); - } - }; - - try h.CAST_OR_CALL_WITH_PARENS(Helper.foo, 42); -} - -test "nested comma operator" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(@as(c_int, 3), h.NESTED_COMMA_OPERATOR); - try expectEqual(@as(c_int, 3), h.NESTED_COMMA_OPERATOR_LHS); -} - -test "cast functions" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const S = struct { - fn foo() void {} - }; - try expectEqual(true, h.CAST_TO_BOOL(S.foo)); - try expect(h.CAST_TO_UINTPTR(S.foo) != 0); -} - -test "large integer macro" { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(@as(c_ulonglong, 18446744073709550592), h.LARGE_INT); -} - -test "string literal macro with embedded tab character" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqualStrings("hello\t", h.EMBEDDED_TAB); -} - -test "string and char literals that are not UTF-8 encoded. Issue #12784" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(@as(u8, '\xA9'), latin1.UNPRINTABLE_CHAR); - try expectEqualStrings("\xA9\xA9\xA9", latin1.UNPRINTABLE_STRING); -} - -test "Macro that uses division operator. Issue #13162" { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; - - try expectEqual(@as(c_int, 42), h.DIVIDE_CONSTANT(@as(c_int, 42_000))); - try expectEqual(@as(c_uint, 42), h.DIVIDE_CONSTANT(@as(c_uint, 42_000))); - - try expectEqual( - @as(f64, 42.0), - h.DIVIDE_ARGS( - @as(f64, 42.0), - true, - ), - ); - try expectEqual( - @as(c_int, 21), - h.DIVIDE_ARGS( - @as(i8, 42), - @as(i8, 2), - ), - ); - - try expectEqual( - @as(c_int, 21), - h.DIVIDE_ARGS( - @as(c_ushort, 42), - @as(c_ushort, 2), - ), - ); -} - -test "Macro that uses remainder operator. Issue #13346" { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(@as(c_int, 2_010), h.REMAINDER_CONSTANT(@as(c_int, 42_010))); - try expectEqual(@as(c_uint, 2_030), h.REMAINDER_CONSTANT(@as(c_uint, 42_030))); - - try expectEqual( - @as(c_int, 7), - h.REMAINDER_ARGS( - @as(i8, 17), - @as(i8, 10), - ), - ); - - try expectEqual( - @as(c_int, 5), - h.REMAINDER_ARGS( - @as(c_ushort, 25), - @as(c_ushort, 20), - ), - ); - - try expectEqual( - @as(c_int, 1), - h.REMAINDER_ARGS( - @as(c_int, 5), - @as(c_int, -2), - ), - ); -} - -test "@typeInfo on @cImport result" { - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expect(@typeInfo(h).Struct.decls.len > 1); -} - -test "Macro that uses Long type concatenation casting" { - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expect((@TypeOf(h.X)) == c_long); - try expectEqual(h.X, @as(c_long, 10)); -} - -test "Blank macros" { - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try expectEqual(h.BLANK_MACRO, ""); - try expectEqual(h.BLANK_CHILD_MACRO, ""); - try expect(@TypeOf(h.BLANK_MACRO_CAST) == h.def_type); - try expectEqual(h.BLANK_MACRO_CAST, @as(c_long, 0)); -} diff --git a/test/c_import.zig b/test/c_import.zig @@ -0,0 +1,4 @@ +test { + _ = @import("c_import/c_char_signedness.zig"); + _ = @import("c_import/macros.zig"); +} diff --git a/test/behavior/c_char_signedness.zig b/test/c_import/c_char_signedness.zig diff --git a/test/behavior/translate_c_macros.h b/test/c_import/macros.h diff --git a/test/c_import/macros.zig b/test/c_import/macros.zig @@ -0,0 +1,242 @@ +const builtin = @import("builtin"); +const std = @import("std"); +const expect = std.testing.expect; +const expectEqual = std.testing.expectEqual; +const expectEqualStrings = std.testing.expectEqualStrings; + +const h = @cImport(@cInclude("macros.h")); +const latin1 = @cImport(@cInclude("macros_not_utf8.h")); + +test "casting to void with a macro" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + h.IGNORE_ME_1(42); + h.IGNORE_ME_2(42); + h.IGNORE_ME_3(42); + h.IGNORE_ME_4(42); + h.IGNORE_ME_5(42); + h.IGNORE_ME_6(42); + h.IGNORE_ME_7(42); + h.IGNORE_ME_8(42); + h.IGNORE_ME_9(42); + h.IGNORE_ME_10(42); +} + +test "initializer list expression" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(h.Color{ + .r = 200, + .g = 200, + .b = 200, + .a = 255, + }, h.LIGHTGRAY); +} + +test "sizeof in macros" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expect(@as(c_int, @sizeOf(u32)) == h.MY_SIZEOF(u32)); + try expect(@as(c_int, @sizeOf(u32)) == h.MY_SIZEOF2(u32)); +} + +test "reference to a struct type" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expect(@sizeOf(h.struct_Foo) == h.SIZE_OF_FOO); +} + +test "cast negative integer to pointer" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(@as(?*anyopaque, @ptrFromInt(@as(usize, @bitCast(@as(isize, -1))))), h.MAP_FAILED); +} + +test "casting to union with a macro" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const l: c_long = 42; + const d: f64 = 2.0; + + var casted = h.UNION_CAST(l); + try expect(l == casted.l); + + casted = h.UNION_CAST(d); + try expect(d == casted.d); +} + +test "casting or calling a value with a paren-surrounded macro" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const l: c_long = 42; + const casted = h.CAST_OR_CALL_WITH_PARENS(c_int, l); + try expect(casted == @as(c_int, @intCast(l))); + + const Helper = struct { + fn foo(n: c_int) !void { + try expect(n == 42); + } + }; + + try h.CAST_OR_CALL_WITH_PARENS(Helper.foo, 42); +} + +test "nested comma operator" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(@as(c_int, 3), h.NESTED_COMMA_OPERATOR); + try expectEqual(@as(c_int, 3), h.NESTED_COMMA_OPERATOR_LHS); +} + +test "cast functions" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = struct { + fn foo() void {} + }; + try expectEqual(true, h.CAST_TO_BOOL(S.foo)); + try expect(h.CAST_TO_UINTPTR(S.foo) != 0); +} + +test "large integer macro" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(@as(c_ulonglong, 18446744073709550592), h.LARGE_INT); +} + +test "string literal macro with embedded tab character" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqualStrings("hello\t", h.EMBEDDED_TAB); +} + +test "string and char literals that are not UTF-8 encoded. Issue #12784" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(@as(u8, '\xA9'), latin1.UNPRINTABLE_CHAR); + try expectEqualStrings("\xA9\xA9\xA9", latin1.UNPRINTABLE_STRING); +} + +test "Macro that uses division operator. Issue #13162" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; + + try expectEqual(@as(c_int, 42), h.DIVIDE_CONSTANT(@as(c_int, 42_000))); + try expectEqual(@as(c_uint, 42), h.DIVIDE_CONSTANT(@as(c_uint, 42_000))); + + try expectEqual( + @as(f64, 42.0), + h.DIVIDE_ARGS( + @as(f64, 42.0), + true, + ), + ); + try expectEqual( + @as(c_int, 21), + h.DIVIDE_ARGS( + @as(i8, 42), + @as(i8, 2), + ), + ); + + try expectEqual( + @as(c_int, 21), + h.DIVIDE_ARGS( + @as(c_ushort, 42), + @as(c_ushort, 2), + ), + ); +} + +test "Macro that uses remainder operator. Issue #13346" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(@as(c_int, 2_010), h.REMAINDER_CONSTANT(@as(c_int, 42_010))); + try expectEqual(@as(c_uint, 2_030), h.REMAINDER_CONSTANT(@as(c_uint, 42_030))); + + try expectEqual( + @as(c_int, 7), + h.REMAINDER_ARGS( + @as(i8, 17), + @as(i8, 10), + ), + ); + + try expectEqual( + @as(c_int, 5), + h.REMAINDER_ARGS( + @as(c_ushort, 25), + @as(c_ushort, 20), + ), + ); + + try expectEqual( + @as(c_int, 1), + h.REMAINDER_ARGS( + @as(c_int, 5), + @as(c_int, -2), + ), + ); +} + +test "@typeInfo on @cImport result" { + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expect(@typeInfo(h).Struct.decls.len > 1); +} + +test "Macro that uses Long type concatenation casting" { + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expect((@TypeOf(h.X)) == c_long); + try expectEqual(h.X, @as(c_long, 10)); +} + +test "Blank macros" { + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try expectEqual(h.BLANK_MACRO, ""); + try expectEqual(h.BLANK_CHILD_MACRO, ""); + try expect(@TypeOf(h.BLANK_MACRO_CAST) == h.def_type); + try expectEqual(h.BLANK_MACRO_CAST, @as(c_long, 0)); +} diff --git a/test/behavior/translate_c_macros_not_utf8.h b/test/c_import/macros_not_utf8.h diff --git a/test/tests.zig b/test/tests.zig @@ -1037,6 +1037,7 @@ const ModuleTestOptions = struct { name: []const u8, desc: []const u8, optimize_modes: []const OptimizeMode, + include_paths: []const []const u8, skip_single_threaded: bool, skip_non_native: bool, skip_cross_glibc: bool, @@ -1140,7 +1141,7 @@ pub fn addModuleTests(b: *std.Build, options: ModuleTestOptions) *Step { const use_lld = if (test_target.use_lld == false) "-no-lld" else ""; const use_pic = if (test_target.pic == true) "-pic" else ""; - these_tests.addIncludePath(.{ .path = "test" }); + for (options.include_paths) |include_path| these_tests.addIncludePath(.{ .path = include_path }); if (target.os.tag == .wasi) { // WASI's default stack size can be too small for some big tests.