Commit c8c32a0569

Andrew Kelley <andrew@ziglang.org>
2023-12-27 02:26:23
update stack trace tests to account for new defaults
ReleaseSafe optimization mode now defaults error tracing to false.
1 parent beed47e
Changed files (2)
test/src/StackTrace.zig
@@ -5,44 +5,33 @@ test_filter: ?[]const u8,
 optimize_modes: []const OptimizeMode,
 check_exe: *std.Build.Step.Compile,
 
-const Expect = [@typeInfo(OptimizeMode).Enum.fields.len][]const u8;
+const Config = struct {
+    name: []const u8,
+    source: []const u8,
+    Debug: ?PerMode = null,
+    ReleaseSmall: ?PerMode = null,
+    ReleaseSafe: ?PerMode = null,
+    ReleaseFast: ?PerMode = null,
 
-pub fn addCase(self: *StackTrace, config: anytype) void {
-    if (@hasField(@TypeOf(config), "exclude")) {
-        if (config.exclude.exclude()) return;
-    }
-    if (@hasField(@TypeOf(config), "exclude_arch")) {
-        const exclude_arch: []const std.Target.Cpu.Arch = &config.exclude_arch;
-        for (exclude_arch) |arch| if (arch == builtin.cpu.arch) return;
-    }
-    if (@hasField(@TypeOf(config), "exclude_os")) {
-        const exclude_os: []const std.Target.Os.Tag = &config.exclude_os;
-        for (exclude_os) |os| if (os == builtin.os.tag) return;
-    }
-    for (self.optimize_modes) |optimize_mode| {
-        switch (optimize_mode) {
-            .Debug => {
-                if (@hasField(@TypeOf(config), "Debug")) {
-                    self.addExpect(config.name, config.source, optimize_mode, config.Debug);
-                }
-            },
-            .ReleaseSafe => {
-                if (@hasField(@TypeOf(config), "ReleaseSafe")) {
-                    self.addExpect(config.name, config.source, optimize_mode, config.ReleaseSafe);
-                }
-            },
-            .ReleaseFast => {
-                if (@hasField(@TypeOf(config), "ReleaseFast")) {
-                    self.addExpect(config.name, config.source, optimize_mode, config.ReleaseFast);
-                }
-            },
-            .ReleaseSmall => {
-                if (@hasField(@TypeOf(config), "ReleaseSmall")) {
-                    self.addExpect(config.name, config.source, optimize_mode, config.ReleaseSmall);
-                }
-            },
-        }
-    }
+    const PerMode = struct {
+        expect: []const u8,
+        exclude_os: []const std.Target.Os.Tag = &.{},
+        error_tracing: ?bool = null,
+    };
+};
+
+pub fn addCase(self: *StackTrace, config: Config) void {
+    if (config.Debug) |per_mode|
+        self.addExpect(config.name, config.source, .Debug, per_mode);
+
+    if (config.ReleaseSmall) |per_mode|
+        self.addExpect(config.name, config.source, .ReleaseSmall, per_mode);
+
+    if (config.ReleaseFast) |per_mode|
+        self.addExpect(config.name, config.source, .ReleaseFast, per_mode);
+
+    if (config.ReleaseSafe) |per_mode|
+        self.addExpect(config.name, config.source, .ReleaseSafe, per_mode);
 }
 
 fn addExpect(
@@ -50,19 +39,9 @@ fn addExpect(
     name: []const u8,
     source: []const u8,
     optimize_mode: OptimizeMode,
-    mode_config: anytype,
+    mode_config: Config.PerMode,
 ) void {
-    if (@hasField(@TypeOf(mode_config), "exclude")) {
-        if (mode_config.exclude.exclude()) return;
-    }
-    if (@hasField(@TypeOf(mode_config), "exclude_arch")) {
-        const exclude_arch: []const std.Target.Cpu.Arch = &mode_config.exclude_arch;
-        for (exclude_arch) |arch| if (arch == builtin.cpu.arch) return;
-    }
-    if (@hasField(@TypeOf(mode_config), "exclude_os")) {
-        const exclude_os: []const std.Target.Os.Tag = &mode_config.exclude_os;
-        for (exclude_os) |os| if (os == builtin.os.tag) return;
-    }
+    for (mode_config.exclude_os) |tag| if (tag == builtin.os.tag) return;
 
     const b = self.b;
     const annotated_case_name = fmt.allocPrint(b.allocator, "check {s} ({s})", .{
@@ -78,6 +57,7 @@ fn addExpect(
         .root_source_file = write_src.files.items[0].getPath(),
         .optimize = optimize_mode,
         .target = b.host,
+        .error_tracing = mode_config.error_tracing,
     });
 
     const run = b.addRunArtifact(exe);
test/stack_traces.zig
@@ -20,7 +20,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -31,6 +31,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -70,7 +71,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
             },
             .expect =
@@ -83,6 +84,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -125,7 +127,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -136,6 +138,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -176,7 +179,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -187,6 +190,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -230,7 +234,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -244,6 +248,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -286,7 +291,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -297,6 +302,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -336,7 +342,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -350,6 +356,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -391,7 +398,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -402,6 +409,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -461,7 +469,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
                 .linux, // defeated by aggressive inlining
             },
@@ -478,6 +486,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -531,7 +540,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
             },
             .expect =
@@ -547,6 +556,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -595,7 +605,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
             },
             .expect =
@@ -611,6 +621,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\        ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -659,7 +670,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
             },
             .expect =
@@ -675,6 +686,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\        ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -728,7 +740,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             ,
         },
         .ReleaseSafe = .{
-            .exclude_os = .{
+            .exclude_os = &.{
                 .windows, // TODO
             },
             .expect =
@@ -747,6 +759,7 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
             \\    ^
             \\
             ,
+            .error_tracing = true,
         },
         .ReleaseFast = .{
             .expect =
@@ -763,10 +776,6 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
     });
 
     cases.addCase(.{
-        .exclude_os = .{
-            .openbsd, // integer overflow
-            .windows, // TODO intermittent failures
-        },
         .name = "dumpCurrentStackTrace",
         .source =
         \\const std = @import("std");
@@ -783,6 +792,10 @@ pub fn addCases(cases: *tests.StackTracesContext) void {
         \\}
         ,
         .Debug = .{
+            .exclude_os = &.{
+                .openbsd, // integer overflow
+                .windows, // TODO intermittent failures
+            },
             .expect =
             \\source.zig:7:8: [address] in foo (test)
             \\    bar();