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:
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.