mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 14:23:09 +00:00
re-enable test-cases and get them all passing
Instead of using `zig test` to build a special version of the compiler that runs all the test-cases, the zig build system is now used as much as possible - all with the basic steps found in the standard library. For incremental compilation tests (the ones that look like foo.0.zig, foo.1.zig, foo.2.zig, etc.), a special version of the compiler is compiled into a utility executable called "check-case" which checks exactly one sequence of incremental updates in an independent subprocess. Previously, all incremental and non-incremental test cases were done in the same test runner process. The compile error checking code is now simpler, but also a bit rudimentary, and so it additionally makes sure that the actual compile errors do not include *extra* messages, and it makes sure that the actual compile errors output in the same order as expected. It is also based on the "ends-with" property of each line rather than the previous logic, which frankly I didn't want to touch with a ten-meter pole. The compile error test cases have been updated to pass in light of these differences. Previously, 'error' mode with 0 compile errors was used to shoehorn in a different kind of test-case - one that only checks if a piece of code compiles without errors. Now there is a 'compile' mode of test-cases, and 'error' must be only used when there are greater than 0 errors. link test cases are updated to omit the target object format argument when calling checkObject since that is no longer needed. The test/stage2 directory is removed; the 2 files within are moved to be directly in the test/ directory.
This commit is contained in:
parent
7cc4a6965c
commit
29cfd47d65
50
build.zig
50
build.zig
@ -53,13 +53,14 @@ pub fn build(b: *std.Build) !void {
|
|||||||
const docs_step = b.step("docs", "Build documentation");
|
const docs_step = b.step("docs", "Build documentation");
|
||||||
docs_step.dependOn(&docgen_cmd.step);
|
docs_step.dependOn(&docgen_cmd.step);
|
||||||
|
|
||||||
const test_cases = b.addTest(.{
|
const check_case_exe = b.addExecutable(.{
|
||||||
.root_source_file = .{ .path = "src/test.zig" },
|
.name = "check-case",
|
||||||
|
.root_source_file = .{ .path = "test/src/Cases.zig" },
|
||||||
.optimize = optimize,
|
.optimize = optimize,
|
||||||
});
|
});
|
||||||
test_cases.main_pkg_path = ".";
|
check_case_exe.main_pkg_path = ".";
|
||||||
test_cases.stack_size = stack_size;
|
check_case_exe.stack_size = stack_size;
|
||||||
test_cases.single_threaded = single_threaded;
|
check_case_exe.single_threaded = single_threaded;
|
||||||
|
|
||||||
const skip_debug = b.option(bool, "skip-debug", "Main test suite skips debug builds") orelse false;
|
const skip_debug = b.option(bool, "skip-debug", "Main test suite skips debug builds") orelse false;
|
||||||
const skip_release = b.option(bool, "skip-release", "Main test suite skips release builds") orelse false;
|
const skip_release = b.option(bool, "skip-release", "Main test suite skips release builds") orelse false;
|
||||||
@ -178,7 +179,7 @@ pub fn build(b: *std.Build) !void {
|
|||||||
if (target.isWindows() and target.getAbi() == .gnu) {
|
if (target.isWindows() and target.getAbi() == .gnu) {
|
||||||
// LTO is currently broken on mingw, this can be removed when it's fixed.
|
// LTO is currently broken on mingw, this can be removed when it's fixed.
|
||||||
exe.want_lto = false;
|
exe.want_lto = false;
|
||||||
test_cases.want_lto = false;
|
check_case_exe.want_lto = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const exe_options = b.addOptions();
|
const exe_options = b.addOptions();
|
||||||
@ -196,7 +197,7 @@ pub fn build(b: *std.Build) !void {
|
|||||||
|
|
||||||
if (link_libc) {
|
if (link_libc) {
|
||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
test_cases.linkLibC();
|
check_case_exe.linkLibC();
|
||||||
}
|
}
|
||||||
|
|
||||||
const is_debug = optimize == .Debug;
|
const is_debug = optimize == .Debug;
|
||||||
@ -282,14 +283,14 @@ pub fn build(b: *std.Build) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try addCmakeCfgOptionsToExe(b, cfg, exe, use_zig_libcxx);
|
try addCmakeCfgOptionsToExe(b, cfg, exe, use_zig_libcxx);
|
||||||
try addCmakeCfgOptionsToExe(b, cfg, test_cases, use_zig_libcxx);
|
try addCmakeCfgOptionsToExe(b, cfg, check_case_exe, use_zig_libcxx);
|
||||||
} else {
|
} else {
|
||||||
// Here we are -Denable-llvm but no cmake integration.
|
// Here we are -Denable-llvm but no cmake integration.
|
||||||
try addStaticLlvmOptionsToExe(exe);
|
try addStaticLlvmOptionsToExe(exe);
|
||||||
try addStaticLlvmOptionsToExe(test_cases);
|
try addStaticLlvmOptionsToExe(check_case_exe);
|
||||||
}
|
}
|
||||||
if (target.isWindows()) {
|
if (target.isWindows()) {
|
||||||
inline for (.{ exe, test_cases }) |artifact| {
|
inline for (.{ exe, check_case_exe }) |artifact| {
|
||||||
artifact.linkSystemLibrary("version");
|
artifact.linkSystemLibrary("version");
|
||||||
artifact.linkSystemLibrary("uuid");
|
artifact.linkSystemLibrary("uuid");
|
||||||
artifact.linkSystemLibrary("ole32");
|
artifact.linkSystemLibrary("ole32");
|
||||||
@ -334,8 +335,9 @@ pub fn build(b: *std.Build) !void {
|
|||||||
const test_filter = b.option([]const u8, "test-filter", "Skip tests that do not match filter");
|
const test_filter = b.option([]const u8, "test-filter", "Skip tests that do not match filter");
|
||||||
|
|
||||||
const test_cases_options = b.addOptions();
|
const test_cases_options = b.addOptions();
|
||||||
test_cases.addOptions("build_options", test_cases_options);
|
check_case_exe.addOptions("build_options", test_cases_options);
|
||||||
|
|
||||||
|
test_cases_options.addOption(bool, "enable_tracy", false);
|
||||||
test_cases_options.addOption(bool, "enable_logging", enable_logging);
|
test_cases_options.addOption(bool, "enable_logging", enable_logging);
|
||||||
test_cases_options.addOption(bool, "enable_link_snapshots", enable_link_snapshots);
|
test_cases_options.addOption(bool, "enable_link_snapshots", enable_link_snapshots);
|
||||||
test_cases_options.addOption(bool, "skip_non_native", skip_non_native);
|
test_cases_options.addOption(bool, "skip_non_native", skip_non_native);
|
||||||
@ -358,12 +360,6 @@ pub fn build(b: *std.Build) !void {
|
|||||||
test_cases_options.addOption(std.SemanticVersion, "semver", semver);
|
test_cases_options.addOption(std.SemanticVersion, "semver", semver);
|
||||||
test_cases_options.addOption(?[]const u8, "test_filter", test_filter);
|
test_cases_options.addOption(?[]const u8, "test_filter", test_filter);
|
||||||
|
|
||||||
const test_cases_step = b.step("test-cases", "Run the main compiler test cases");
|
|
||||||
test_cases_step.dependOn(&test_cases.step);
|
|
||||||
if (!skip_stage2_tests) {
|
|
||||||
test_step.dependOn(test_cases_step);
|
|
||||||
}
|
|
||||||
|
|
||||||
var chosen_opt_modes_buf: [4]builtin.Mode = undefined;
|
var chosen_opt_modes_buf: [4]builtin.Mode = undefined;
|
||||||
var chosen_mode_index: usize = 0;
|
var chosen_mode_index: usize = 0;
|
||||||
if (!skip_debug) {
|
if (!skip_debug) {
|
||||||
@ -386,21 +382,20 @@ pub fn build(b: *std.Build) !void {
|
|||||||
|
|
||||||
const fmt_include_paths = &.{ "doc", "lib", "src", "test", "tools", "build.zig" };
|
const fmt_include_paths = &.{ "doc", "lib", "src", "test", "tools", "build.zig" };
|
||||||
const fmt_exclude_paths = &.{"test/cases"};
|
const fmt_exclude_paths = &.{"test/cases"};
|
||||||
const check_fmt = b.addFmt(.{
|
|
||||||
.paths = fmt_include_paths,
|
|
||||||
.exclude_paths = fmt_exclude_paths,
|
|
||||||
.check = true,
|
|
||||||
});
|
|
||||||
const do_fmt = b.addFmt(.{
|
const do_fmt = b.addFmt(.{
|
||||||
.paths = fmt_include_paths,
|
.paths = fmt_include_paths,
|
||||||
.exclude_paths = fmt_exclude_paths,
|
.exclude_paths = fmt_exclude_paths,
|
||||||
});
|
});
|
||||||
|
|
||||||
const test_fmt_step = b.step("test-fmt", "Check whether source files have conforming formatting");
|
b.step("test-fmt", "Check source files having conforming formatting").dependOn(&b.addFmt(.{
|
||||||
test_fmt_step.dependOn(&check_fmt.step);
|
.paths = fmt_include_paths,
|
||||||
|
.exclude_paths = fmt_exclude_paths,
|
||||||
|
.check = true,
|
||||||
|
}).step);
|
||||||
|
|
||||||
const do_fmt_step = b.step("fmt", "Modify source files in place to have conforming formatting");
|
const test_cases_step = b.step("test-cases", "Run the main compiler test cases");
|
||||||
do_fmt_step.dependOn(&do_fmt.step);
|
try tests.addCases(b, test_cases_step, test_filter, check_case_exe);
|
||||||
|
if (!skip_stage2_tests) test_step.dependOn(test_cases_step);
|
||||||
|
|
||||||
test_step.dependOn(tests.addModuleTests(b, .{
|
test_step.dependOn(tests.addModuleTests(b, .{
|
||||||
.test_filter = test_filter,
|
.test_filter = test_filter,
|
||||||
@ -475,6 +470,9 @@ pub fn build(b: *std.Build) !void {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
try addWasiUpdateStep(b, version);
|
try addWasiUpdateStep(b, version);
|
||||||
|
|
||||||
|
b.step("fmt", "Modify source files in place to have conforming formatting")
|
||||||
|
.dependOn(&do_fmt.step);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn addWasiUpdateStep(b: *std.Build, version: [:0]const u8) !void {
|
fn addWasiUpdateStep(b: *std.Build, version: [:0]const u8) !void {
|
||||||
|
|||||||
1968
src/test.zig
1968
src/test.zig
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const TestContext = @import("../src/test.zig").TestContext;
|
const Cases = @import("src/Cases.zig");
|
||||||
|
|
||||||
pub fn addCases(ctx: *TestContext) !void {
|
pub fn addCases(cases: *Cases) !void {
|
||||||
try @import("compile_errors.zig").addCases(ctx);
|
try @import("compile_errors.zig").addCases(cases);
|
||||||
try @import("stage2/cbe.zig").addCases(ctx);
|
try @import("cbe.zig").addCases(cases);
|
||||||
try @import("stage2/nvptx.zig").addCases(ctx);
|
try @import("nvptx.zig").addCases(cases);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,3 +21,4 @@ pub export fn entry1() void {
|
|||||||
// :9:15: error: access of union field 'a' while field 'b' is active
|
// :9:15: error: access of union field 'a' while field 'b' is active
|
||||||
// :2:21: note: union declared here
|
// :2:21: note: union declared here
|
||||||
// :14:16: error: access of union field 'a' while field 'b' is active
|
// :14:16: error: access of union field 'a' while field 'b' is active
|
||||||
|
// :2:21: note: union declared here
|
||||||
|
|||||||
@ -4,4 +4,4 @@ const bogus = @import("bogus-does-not-exist.zig",);
|
|||||||
// backend=stage2
|
// backend=stage2
|
||||||
// target=native
|
// target=native
|
||||||
//
|
//
|
||||||
// :1:23: error: unable to load '${DIR}bogus-does-not-exist.zig': FileNotFound
|
// bogus-does-not-exist.zig': FileNotFound
|
||||||
|
|||||||
@ -45,4 +45,6 @@ pub export fn entry2() void {
|
|||||||
// :22:13: error: unable to resolve comptime value
|
// :22:13: error: unable to resolve comptime value
|
||||||
// :22:13: note: condition in comptime switch must be comptime-known
|
// :22:13: note: condition in comptime switch must be comptime-known
|
||||||
// :21:17: note: expression is evaluated at comptime because the function returns a comptime-only type 'tmp.S'
|
// :21:17: note: expression is evaluated at comptime because the function returns a comptime-only type 'tmp.S'
|
||||||
|
// :2:12: note: struct requires comptime because of this field
|
||||||
|
// :2:12: note: use '*const fn() void' for a function pointer type
|
||||||
// :32:19: note: called from here
|
// :32:19: note: called from here
|
||||||
|
|||||||
@ -32,6 +32,7 @@ export fn d() void {
|
|||||||
// :3:8: error: opaque types have unknown size and therefore cannot be directly embedded in structs
|
// :3:8: error: opaque types have unknown size and therefore cannot be directly embedded in structs
|
||||||
// :1:11: note: opaque declared here
|
// :1:11: note: opaque declared here
|
||||||
// :7:10: error: opaque types have unknown size and therefore cannot be directly embedded in unions
|
// :7:10: error: opaque types have unknown size and therefore cannot be directly embedded in unions
|
||||||
|
// :1:11: note: opaque declared here
|
||||||
// :19:18: error: opaque types have unknown size and therefore cannot be directly embedded in structs
|
// :19:18: error: opaque types have unknown size and therefore cannot be directly embedded in structs
|
||||||
// :18:22: note: opaque declared here
|
// :18:22: note: opaque declared here
|
||||||
// :24:23: error: opaque types have unknown size and therefore cannot be directly embedded in structs
|
// :24:23: error: opaque types have unknown size and therefore cannot be directly embedded in structs
|
||||||
|
|||||||
@ -12,6 +12,6 @@ comptime { _ = entry2; }
|
|||||||
// backend=stage2
|
// backend=stage2
|
||||||
// target=native
|
// target=native
|
||||||
//
|
//
|
||||||
// :1:15: error: comptime parameters not allowed in function with calling convention 'C'
|
|
||||||
// :5:30: error: comptime parameters not allowed in function with calling convention 'C'
|
// :5:30: error: comptime parameters not allowed in function with calling convention 'C'
|
||||||
// :6:30: error: generic parameters not allowed in function with calling convention 'C'
|
// :6:30: error: generic parameters not allowed in function with calling convention 'C'
|
||||||
|
// :1:15: error: comptime parameters not allowed in function with calling convention 'C'
|
||||||
|
|||||||
@ -27,4 +27,5 @@ export fn entry4() void {
|
|||||||
// :1:17: note: opaque declared here
|
// :1:17: note: opaque declared here
|
||||||
// :8:28: error: parameter of type '@TypeOf(null)' not allowed
|
// :8:28: error: parameter of type '@TypeOf(null)' not allowed
|
||||||
// :12:8: error: parameter of opaque type 'tmp.FooType' not allowed
|
// :12:8: error: parameter of opaque type 'tmp.FooType' not allowed
|
||||||
|
// :1:17: note: opaque declared here
|
||||||
// :17:8: error: parameter of type '@TypeOf(null)' not allowed
|
// :17:8: error: parameter of type '@TypeOf(null)' not allowed
|
||||||
|
|||||||
@ -24,9 +24,9 @@ export fn quux() u32 {
|
|||||||
// :8:5: error: expected type 'void', found '@typeInfo(@typeInfo(@TypeOf(tmp.bar)).Fn.return_type.?).ErrorUnion.error_set'
|
// :8:5: error: expected type 'void', found '@typeInfo(@typeInfo(@TypeOf(tmp.bar)).Fn.return_type.?).ErrorUnion.error_set'
|
||||||
// :7:17: note: function cannot return an error
|
// :7:17: note: function cannot return an error
|
||||||
// :11:15: error: expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(tmp.bar)).Fn.return_type.?).ErrorUnion.error_set!u32'
|
// :11:15: error: expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(tmp.bar)).Fn.return_type.?).ErrorUnion.error_set!u32'
|
||||||
// :10:17: note: function cannot return an error
|
|
||||||
// :11:15: note: cannot convert error union to payload type
|
// :11:15: note: cannot convert error union to payload type
|
||||||
// :11:15: note: consider using 'try', 'catch', or 'if'
|
// :11:15: note: consider using 'try', 'catch', or 'if'
|
||||||
|
// :10:17: note: function cannot return an error
|
||||||
// :15:14: error: expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(tmp.bar)).Fn.return_type.?).ErrorUnion.error_set!u32'
|
// :15:14: error: expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(tmp.bar)).Fn.return_type.?).ErrorUnion.error_set!u32'
|
||||||
// :15:14: note: cannot convert error union to payload type
|
// :15:14: note: cannot convert error union to payload type
|
||||||
// :15:14: note: consider using 'try', 'catch', or 'if'
|
// :15:14: note: consider using 'try', 'catch', or 'if'
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = {}
|
_ = {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
({})
|
({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = comptime {}
|
_ = comptime {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
comptime ({})
|
comptime ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
defer ({})
|
defer ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,7 +3,10 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = for(foo()) |_| {}
|
_ = for(foo()) |_| {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
fn foo() void {}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
// backend=stage2
|
// backend=stage2
|
||||||
|
|||||||
@ -3,7 +3,10 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
for(foo()) |_| ({})
|
for(foo()) |_| ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
fn foo() void {}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
// backend=stage2
|
// backend=stage2
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = if(true) {} else if(true) {} else {}
|
_ = if(true) {} else if(true) {} else {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
if(true) ({}) else if(true) ({}) else ({})
|
if(true) ({}) else if(true) ({}) else ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = if(true) {} else if(true) {}
|
_ = if(true) {} else if(true) {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
if(true) ({}) else if(true) ({})
|
if(true) ({}) else if(true) ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = if(true) {} else {}
|
_ = if(true) {} else {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
if(true) ({}) else ({})
|
if(true) ({}) else ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = if(true) {}
|
_ = if(true) {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
if(true) ({})
|
if(true) ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,7 +3,10 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = if (foo()) |_| {}
|
_ = if (foo()) |_| {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
fn foo() void {}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
// backend=stage2
|
// backend=stage2
|
||||||
|
|||||||
@ -3,7 +3,10 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
if (foo()) |_| ({})
|
if (foo()) |_| ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
fn foo() void {}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
// backend=stage2
|
// backend=stage2
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = while(true):({}) {}
|
_ = while(true):({}) {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
while(true):({}) ({})
|
while(true):({}) ({})
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
_ = while(true) {}
|
_ = while(true) {}
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -3,6 +3,8 @@ export fn entry() void {
|
|||||||
var good = {};
|
var good = {};
|
||||||
while(true) 1
|
while(true) 1
|
||||||
var bad = {};
|
var bad = {};
|
||||||
|
_ = good;
|
||||||
|
_ = bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// error
|
||||||
|
|||||||
@ -9,4 +9,4 @@ export fn entry() void {
|
|||||||
// target=native
|
// target=native
|
||||||
//
|
//
|
||||||
// :3:38: error: enum 'builtin.OptimizeMode' has no member named 'x86'
|
// :3:38: error: enum 'builtin.OptimizeMode' has no member named 'x86'
|
||||||
// :?:18: note: enum declared here
|
// : note: enum declared here
|
||||||
|
|||||||
@ -73,11 +73,11 @@ pub export fn entry8() void {
|
|||||||
//
|
//
|
||||||
// :6:19: error: value stored in comptime field does not match the default value of the field
|
// :6:19: error: value stored in comptime field does not match the default value of the field
|
||||||
// :14:19: error: value stored in comptime field does not match the default value of the field
|
// :14:19: error: value stored in comptime field does not match the default value of the field
|
||||||
// :53:16: error: value stored in comptime field does not match the default value of the field
|
|
||||||
// :19:38: error: value stored in comptime field does not match the default value of the field
|
// :19:38: error: value stored in comptime field does not match the default value of the field
|
||||||
// :31:19: error: value stored in comptime field does not match the default value of the field
|
// :31:19: error: value stored in comptime field does not match the default value of the field
|
||||||
// :25:29: note: default value set here
|
// :25:29: note: default value set here
|
||||||
// :41:16: error: value stored in comptime field does not match the default value of the field
|
// :41:16: error: value stored in comptime field does not match the default value of the field
|
||||||
// :45:12: error: value stored in comptime field does not match the default value of the field
|
// :45:12: error: value stored in comptime field does not match the default value of the field
|
||||||
|
// :53:16: error: value stored in comptime field does not match the default value of the field
|
||||||
// :66:43: error: value stored in comptime field does not match the default value of the field
|
// :66:43: error: value stored in comptime field does not match the default value of the field
|
||||||
// :59:35: error: value stored in comptime field does not match the default value of the field
|
// :59:35: error: value stored in comptime field does not match the default value of the field
|
||||||
|
|||||||
@ -25,5 +25,6 @@ export fn e() void {
|
|||||||
// :4:7: error: no field named 'foo' in struct 'tmp.A'
|
// :4:7: error: no field named 'foo' in struct 'tmp.A'
|
||||||
// :1:11: note: struct declared here
|
// :1:11: note: struct declared here
|
||||||
// :10:17: error: no field named 'bar' in struct 'tmp.A'
|
// :10:17: error: no field named 'bar' in struct 'tmp.A'
|
||||||
|
// :1:11: note: struct declared here
|
||||||
// :18:45: error: no field named 'f' in struct 'tmp.e.B'
|
// :18:45: error: no field named 'f' in struct 'tmp.e.B'
|
||||||
// :14:15: note: struct declared here
|
// :14:15: note: struct declared here
|
||||||
|
|||||||
@ -5,5 +5,7 @@
|
|||||||
// target=x86_64-linux
|
// target=x86_64-linux
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
//
|
//
|
||||||
// :?:?: error: root struct of file 'tmp' has no member named 'main'
|
// : error: root struct of file 'tmp' has no member named 'main'
|
||||||
// :?:?: note: called from here
|
// : note: called from here
|
||||||
|
// : note: called from here
|
||||||
|
// : note: called from here
|
||||||
|
|||||||
@ -5,6 +5,8 @@ fn main() void {}
|
|||||||
// target=x86_64-linux
|
// target=x86_64-linux
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
//
|
//
|
||||||
// :?:?: error: 'main' is not marked 'pub'
|
// : error: 'main' is not marked 'pub'
|
||||||
// :1:1: note: declared here
|
// :1:1: note: declared here
|
||||||
// :?:?: note: called from here
|
// : note: called from here
|
||||||
|
// : note: called from here
|
||||||
|
// : note: called from here
|
||||||
|
|||||||
@ -15,5 +15,6 @@ export fn entry() void {
|
|||||||
// target=native
|
// target=native
|
||||||
//
|
//
|
||||||
// :9:51: error: values of type '[]const builtin.Type.StructField' must be comptime-known, but index value is runtime-known
|
// :9:51: error: values of type '[]const builtin.Type.StructField' must be comptime-known, but index value is runtime-known
|
||||||
// :?:21: note: struct requires comptime because of this field
|
// : note: struct requires comptime because of this field
|
||||||
// :?:21: note: types are not available at runtime
|
// : note: types are not available at runtime
|
||||||
|
// : struct requires comptime because of this field
|
||||||
|
|||||||
@ -13,6 +13,6 @@ comptime {
|
|||||||
// target=native
|
// target=native
|
||||||
//
|
//
|
||||||
// :7:16: error: expected type 'tmp.Foo', found 'tmp.Bar'
|
// :7:16: error: expected type 'tmp.Foo', found 'tmp.Bar'
|
||||||
// :1:13: note: struct declared here
|
|
||||||
// :2:13: note: struct declared here
|
// :2:13: note: struct declared here
|
||||||
|
// :1:13: note: struct declared here
|
||||||
// :4:18: note: parameter type declared here
|
// :4:18: note: parameter type declared here
|
||||||
|
|||||||
@ -28,10 +28,11 @@ export fn u2m() void {
|
|||||||
// target=native
|
// target=native
|
||||||
//
|
//
|
||||||
// :9:1: error: union initializer must initialize one field
|
// :9:1: error: union initializer must initialize one field
|
||||||
|
// :1:12: note: union declared here
|
||||||
// :14:20: error: cannot initialize multiple union fields at once, unions can only have one active field
|
// :14:20: error: cannot initialize multiple union fields at once, unions can only have one active field
|
||||||
// :14:31: note: additional initializer here
|
// :14:31: note: additional initializer here
|
||||||
|
// :1:12: note: union declared here
|
||||||
// :18:21: error: union initializer must initialize one field
|
// :18:21: error: union initializer must initialize one field
|
||||||
// :22:20: error: cannot initialize multiple union fields at once, unions can only have one active field
|
// :22:20: error: cannot initialize multiple union fields at once, unions can only have one active field
|
||||||
// :22:31: note: additional initializer here
|
// :22:31: note: additional initializer here
|
||||||
// :1:12: note: union declared here
|
|
||||||
// :5:12: note: union declared here
|
// :5:12: note: union declared here
|
||||||
|
|||||||
@ -5,7 +5,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=llvm
|
// backend=llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -5,7 +5,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=stage2,llvm
|
// backend=stage2,llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -6,7 +6,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=llvm
|
// backend=llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -6,7 +6,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=stage2,llvm
|
// backend=stage2,llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -5,7 +5,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=stage2,llvm
|
// backend=stage2,llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -5,7 +5,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=stage2,llvm
|
// backend=stage2,llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -5,7 +5,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=stage2,llvm
|
// backend=stage2,llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -5,7 +5,7 @@ pub fn main() void {
|
|||||||
_ = entry;
|
_ = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// error
|
// compile
|
||||||
// output_mode=Exe
|
// output_mode=Exe
|
||||||
// backend=stage2,llvm
|
// backend=stage2,llvm
|
||||||
// target=x86_64-linux,x86_64-macos
|
// target=x86_64-linux,x86_64-macos
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const TestContext = @import("../../src/test.zig").TestContext;
|
const Cases = @import("src/Cases.zig");
|
||||||
|
|
||||||
// These tests should work with all platforms, but we're using linux_x64 for
|
// These tests should work with all platforms, but we're using linux_x64 for
|
||||||
// now for consistency. Will be expanded eventually.
|
// now for consistency. Will be expanded eventually.
|
||||||
@ -8,7 +8,7 @@ const linux_x64 = std.zig.CrossTarget{
|
|||||||
.os_tag = .linux,
|
.os_tag = .linux,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn addCases(ctx: *TestContext) !void {
|
pub fn addCases(ctx: *Cases) !void {
|
||||||
{
|
{
|
||||||
var case = ctx.exeFromCompiledC("hello world with updates", .{});
|
var case = ctx.exeFromCompiledC("hello world with updates", .{});
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var case = ctx.exeFromCompiledC("@intToError", .{});
|
var case = ctx.exeFromCompiledC("intToError", .{});
|
||||||
|
|
||||||
case.addCompareOutput(
|
case.addCompareOutput(
|
||||||
\\pub export fn main() c_int {
|
\\pub export fn main() c_int {
|
||||||
@ -837,7 +837,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var case = ctx.exeFromCompiledC("shift right + left", .{});
|
var case = ctx.exeFromCompiledC("shift right and left", .{});
|
||||||
case.addCompareOutput(
|
case.addCompareOutput(
|
||||||
\\pub export fn main() c_int {
|
\\pub export fn main() c_int {
|
||||||
\\ var i: u32 = 16;
|
\\ var i: u32 = 16;
|
||||||
@ -883,7 +883,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// TODO: add u64 tests, ran into issues with the literal generated for std.math.maxInt(u64)
|
// TODO: add u64 tests, ran into issues with the literal generated for std.math.maxInt(u64)
|
||||||
var case = ctx.exeFromCompiledC("add/sub wrapping operations", .{});
|
var case = ctx.exeFromCompiledC("add and sub wrapping operations", .{});
|
||||||
case.addCompareOutput(
|
case.addCompareOutput(
|
||||||
\\pub export fn main() c_int {
|
\\pub export fn main() c_int {
|
||||||
\\ // Addition
|
\\ // Addition
|
||||||
@ -932,7 +932,7 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var case = ctx.exeFromCompiledC("@rem", linux_x64);
|
var case = ctx.exeFromCompiledC("rem", linux_x64);
|
||||||
case.addCompareOutput(
|
case.addCompareOutput(
|
||||||
\\fn assert(ok: bool) void {
|
\\fn assert(ok: bool) void {
|
||||||
\\ if (!ok) unreachable;
|
\\ if (!ok) unreachable;
|
||||||
@ -947,69 +947,4 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
\\}
|
\\}
|
||||||
, "");
|
, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.h("simple header", linux_x64,
|
|
||||||
\\export fn start() void{}
|
|
||||||
,
|
|
||||||
\\zig_extern void start(void);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with single param function", linux_x64,
|
|
||||||
\\export fn start(a: u8) void{
|
|
||||||
\\ _ = a;
|
|
||||||
\\}
|
|
||||||
,
|
|
||||||
\\zig_extern void start(uint8_t const a0);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with multiple param function", linux_x64,
|
|
||||||
\\export fn start(a: u8, b: u8, c: u8) void{
|
|
||||||
\\ _ = a; _ = b; _ = c;
|
|
||||||
\\}
|
|
||||||
,
|
|
||||||
\\zig_extern void start(uint8_t const a0, uint8_t const a1, uint8_t const a2);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with u32 param function", linux_x64,
|
|
||||||
\\export fn start(a: u32) void{ _ = a; }
|
|
||||||
,
|
|
||||||
\\zig_extern void start(uint32_t const a0);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with usize param function", linux_x64,
|
|
||||||
\\export fn start(a: usize) void{ _ = a; }
|
|
||||||
,
|
|
||||||
\\zig_extern void start(uintptr_t const a0);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with bool param function", linux_x64,
|
|
||||||
\\export fn start(a: bool) void{_ = a;}
|
|
||||||
,
|
|
||||||
\\zig_extern void start(bool const a0);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with noreturn function", linux_x64,
|
|
||||||
\\export fn start() noreturn {
|
|
||||||
\\ unreachable;
|
|
||||||
\\}
|
|
||||||
,
|
|
||||||
\\zig_extern zig_noreturn void start(void);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with multiple functions", linux_x64,
|
|
||||||
\\export fn a() void{}
|
|
||||||
\\export fn b() void{}
|
|
||||||
\\export fn c() void{}
|
|
||||||
,
|
|
||||||
\\zig_extern void a(void);
|
|
||||||
\\zig_extern void b(void);
|
|
||||||
\\zig_extern void c(void);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
ctx.h("header with multiple includes", linux_x64,
|
|
||||||
\\export fn start(a: u32, b: usize) void{ _ = a; _ = b; }
|
|
||||||
,
|
|
||||||
\\zig_extern void start(uint32_t const a0, uintptr_t const a1);
|
|
||||||
\\
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
@ -1,146 +1,10 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
const TestContext = @import("../src/test.zig").TestContext;
|
const Cases = @import("src/Cases.zig");
|
||||||
|
|
||||||
pub fn addCases(ctx: *TestContext) !void {
|
|
||||||
{
|
|
||||||
const case = ctx.obj("wrong same named struct", .{});
|
|
||||||
case.backend = .stage1;
|
|
||||||
|
|
||||||
case.addSourceFile("a.zig",
|
|
||||||
\\pub const Foo = struct {
|
|
||||||
\\ x: i32,
|
|
||||||
\\};
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addSourceFile("b.zig",
|
|
||||||
\\pub const Foo = struct {
|
|
||||||
\\ z: f64,
|
|
||||||
\\};
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
|
||||||
\\const a = @import("a.zig");
|
|
||||||
\\const b = @import("b.zig");
|
|
||||||
\\
|
|
||||||
\\export fn entry() void {
|
|
||||||
\\ var a1: a.Foo = undefined;
|
|
||||||
\\ bar(&a1);
|
|
||||||
\\}
|
|
||||||
\\
|
|
||||||
\\fn bar(x: *b.Foo) void {_ = x;}
|
|
||||||
, &[_][]const u8{
|
|
||||||
"tmp.zig:6:10: error: expected type '*b.Foo', found '*a.Foo'",
|
|
||||||
"tmp.zig:6:10: note: pointer type child 'a.Foo' cannot cast into pointer type child 'b.Foo'",
|
|
||||||
"a.zig:1:17: note: a.Foo declared here",
|
|
||||||
"b.zig:1:17: note: b.Foo declared here",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const case = ctx.obj("multiple files with private function error", .{});
|
|
||||||
case.backend = .stage1;
|
|
||||||
|
|
||||||
case.addSourceFile("foo.zig",
|
|
||||||
\\fn privateFunction() void { }
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
|
||||||
\\const foo = @import("foo.zig",);
|
|
||||||
\\
|
|
||||||
\\export fn callPrivFunction() void {
|
|
||||||
\\ foo.privateFunction();
|
|
||||||
\\}
|
|
||||||
, &[_][]const u8{
|
|
||||||
"tmp.zig:4:8: error: 'privateFunction' is private",
|
|
||||||
"foo.zig:1:1: note: declared here",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const case = ctx.obj("multiple files with private member instance function (canonical invocation) error", .{});
|
|
||||||
case.backend = .stage1;
|
|
||||||
|
|
||||||
case.addSourceFile("foo.zig",
|
|
||||||
\\pub const Foo = struct {
|
|
||||||
\\ fn privateFunction(self: *Foo) void { _ = self; }
|
|
||||||
\\};
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
|
||||||
\\const Foo = @import("foo.zig",).Foo;
|
|
||||||
\\
|
|
||||||
\\export fn callPrivFunction() void {
|
|
||||||
\\ var foo = Foo{};
|
|
||||||
\\ Foo.privateFunction(foo);
|
|
||||||
\\}
|
|
||||||
, &[_][]const u8{
|
|
||||||
"tmp.zig:5:8: error: 'privateFunction' is private",
|
|
||||||
"foo.zig:2:5: note: declared here",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const case = ctx.obj("multiple files with private member instance function error", .{});
|
|
||||||
case.backend = .stage1;
|
|
||||||
|
|
||||||
case.addSourceFile("foo.zig",
|
|
||||||
\\pub const Foo = struct {
|
|
||||||
\\ fn privateFunction(self: *Foo) void { _ = self; }
|
|
||||||
\\};
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
|
||||||
\\const Foo = @import("foo.zig",).Foo;
|
|
||||||
\\
|
|
||||||
\\export fn callPrivFunction() void {
|
|
||||||
\\ var foo = Foo{};
|
|
||||||
\\ foo.privateFunction();
|
|
||||||
\\}
|
|
||||||
, &[_][]const u8{
|
|
||||||
"tmp.zig:5:8: error: 'privateFunction' is private",
|
|
||||||
"foo.zig:2:5: note: declared here",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const case = ctx.obj("export collision", .{});
|
|
||||||
case.backend = .stage1;
|
|
||||||
|
|
||||||
case.addSourceFile("foo.zig",
|
|
||||||
\\export fn bar() void {}
|
|
||||||
\\pub const baz = 1234;
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
|
||||||
\\const foo = @import("foo.zig",);
|
|
||||||
\\
|
|
||||||
\\export fn bar() usize {
|
|
||||||
\\ return foo.baz;
|
|
||||||
\\}
|
|
||||||
, &[_][]const u8{
|
|
||||||
"foo.zig:1:1: error: exported symbol collision: 'bar'",
|
|
||||||
"tmp.zig:3:1: note: other symbol here",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.objErrStage1("non-printable invalid character", "\xff\xfe" ++
|
|
||||||
"fn foo() bool {\r\n" ++
|
|
||||||
" return true;\r\n" ++
|
|
||||||
"}\r\n", &[_][]const u8{
|
|
||||||
"tmp.zig:1:1: error: expected test, comptime, var decl, or container field, found 'invalid bytes'",
|
|
||||||
"tmp.zig:1:1: note: invalid byte: '\\xff'",
|
|
||||||
});
|
|
||||||
|
|
||||||
ctx.objErrStage1("non-printable invalid character with escape alternative", "fn foo() bool {\n" ++
|
|
||||||
"\treturn true;\n" ++
|
|
||||||
"}\n", &[_][]const u8{
|
|
||||||
"tmp.zig:2:1: error: invalid character: '\\t'",
|
|
||||||
});
|
|
||||||
|
|
||||||
|
pub fn addCases(ctx: *Cases) !void {
|
||||||
{
|
{
|
||||||
const case = ctx.obj("multiline error messages", .{});
|
const case = ctx.obj("multiline error messages", .{});
|
||||||
case.backend = .stage2;
|
|
||||||
|
|
||||||
case.addError(
|
case.addError(
|
||||||
\\comptime {
|
\\comptime {
|
||||||
@ -176,7 +40,6 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
|
|
||||||
{
|
{
|
||||||
const case = ctx.obj("isolated carriage return in multiline string literal", .{});
|
const case = ctx.obj("isolated carriage return in multiline string literal", .{});
|
||||||
case.backend = .stage2;
|
|
||||||
|
|
||||||
case.addError("const foo = \\\\\test\r\r rogue carriage return\n;", &[_][]const u8{
|
case.addError("const foo = \\\\\test\r\r rogue carriage return\n;", &[_][]const u8{
|
||||||
":1:19: error: expected ';' after declaration",
|
":1:19: error: expected ';' after declaration",
|
||||||
@ -195,16 +58,6 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
|
|
||||||
{
|
{
|
||||||
const case = ctx.obj("argument causes error", .{});
|
const case = ctx.obj("argument causes error", .{});
|
||||||
case.backend = .stage2;
|
|
||||||
|
|
||||||
case.addSourceFile("b.zig",
|
|
||||||
\\pub const ElfDynLib = struct {
|
|
||||||
\\ pub fn lookup(self: *ElfDynLib, comptime T: type) ?T {
|
|
||||||
\\ _ = self;
|
|
||||||
\\ return undefined;
|
|
||||||
\\ }
|
|
||||||
\\};
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
case.addError(
|
||||||
\\pub export fn entry() void {
|
\\pub export fn entry() void {
|
||||||
@ -216,15 +69,18 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
":3:12: note: argument to function being called at comptime must be comptime-known",
|
":3:12: note: argument to function being called at comptime must be comptime-known",
|
||||||
":2:55: note: expression is evaluated at comptime because the generic function was instantiated with a comptime-only return type",
|
":2:55: note: expression is evaluated at comptime because the generic function was instantiated with a comptime-only return type",
|
||||||
});
|
});
|
||||||
|
case.addSourceFile("b.zig",
|
||||||
|
\\pub const ElfDynLib = struct {
|
||||||
|
\\ pub fn lookup(self: *ElfDynLib, comptime T: type) ?T {
|
||||||
|
\\ _ = self;
|
||||||
|
\\ return undefined;
|
||||||
|
\\ }
|
||||||
|
\\};
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const case = ctx.obj("astgen failure in file struct", .{});
|
const case = ctx.obj("astgen failure in file struct", .{});
|
||||||
case.backend = .stage2;
|
|
||||||
|
|
||||||
case.addSourceFile("b.zig",
|
|
||||||
\\+
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
case.addError(
|
||||||
\\pub export fn entry() void {
|
\\pub export fn entry() void {
|
||||||
@ -233,21 +89,13 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
, &[_][]const u8{
|
, &[_][]const u8{
|
||||||
":1:1: error: expected type expression, found '+'",
|
":1:1: error: expected type expression, found '+'",
|
||||||
});
|
});
|
||||||
|
case.addSourceFile("b.zig",
|
||||||
|
\\+
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const case = ctx.obj("invalid store to comptime field", .{});
|
const case = ctx.obj("invalid store to comptime field", .{});
|
||||||
case.backend = .stage2;
|
|
||||||
|
|
||||||
case.addSourceFile("a.zig",
|
|
||||||
\\pub const S = struct {
|
|
||||||
\\ comptime foo: u32 = 1,
|
|
||||||
\\ bar: u32,
|
|
||||||
\\ pub fn foo(x: @This()) void {
|
|
||||||
\\ _ = x;
|
|
||||||
\\ }
|
|
||||||
\\};
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addError(
|
case.addError(
|
||||||
\\const a = @import("a.zig");
|
\\const a = @import("a.zig");
|
||||||
@ -259,44 +107,19 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
":4:23: error: value stored in comptime field does not match the default value of the field",
|
":4:23: error: value stored in comptime field does not match the default value of the field",
|
||||||
":2:25: note: default value set here",
|
":2:25: note: default value set here",
|
||||||
});
|
});
|
||||||
|
case.addSourceFile("a.zig",
|
||||||
|
\\pub const S = struct {
|
||||||
|
\\ comptime foo: u32 = 1,
|
||||||
|
\\ bar: u32,
|
||||||
|
\\ pub fn foo(x: @This()) void {
|
||||||
|
\\ _ = x;
|
||||||
|
\\ }
|
||||||
|
\\};
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO test this in stage2, but we won't even try in stage1
|
|
||||||
//ctx.objErrStage1("inline fn calls itself indirectly",
|
|
||||||
// \\export fn foo() void {
|
|
||||||
// \\ bar();
|
|
||||||
// \\}
|
|
||||||
// \\fn bar() callconv(.Inline) void {
|
|
||||||
// \\ baz();
|
|
||||||
// \\ quux();
|
|
||||||
// \\}
|
|
||||||
// \\fn baz() callconv(.Inline) void {
|
|
||||||
// \\ bar();
|
|
||||||
// \\ quux();
|
|
||||||
// \\}
|
|
||||||
// \\extern fn quux() void;
|
|
||||||
//, &[_][]const u8{
|
|
||||||
// "tmp.zig:4:1: error: unable to inline function",
|
|
||||||
//});
|
|
||||||
|
|
||||||
//ctx.objErrStage1("save reference to inline function",
|
|
||||||
// \\export fn foo() void {
|
|
||||||
// \\ quux(@ptrToInt(bar));
|
|
||||||
// \\}
|
|
||||||
// \\fn bar() callconv(.Inline) void { }
|
|
||||||
// \\extern fn quux(usize) void;
|
|
||||||
//, &[_][]const u8{
|
|
||||||
// "tmp.zig:4:1: error: unable to inline function",
|
|
||||||
//});
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const case = ctx.obj("file in multiple modules", .{});
|
const case = ctx.obj("file in multiple modules", .{});
|
||||||
case.backend = .stage2;
|
|
||||||
|
|
||||||
case.addSourceFile("foo.zig",
|
|
||||||
\\const dummy = 0;
|
|
||||||
);
|
|
||||||
|
|
||||||
case.addDepModule("foo", "foo.zig");
|
case.addDepModule("foo", "foo.zig");
|
||||||
|
|
||||||
case.addError(
|
case.addError(
|
||||||
@ -309,5 +132,8 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
":1:1: note: root of module root.foo",
|
":1:1: note: root of module root.foo",
|
||||||
":3:17: note: imported from module root",
|
":3:17: note: imported from module root",
|
||||||
});
|
});
|
||||||
|
case.addSourceFile("foo.zig",
|
||||||
|
\\const dummy = 0;
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
// Without -dead_strip, we expect `iAmUnused` symbol present
|
// Without -dead_strip, we expect `iAmUnused` symbol present
|
||||||
const exe = createScenario(b, optimize, target, "no-gc");
|
const exe = createScenario(b, optimize, target, "no-gc");
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkInSymtab();
|
check.checkInSymtab();
|
||||||
check.checkNext("{*} (__TEXT,__text) external _iAmUnused");
|
check.checkNext("{*} (__TEXT,__text) external _iAmUnused");
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
const exe = createScenario(b, optimize, target, "yes-gc");
|
const exe = createScenario(b, optimize, target, "yes-gc");
|
||||||
exe.link_gc_sections = true;
|
exe.link_gc_sections = true;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkInSymtab();
|
check.checkInSymtab();
|
||||||
check.checkNotPresent("{*} (__TEXT,__text) external _iAmUnused");
|
check.checkNotPresent("{*} (__TEXT,__text) external _iAmUnused");
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
// Without -dead_strip_dylibs we expect `-la` to include liba.dylib in the final executable
|
// Without -dead_strip_dylibs we expect `-la` to include liba.dylib in the final executable
|
||||||
const exe = createScenario(b, optimize, "no-dead-strip");
|
const exe = createScenario(b, optimize, "no-dead-strip");
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("cmd LOAD_DYLIB");
|
check.checkStart("cmd LOAD_DYLIB");
|
||||||
check.checkNext("name {*}Cocoa");
|
check.checkNext("name {*}Cocoa");
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
dylib.addCSourceFile("a.c", &.{});
|
dylib.addCSourceFile("a.c", &.{});
|
||||||
dylib.linkLibC();
|
dylib.linkLibC();
|
||||||
|
|
||||||
const check_dylib = dylib.checkObject(.macho);
|
const check_dylib = dylib.checkObject();
|
||||||
check_dylib.checkStart("cmd ID_DYLIB");
|
check_dylib.checkStart("cmd ID_DYLIB");
|
||||||
check_dylib.checkNext("name @rpath/liba.dylib");
|
check_dylib.checkNext("name @rpath/liba.dylib");
|
||||||
check_dylib.checkNext("timestamp 2");
|
check_dylib.checkNext("timestamp 2");
|
||||||
@ -44,7 +44,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.addRPathDirectorySource(dylib.getOutputDirectorySource());
|
exe.addRPathDirectorySource(dylib.getOutputDirectorySource());
|
||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
|
|
||||||
const check_exe = exe.checkObject(.macho);
|
const check_exe = exe.checkObject();
|
||||||
check_exe.checkStart("cmd LOAD_DYLIB");
|
check_exe.checkStart("cmd LOAD_DYLIB");
|
||||||
check_exe.checkNext("name @rpath/liba.dylib");
|
check_exe.checkNext("name @rpath/liba.dylib");
|
||||||
check_exe.checkNext("timestamp 2");
|
check_exe.checkNext("timestamp 2");
|
||||||
|
|||||||
@ -22,7 +22,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
exe.entry_symbol_name = "_non_main";
|
exe.entry_symbol_name = "_non_main";
|
||||||
|
|
||||||
const check_exe = exe.checkObject(.macho);
|
const check_exe = exe.checkObject();
|
||||||
|
|
||||||
check_exe.checkStart("segname __TEXT");
|
check_exe.checkStart("segname __TEXT");
|
||||||
check_exe.checkNext("vmaddr {vmaddr}");
|
check_exe.checkNext("vmaddr {vmaddr}");
|
||||||
|
|||||||
@ -20,7 +20,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
const exe = simpleExe(b, optimize);
|
const exe = simpleExe(b, optimize);
|
||||||
exe.headerpad_max_install_names = true;
|
exe.headerpad_max_install_names = true;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("sectname __text");
|
check.checkStart("sectname __text");
|
||||||
check.checkNext("offset {offset}");
|
check.checkNext("offset {offset}");
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
const exe = simpleExe(b, optimize);
|
const exe = simpleExe(b, optimize);
|
||||||
exe.headerpad_size = 0x10000;
|
exe.headerpad_size = 0x10000;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("sectname __text");
|
check.checkStart("sectname __text");
|
||||||
check.checkNext("offset {offset}");
|
check.checkNext("offset {offset}");
|
||||||
check.checkComputeCompare("offset", .{ .op = .gte, .value = .{ .literal = 0x10000 } });
|
check.checkComputeCompare("offset", .{ .op = .gte, .value = .{ .literal = 0x10000 } });
|
||||||
@ -62,7 +62,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.headerpad_max_install_names = true;
|
exe.headerpad_max_install_names = true;
|
||||||
exe.headerpad_size = 0x10000;
|
exe.headerpad_size = 0x10000;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("sectname __text");
|
check.checkStart("sectname __text");
|
||||||
check.checkNext("offset {offset}");
|
check.checkNext("offset {offset}");
|
||||||
check.checkComputeCompare("offset", .{ .op = .gte, .value = .{ .literal = 0x10000 } });
|
check.checkComputeCompare("offset", .{ .op = .gte, .value = .{ .literal = 0x10000 } });
|
||||||
@ -79,7 +79,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.headerpad_size = 0x1000;
|
exe.headerpad_size = 0x1000;
|
||||||
exe.headerpad_max_install_names = true;
|
exe.headerpad_max_install_names = true;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("sectname __text");
|
check.checkStart("sectname __text");
|
||||||
check.checkNext("offset {offset}");
|
check.checkNext("offset {offset}");
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
.target = target,
|
.target = target,
|
||||||
});
|
});
|
||||||
|
|
||||||
const check = obj.checkObject(.macho);
|
const check = obj.checkObject();
|
||||||
|
|
||||||
check.checkInSymtab();
|
check.checkInSymtab();
|
||||||
check.checkNext("{*} (__DATA,__TestGlobal) external _test_global");
|
check.checkNext("{*} (__DATA,__TestGlobal) external _test_global");
|
||||||
|
|||||||
@ -25,7 +25,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.linkFrameworkNeeded("Cocoa");
|
exe.linkFrameworkNeeded("Cocoa");
|
||||||
exe.dead_strip_dylibs = true;
|
exe.dead_strip_dylibs = true;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("cmd LOAD_DYLIB");
|
check.checkStart("cmd LOAD_DYLIB");
|
||||||
check.checkNext("name {*}Cocoa");
|
check.checkNext("name {*}Cocoa");
|
||||||
test_step.dependOn(&check.step);
|
test_step.dependOn(&check.step);
|
||||||
|
|||||||
@ -38,7 +38,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.addRPathDirectorySource(dylib.getOutputDirectorySource());
|
exe.addRPathDirectorySource(dylib.getOutputDirectorySource());
|
||||||
exe.dead_strip_dylibs = true;
|
exe.dead_strip_dylibs = true;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("cmd LOAD_DYLIB");
|
check.checkStart("cmd LOAD_DYLIB");
|
||||||
check.checkNext("name @rpath/liba.dylib");
|
check.checkNext("name @rpath/liba.dylib");
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
exe.pagezero_size = 0x4000;
|
exe.pagezero_size = 0x4000;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("LC 0");
|
check.checkStart("LC 0");
|
||||||
check.checkNext("segname __PAGEZERO");
|
check.checkNext("segname __PAGEZERO");
|
||||||
check.checkNext("vmaddr 0");
|
check.checkNext("vmaddr 0");
|
||||||
@ -41,7 +41,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
exe.pagezero_size = 0;
|
exe.pagezero_size = 0;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("LC 0");
|
check.checkStart("LC 0");
|
||||||
check.checkNext("segname __TEXT");
|
check.checkNext("segname __TEXT");
|
||||||
check.checkNext("vmaddr 0");
|
check.checkNext("vmaddr 0");
|
||||||
|
|||||||
@ -20,7 +20,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
const exe = createScenario(b, optimize, target, "search_dylibs_first");
|
const exe = createScenario(b, optimize, target, "search_dylibs_first");
|
||||||
exe.search_strategy = .dylibs_first;
|
exe.search_strategy = .dylibs_first;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("cmd LOAD_DYLIB");
|
check.checkStart("cmd LOAD_DYLIB");
|
||||||
check.checkNext("name @rpath/libsearch_dylibs_first.dylib");
|
check.checkNext("name @rpath/libsearch_dylibs_first.dylib");
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
exe.stack_size = 0x100000000;
|
exe.stack_size = 0x100000000;
|
||||||
|
|
||||||
const check_exe = exe.checkObject(.macho);
|
const check_exe = exe.checkObject();
|
||||||
check_exe.checkStart("cmd MAIN");
|
check_exe.checkStart("cmd MAIN");
|
||||||
check_exe.checkNext("stacksize 100000000");
|
check_exe.checkNext("stacksize 100000000");
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
});
|
});
|
||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
|
|
||||||
const check_exe = exe.checkObject(.macho);
|
const check_exe = exe.checkObject();
|
||||||
|
|
||||||
check_exe.checkStart("cmd SEGMENT_64");
|
check_exe.checkStart("cmd SEGMENT_64");
|
||||||
check_exe.checkNext("segname __LINKEDIT");
|
check_exe.checkNext("segname __LINKEDIT");
|
||||||
|
|||||||
@ -31,7 +31,7 @@ fn testUnwindInfo(
|
|||||||
const exe = createScenario(b, optimize, target, name);
|
const exe = createScenario(b, optimize, target, name);
|
||||||
exe.link_gc_sections = dead_strip;
|
exe.link_gc_sections = dead_strip;
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("segname __TEXT");
|
check.checkStart("segname __TEXT");
|
||||||
check.checkNext("sectname __gcc_except_tab");
|
check.checkNext("sectname __gcc_except_tab");
|
||||||
check.checkNext("sectname __unwind_info");
|
check.checkNext("sectname __unwind_info");
|
||||||
|
|||||||
@ -22,7 +22,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.linkLibC();
|
exe.linkLibC();
|
||||||
exe.linkFrameworkWeak("Cocoa");
|
exe.linkFrameworkWeak("Cocoa");
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("cmd LOAD_WEAK_DYLIB");
|
check.checkStart("cmd LOAD_WEAK_DYLIB");
|
||||||
check.checkNext("name {*}Cocoa");
|
check.checkNext("name {*}Cocoa");
|
||||||
test_step.dependOn(&check.step);
|
test_step.dependOn(&check.step);
|
||||||
|
|||||||
@ -36,7 +36,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
exe.addLibraryPathDirectorySource(dylib.getOutputDirectorySource());
|
exe.addLibraryPathDirectorySource(dylib.getOutputDirectorySource());
|
||||||
exe.addRPathDirectorySource(dylib.getOutputDirectorySource());
|
exe.addRPathDirectorySource(dylib.getOutputDirectorySource());
|
||||||
|
|
||||||
const check = exe.checkObject(.macho);
|
const check = exe.checkObject();
|
||||||
check.checkStart("cmd LOAD_WEAK_DYLIB");
|
check.checkStart("cmd LOAD_WEAK_DYLIB");
|
||||||
check.checkNext("name @rpath/liba.dylib");
|
check.checkNext("name @rpath/liba.dylib");
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
lib.use_lld = false;
|
lib.use_lld = false;
|
||||||
lib.strip = false;
|
lib.strip = false;
|
||||||
|
|
||||||
const check = lib.checkObject(.wasm);
|
const check = lib.checkObject();
|
||||||
check.checkStart("Section custom");
|
check.checkStart("Section custom");
|
||||||
check.checkNext("name __truncsfhf2"); // Ensure it was imported and resolved
|
check.checkNext("name __truncsfhf2"); // Ensure it was imported and resolved
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
lib.use_lld = false;
|
lib.use_lld = false;
|
||||||
|
|
||||||
// Verify the result contains the features explicitly set on the target for the library.
|
// Verify the result contains the features explicitly set on the target for the library.
|
||||||
const check = lib.checkObject(.wasm);
|
const check = lib.checkObject();
|
||||||
check.checkStart("name target_features");
|
check.checkStart("name target_features");
|
||||||
check.checkNext("features 1");
|
check.checkNext("features 1");
|
||||||
check.checkNext("+ atomics");
|
check.checkNext("+ atomics");
|
||||||
|
|||||||
@ -19,7 +19,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
lib.import_memory = true;
|
lib.import_memory = true;
|
||||||
lib.install();
|
lib.install();
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
|
|
||||||
// since we import memory, make sure it exists with the correct naming
|
// since we import memory, make sure it exists with the correct naming
|
||||||
check_lib.checkStart("Section import");
|
check_lib.checkStart("Section import");
|
||||||
|
|||||||
@ -19,7 +19,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
lib.export_symbol_names = &.{ "foo", "bar" };
|
lib.export_symbol_names = &.{ "foo", "bar" };
|
||||||
lib.global_base = 0; // put data section at address 0 to make data symbols easier to parse
|
lib.global_base = 0; // put data section at address 0 to make data symbols easier to parse
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
|
|
||||||
check_lib.checkStart("Section global");
|
check_lib.checkStart("Section global");
|
||||||
check_lib.checkNext("entries 3");
|
check_lib.checkNext("entries 3");
|
||||||
|
|||||||
@ -42,19 +42,19 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
force_export.use_llvm = false;
|
force_export.use_llvm = false;
|
||||||
force_export.use_lld = false;
|
force_export.use_lld = false;
|
||||||
|
|
||||||
const check_no_export = no_export.checkObject(.wasm);
|
const check_no_export = no_export.checkObject();
|
||||||
check_no_export.checkStart("Section export");
|
check_no_export.checkStart("Section export");
|
||||||
check_no_export.checkNext("entries 1");
|
check_no_export.checkNext("entries 1");
|
||||||
check_no_export.checkNext("name memory");
|
check_no_export.checkNext("name memory");
|
||||||
check_no_export.checkNext("kind memory");
|
check_no_export.checkNext("kind memory");
|
||||||
|
|
||||||
const check_dynamic_export = dynamic_export.checkObject(.wasm);
|
const check_dynamic_export = dynamic_export.checkObject();
|
||||||
check_dynamic_export.checkStart("Section export");
|
check_dynamic_export.checkStart("Section export");
|
||||||
check_dynamic_export.checkNext("entries 2");
|
check_dynamic_export.checkNext("entries 2");
|
||||||
check_dynamic_export.checkNext("name foo");
|
check_dynamic_export.checkNext("name foo");
|
||||||
check_dynamic_export.checkNext("kind function");
|
check_dynamic_export.checkNext("kind function");
|
||||||
|
|
||||||
const check_force_export = force_export.checkObject(.wasm);
|
const check_force_export = force_export.checkObject();
|
||||||
check_force_export.checkStart("Section export");
|
check_force_export.checkStart("Section export");
|
||||||
check_force_export.checkNext("entries 2");
|
check_force_export.checkNext("entries 2");
|
||||||
check_force_export.checkNext("name foo");
|
check_force_export.checkNext("name foo");
|
||||||
|
|||||||
@ -20,7 +20,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
lib.import_symbols = true; // import `a` and `b`
|
lib.import_symbols = true; // import `a` and `b`
|
||||||
lib.rdynamic = true; // export `foo`
|
lib.rdynamic = true; // export `foo`
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
check_lib.checkStart("Section import");
|
check_lib.checkStart("Section import");
|
||||||
check_lib.checkNext("entries 2"); // a.hello & b.hello
|
check_lib.checkNext("entries 2"); // a.hello & b.hello
|
||||||
check_lib.checkNext("module a");
|
check_lib.checkNext("module a");
|
||||||
|
|||||||
@ -42,9 +42,9 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
regular_table.use_llvm = false;
|
regular_table.use_llvm = false;
|
||||||
regular_table.use_lld = false;
|
regular_table.use_lld = false;
|
||||||
|
|
||||||
const check_import = import_table.checkObject(.wasm);
|
const check_import = import_table.checkObject();
|
||||||
const check_export = export_table.checkObject(.wasm);
|
const check_export = export_table.checkObject();
|
||||||
const check_regular = regular_table.checkObject(.wasm);
|
const check_regular = regular_table.checkObject();
|
||||||
|
|
||||||
check_import.checkStart("Section import");
|
check_import.checkStart("Section import");
|
||||||
check_import.checkNext("entries 1");
|
check_import.checkNext("entries 1");
|
||||||
|
|||||||
@ -32,7 +32,7 @@ pub fn build(b: *std.Build) void {
|
|||||||
lib.addObject(c_obj);
|
lib.addObject(c_obj);
|
||||||
|
|
||||||
// Verify the result contains the features from the C Object file.
|
// Verify the result contains the features from the C Object file.
|
||||||
const check = lib.checkObject(.wasm);
|
const check = lib.checkObject();
|
||||||
check.checkStart("name target_features");
|
check.checkStart("name target_features");
|
||||||
check.checkNext("features 7");
|
check.checkNext("features 7");
|
||||||
check.checkNext("+ atomics");
|
check.checkNext("+ atomics");
|
||||||
|
|||||||
@ -27,7 +27,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
|
|
||||||
const version_fmt = "version " ++ builtin.zig_version_string;
|
const version_fmt = "version " ++ builtin.zig_version_string;
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
check_lib.checkStart("name producers");
|
check_lib.checkStart("name producers");
|
||||||
check_lib.checkNext("fields 2");
|
check_lib.checkNext("fields 2");
|
||||||
check_lib.checkNext("field_name language");
|
check_lib.checkNext("field_name language");
|
||||||
|
|||||||
@ -24,7 +24,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
lib.strip = false;
|
lib.strip = false;
|
||||||
lib.install();
|
lib.install();
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
check_lib.checkStart("Section data");
|
check_lib.checkStart("Section data");
|
||||||
check_lib.checkNext("entries 2"); // rodata & data, no bss because we're exporting memory
|
check_lib.checkNext("entries 2"); // rodata & data, no bss because we're exporting memory
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
lib.stack_size = std.wasm.page_size * 2; // set an explicit stack size
|
lib.stack_size = std.wasm.page_size * 2; // set an explicit stack size
|
||||||
lib.install();
|
lib.install();
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
|
|
||||||
// ensure global exists and its initial value is equal to explitic stack size
|
// ensure global exists and its initial value is equal to explitic stack size
|
||||||
check_lib.checkStart("Section global");
|
check_lib.checkStart("Section global");
|
||||||
|
|||||||
@ -24,7 +24,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
|
|||||||
lib.strip = false;
|
lib.strip = false;
|
||||||
lib.install();
|
lib.install();
|
||||||
|
|
||||||
const check_lib = lib.checkObject(.wasm);
|
const check_lib = lib.checkObject();
|
||||||
check_lib.checkStart("Section type");
|
check_lib.checkStart("Section type");
|
||||||
// only 2 entries, although we have 3 functions.
|
// only 2 entries, although we have 3 functions.
|
||||||
// This is to test functions with the same function signature
|
// This is to test functions with the same function signature
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const TestContext = @import("../../src/test.zig").TestContext;
|
const Cases = @import("src/Cases.zig");
|
||||||
|
|
||||||
pub fn addCases(ctx: *TestContext) !void {
|
pub fn addCases(ctx: *Cases) !void {
|
||||||
{
|
{
|
||||||
var case = addPtx(ctx, "nvptx: simple addition and subtraction");
|
var case = addPtx(ctx, "simple addition and subtraction");
|
||||||
|
|
||||||
case.compiles(
|
case.addCompile(
|
||||||
\\fn add(a: i32, b: i32) i32 {
|
\\fn add(a: i32, b: i32) i32 {
|
||||||
\\ return a + b;
|
\\ return a + b;
|
||||||
\\}
|
\\}
|
||||||
@ -20,9 +20,9 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var case = addPtx(ctx, "nvptx: read special registers");
|
var case = addPtx(ctx, "read special registers");
|
||||||
|
|
||||||
case.compiles(
|
case.addCompile(
|
||||||
\\fn threadIdX() u32 {
|
\\fn threadIdX() u32 {
|
||||||
\\ return asm ("mov.u32 \t%[r], %tid.x;"
|
\\ return asm ("mov.u32 \t%[r], %tid.x;"
|
||||||
\\ : [r] "=r" (-> u32),
|
\\ : [r] "=r" (-> u32),
|
||||||
@ -37,9 +37,9 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var case = addPtx(ctx, "nvptx: address spaces");
|
var case = addPtx(ctx, "address spaces");
|
||||||
|
|
||||||
case.compiles(
|
case.addCompile(
|
||||||
\\var x: i32 addrspace(.global) = 0;
|
\\var x: i32 addrspace(.global) = 0;
|
||||||
\\
|
\\
|
||||||
\\pub export fn increment(out: *i32) callconv(.PtxKernel) void {
|
\\pub export fn increment(out: *i32) callconv(.PtxKernel) void {
|
||||||
@ -50,8 +50,8 @@ pub fn addCases(ctx: *TestContext) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
var case = addPtx(ctx, "nvptx: reduce in shared mem");
|
var case = addPtx(ctx, "reduce in shared mem");
|
||||||
case.compiles(
|
case.addCompile(
|
||||||
\\fn threadIdX() u32 {
|
\\fn threadIdX() u32 {
|
||||||
\\ return asm ("mov.u32 \t%[r], %tid.x;"
|
\\ return asm ("mov.u32 \t%[r], %tid.x;"
|
||||||
\\ : [r] "=r" (-> u32),
|
\\ : [r] "=r" (-> u32),
|
||||||
@ -88,16 +88,15 @@ const nvptx_target = std.zig.CrossTarget{
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub fn addPtx(
|
pub fn addPtx(
|
||||||
ctx: *TestContext,
|
ctx: *Cases,
|
||||||
name: []const u8,
|
name: []const u8,
|
||||||
) *TestContext.Case {
|
) *Cases.Case {
|
||||||
ctx.cases.append(TestContext.Case{
|
ctx.cases.append(.{
|
||||||
.name = name,
|
.name = name,
|
||||||
.target = nvptx_target,
|
.target = nvptx_target,
|
||||||
.updates = std.ArrayList(TestContext.Update).init(ctx.cases.allocator),
|
.updates = std.ArrayList(Cases.Update).init(ctx.cases.allocator),
|
||||||
.output_mode = .Obj,
|
.output_mode = .Obj,
|
||||||
.files = std.ArrayList(TestContext.File).init(ctx.cases.allocator),
|
.deps = std.ArrayList(Cases.DepModule).init(ctx.cases.allocator),
|
||||||
.deps = std.ArrayList(TestContext.DepModule).init(ctx.cases.allocator),
|
|
||||||
.link_libc = false,
|
.link_libc = false,
|
||||||
.backend = .llvm,
|
.backend = .llvm,
|
||||||
// Bug in Debug mode
|
// Bug in Debug mode
|
||||||
1587
test/src/Cases.zig
Normal file
1587
test/src/Cases.zig
Normal file
File diff suppressed because it is too large
Load Diff
@ -1055,3 +1055,30 @@ pub fn addCAbiTests(b: *std.Build, skip_non_native: bool, skip_release: bool) *S
|
|||||||
}
|
}
|
||||||
return step;
|
return step;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn addCases(
|
||||||
|
b: *std.Build,
|
||||||
|
parent_step: *Step,
|
||||||
|
opt_test_filter: ?[]const u8,
|
||||||
|
check_case_exe: *std.Build.CompileStep,
|
||||||
|
) !void {
|
||||||
|
const arena = b.allocator;
|
||||||
|
const gpa = b.allocator;
|
||||||
|
|
||||||
|
var cases = @import("src/Cases.zig").init(gpa, arena);
|
||||||
|
|
||||||
|
var dir = try b.build_root.handle.openIterableDir("test/cases", .{});
|
||||||
|
defer dir.close();
|
||||||
|
|
||||||
|
cases.addFromDir(dir);
|
||||||
|
try @import("cases.zig").addCases(&cases);
|
||||||
|
|
||||||
|
const cases_dir_path = try b.build_root.join(b.allocator, &.{ "test", "cases" });
|
||||||
|
cases.lowerToBuildSteps(
|
||||||
|
b,
|
||||||
|
parent_step,
|
||||||
|
opt_test_filter,
|
||||||
|
cases_dir_path,
|
||||||
|
check_case_exe,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user