diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/cases/compile_errors/bad_panic_call_signature.zig | 45 | ||||
| -rw-r--r-- | test/cases/compile_errors/bad_panic_generic_signature.zig | 41 | ||||
| -rw-r--r-- | test/cases/compile_errors/bad_panic_signature.zig | 28 | ||||
| -rw-r--r-- | test/incremental/change_panic_handler | 36 | ||||
| -rw-r--r-- | test/incremental/change_panic_handler_explicit | 141 | ||||
| -rw-r--r-- | test/src/Cases.zig | 1 |
6 files changed, 233 insertions, 59 deletions
diff --git a/test/cases/compile_errors/bad_panic_call_signature.zig b/test/cases/compile_errors/bad_panic_call_signature.zig new file mode 100644 index 0000000000..b383ccf651 --- /dev/null +++ b/test/cases/compile_errors/bad_panic_call_signature.zig @@ -0,0 +1,45 @@ +const simple_panic = std.debug.simple_panic; +pub const panic = struct { + pub fn call(msg: []const u8, bad: usize) noreturn { + _ = msg; + _ = bad; + @trap(); + } + pub const sentinelMismatch = simple_panic.sentinelMismatch; + pub const unwrapError = simple_panic.unwrapError; + pub const outOfBounds = simple_panic.outOfBounds; + pub const startGreaterThanEnd = simple_panic.startGreaterThanEnd; + pub const inactiveUnionField = simple_panic.inactiveUnionField; + pub const reachedUnreachable = simple_panic.reachedUnreachable; + pub const unwrapNull = simple_panic.unwrapNull; + pub const castToNull = simple_panic.castToNull; + pub const incorrectAlignment = simple_panic.incorrectAlignment; + pub const invalidErrorCode = simple_panic.invalidErrorCode; + pub const castTruncatedData = simple_panic.castTruncatedData; + pub const negativeToUnsigned = simple_panic.negativeToUnsigned; + pub const integerOverflow = simple_panic.integerOverflow; + pub const shlOverflow = simple_panic.shlOverflow; + pub const shrOverflow = simple_panic.shrOverflow; + pub const divideByZero = simple_panic.divideByZero; + pub const exactDivisionRemainder = simple_panic.exactDivisionRemainder; + pub const integerPartOutOfBounds = simple_panic.integerPartOutOfBounds; + pub const corruptSwitch = simple_panic.corruptSwitch; + pub const shiftRhsTooBig = simple_panic.shiftRhsTooBig; + pub const invalidEnumValue = simple_panic.invalidEnumValue; + pub const forLenMismatch = simple_panic.forLenMismatch; + pub const memcpyLenMismatch = simple_panic.memcpyLenMismatch; + pub const memcpyAlias = simple_panic.memcpyAlias; + pub const noreturnReturned = simple_panic.noreturnReturned; +}; + +export fn foo(a: u8) void { + @setRuntimeSafety(true); + _ = a + 1; // safety check to reference the panic handler +} + +const std = @import("std"); + +// error +// +// :3:9: error: expected type 'fn ([]const u8, ?usize) noreturn', found 'fn ([]const u8, usize) noreturn' +// :3:9: note: parameter 1 'usize' cannot cast into '?usize' diff --git a/test/cases/compile_errors/bad_panic_generic_signature.zig b/test/cases/compile_errors/bad_panic_generic_signature.zig new file mode 100644 index 0000000000..92fa49c7f3 --- /dev/null +++ b/test/cases/compile_errors/bad_panic_generic_signature.zig @@ -0,0 +1,41 @@ +const simple_panic = std.debug.simple_panic; +pub const panic = struct { + pub fn sentinelMismatch() void {} // invalid + pub const call = simple_panic.call; + pub const unwrapError = simple_panic.unwrapError; + pub const outOfBounds = simple_panic.outOfBounds; + pub const startGreaterThanEnd = simple_panic.startGreaterThanEnd; + pub const inactiveUnionField = simple_panic.inactiveUnionField; + pub const reachedUnreachable = simple_panic.reachedUnreachable; + pub const unwrapNull = simple_panic.unwrapNull; + pub const castToNull = simple_panic.castToNull; + pub const incorrectAlignment = simple_panic.incorrectAlignment; + pub const invalidErrorCode = simple_panic.invalidErrorCode; + pub const castTruncatedData = simple_panic.castTruncatedData; + pub const negativeToUnsigned = simple_panic.negativeToUnsigned; + pub const integerOverflow = simple_panic.integerOverflow; + pub const shlOverflow = simple_panic.shlOverflow; + pub const shrOverflow = simple_panic.shrOverflow; + pub const divideByZero = simple_panic.divideByZero; + pub const exactDivisionRemainder = simple_panic.exactDivisionRemainder; + pub const integerPartOutOfBounds = simple_panic.integerPartOutOfBounds; + pub const corruptSwitch = simple_panic.corruptSwitch; + pub const shiftRhsTooBig = simple_panic.shiftRhsTooBig; + pub const invalidEnumValue = simple_panic.invalidEnumValue; + pub const forLenMismatch = simple_panic.forLenMismatch; + pub const memcpyLenMismatch = simple_panic.memcpyLenMismatch; + pub const memcpyAlias = simple_panic.memcpyAlias; + pub const noreturnReturned = simple_panic.noreturnReturned; +}; + +export fn foo(arr: *const [2]u8) void { + @setRuntimeSafety(true); + _ = arr[0..1 :0]; +} + +const std = @import("std"); + +// error +// +// :3:9: error: expected type 'fn (anytype, anytype) noreturn', found 'fn () void' +// :3:9: note: non-generic function cannot cast into a generic function diff --git a/test/cases/compile_errors/bad_panic_signature.zig b/test/cases/compile_errors/bad_panic_signature.zig deleted file mode 100644 index f9a30ef1d7..0000000000 --- a/test/cases/compile_errors/bad_panic_signature.zig +++ /dev/null @@ -1,28 +0,0 @@ -pub const Panic = struct { - pub const call = badPanicSignature; - pub const sentinelMismatch = std.debug.FormattedPanic.sentinelMismatch; - pub const unwrapError = std.debug.FormattedPanic.unwrapError; - pub const outOfBounds = std.debug.FormattedPanic.outOfBounds; - pub const startGreaterThanEnd = std.debug.FormattedPanic.startGreaterThanEnd; - pub const inactiveUnionField = std.debug.FormattedPanic.inactiveUnionField; - pub const messages = std.debug.FormattedPanic.messages; -}; - -fn badPanicSignature(msg: []const u8, bad1: usize, bad2: void) noreturn { - _ = msg; - _ = bad1; - _ = bad2; - @trap(); -} - -export fn foo(a: u8) void { - @setRuntimeSafety(true); - _ = a + 1; // safety check to reference the panic handler -} - -const std = @import("std"); - -// error -// -// :2:9: error: expected type 'fn ([]const u8, ?*builtin.StackTrace, ?usize) noreturn', found 'fn ([]const u8, usize, void) noreturn' -// :2:9: note: parameter 1 'usize' cannot cast into '?*builtin.StackTrace' diff --git a/test/incremental/change_panic_handler b/test/incremental/change_panic_handler index bab6eab793..34a1f32dab 100644 --- a/test/incremental/change_panic_handler +++ b/test/incremental/change_panic_handler @@ -9,16 +9,8 @@ pub fn main() !u8 { _ = a + 1; return 1; } -pub const Panic = struct { - pub const call = myPanic; - pub const sentinelMismatch = std.debug.FormattedPanic.sentinelMismatch; - pub const unwrapError = std.debug.FormattedPanic.unwrapError; - pub const outOfBounds = std.debug.FormattedPanic.outOfBounds; - pub const startGreaterThanEnd = std.debug.FormattedPanic.startGreaterThanEnd; - pub const inactiveUnionField = std.debug.FormattedPanic.inactiveUnionField; - pub const messages = std.debug.FormattedPanic.messages; -}; -fn myPanic(msg: []const u8, _: ?*std.builtin.StackTrace, _: ?usize) noreturn { +pub const panic = std.debug.FullPanic(myPanic); +fn myPanic(msg: []const u8, _: ?usize) noreturn { std.io.getStdOut().writer().print("panic message: {s}\n", .{msg}) catch {}; std.process.exit(0); } @@ -33,16 +25,8 @@ pub fn main() !u8 { _ = a + 1; return 1; } -pub const Panic = struct { - pub const call = myPanic; - pub const sentinelMismatch = std.debug.FormattedPanic.sentinelMismatch; - pub const unwrapError = std.debug.FormattedPanic.unwrapError; - pub const outOfBounds = std.debug.FormattedPanic.outOfBounds; - pub const startGreaterThanEnd = std.debug.FormattedPanic.startGreaterThanEnd; - pub const inactiveUnionField = std.debug.FormattedPanic.inactiveUnionField; - pub const messages = std.debug.FormattedPanic.messages; -}; -fn myPanic(msg: []const u8, _: ?*std.builtin.StackTrace, _: ?usize) noreturn { +pub const panic = std.debug.FullPanic(myPanic); +fn myPanic(msg: []const u8, _: ?usize) noreturn { std.io.getStdOut().writer().print("new panic message: {s}\n", .{msg}) catch {}; std.process.exit(0); } @@ -57,16 +41,8 @@ pub fn main() !u8 { _ = a + 1; return 1; } -pub const Panic = struct { - pub const call = myPanicNew; - pub const sentinelMismatch = std.debug.FormattedPanic.sentinelMismatch; - pub const unwrapError = std.debug.FormattedPanic.unwrapError; - pub const outOfBounds = std.debug.FormattedPanic.outOfBounds; - pub const startGreaterThanEnd = std.debug.FormattedPanic.startGreaterThanEnd; - pub const inactiveUnionField = std.debug.FormattedPanic.inactiveUnionField; - pub const messages = std.debug.FormattedPanic.messages; -}; -fn myPanicNew(msg: []const u8, _: ?*std.builtin.StackTrace, _: ?usize) noreturn { +pub const panic = std.debug.FullPanic(myPanicNew); +fn myPanicNew(msg: []const u8, _: ?usize) noreturn { std.io.getStdOut().writer().print("third panic message: {s}\n", .{msg}) catch {}; std.process.exit(0); } diff --git a/test/incremental/change_panic_handler_explicit b/test/incremental/change_panic_handler_explicit new file mode 100644 index 0000000000..5739c46c1b --- /dev/null +++ b/test/incremental/change_panic_handler_explicit @@ -0,0 +1,141 @@ +#target=x86_64-linux-selfhosted +#target=x86_64-linux-cbe +#target=x86_64-windows-cbe +#update=initial version +#file=main.zig +pub fn main() !u8 { + var a: u8 = undefined; + a = 255; + _ = a + 1; + return 1; +} +const no_panic = std.debug.no_panic; +pub const panic = struct { + pub const call = myPanic; + pub fn integerOverflow() noreturn { + @panic("integer overflow"); + } + pub const sentinelMismatch = no_panic.sentinelMismatch; + pub const unwrapError = no_panic.unwrapError; + pub const outOfBounds = no_panic.outOfBounds; + pub const startGreaterThanEnd = no_panic.startGreaterThanEnd; + pub const inactiveUnionField = no_panic.inactiveUnionField; + pub const reachedUnreachable = no_panic.reachedUnreachable; + pub const unwrapNull = no_panic.unwrapNull; + pub const castToNull = no_panic.castToNull; + pub const incorrectAlignment = no_panic.incorrectAlignment; + pub const invalidErrorCode = no_panic.invalidErrorCode; + pub const castTruncatedData = no_panic.castTruncatedData; + pub const negativeToUnsigned = no_panic.negativeToUnsigned; + pub const shlOverflow = no_panic.shlOverflow; + pub const shrOverflow = no_panic.shrOverflow; + pub const divideByZero = no_panic.divideByZero; + pub const exactDivisionRemainder = no_panic.exactDivisionRemainder; + pub const integerPartOutOfBounds = no_panic.integerPartOutOfBounds; + pub const corruptSwitch = no_panic.corruptSwitch; + pub const shiftRhsTooBig = no_panic.shiftRhsTooBig; + pub const invalidEnumValue = no_panic.invalidEnumValue; + pub const forLenMismatch = no_panic.forLenMismatch; + pub const memcpyLenMismatch = no_panic.memcpyLenMismatch; + pub const memcpyAlias = no_panic.memcpyAlias; + pub const noreturnReturned = no_panic.noreturnReturned; +}; +fn myPanic(msg: []const u8, _: ?usize) noreturn { + std.io.getStdOut().writer().print("panic message: {s}\n", .{msg}) catch {}; + std.process.exit(0); +} +const std = @import("std"); +#expect_stdout="panic message: integer overflow\n" + +#update=change the panic handler body +#file=main.zig +pub fn main() !u8 { + var a: u8 = undefined; + a = 255; + _ = a + 1; + return 1; +} +const no_panic = std.debug.no_panic; +pub const panic = struct { + pub const call = myPanic; + pub fn integerOverflow() noreturn { + @panic("integer overflow"); + } + pub const sentinelMismatch = no_panic.sentinelMismatch; + pub const unwrapError = no_panic.unwrapError; + pub const outOfBounds = no_panic.outOfBounds; + pub const startGreaterThanEnd = no_panic.startGreaterThanEnd; + pub const inactiveUnionField = no_panic.inactiveUnionField; + pub const reachedUnreachable = no_panic.reachedUnreachable; + pub const unwrapNull = no_panic.unwrapNull; + pub const castToNull = no_panic.castToNull; + pub const incorrectAlignment = no_panic.incorrectAlignment; + pub const invalidErrorCode = no_panic.invalidErrorCode; + pub const castTruncatedData = no_panic.castTruncatedData; + pub const negativeToUnsigned = no_panic.negativeToUnsigned; + pub const shlOverflow = no_panic.shlOverflow; + pub const shrOverflow = no_panic.shrOverflow; + pub const divideByZero = no_panic.divideByZero; + pub const exactDivisionRemainder = no_panic.exactDivisionRemainder; + pub const integerPartOutOfBounds = no_panic.integerPartOutOfBounds; + pub const corruptSwitch = no_panic.corruptSwitch; + pub const shiftRhsTooBig = no_panic.shiftRhsTooBig; + pub const invalidEnumValue = no_panic.invalidEnumValue; + pub const forLenMismatch = no_panic.forLenMismatch; + pub const memcpyLenMismatch = no_panic.memcpyLenMismatch; + pub const memcpyAlias = no_panic.memcpyAlias; + pub const noreturnReturned = no_panic.noreturnReturned; +}; +fn myPanic(msg: []const u8, _: ?usize) noreturn { + std.io.getStdOut().writer().print("new panic message: {s}\n", .{msg}) catch {}; + std.process.exit(0); +} +const std = @import("std"); +#expect_stdout="new panic message: integer overflow\n" + +#update=change the panic handler function value +#file=main.zig +pub fn main() !u8 { + var a: u8 = undefined; + a = 255; + _ = a + 1; + return 1; +} +const no_panic = std.debug.no_panic; +pub const panic = struct { + pub const call = myPanicNew; + pub fn integerOverflow() noreturn { + @panic("integer overflow"); + } + pub const sentinelMismatch = std.debug.no_panic.sentinelMismatch; + pub const unwrapError = std.debug.no_panic.unwrapError; + pub const outOfBounds = std.debug.no_panic.outOfBounds; + pub const startGreaterThanEnd = std.debug.no_panic.startGreaterThanEnd; + pub const inactiveUnionField = std.debug.no_panic.inactiveUnionField; + pub const messages = std.debug.no_panic.messages; + pub const reachedUnreachable = no_panic.reachedUnreachable; + pub const unwrapNull = no_panic.unwrapNull; + pub const castToNull = no_panic.castToNull; + pub const incorrectAlignment = no_panic.incorrectAlignment; + pub const invalidErrorCode = no_panic.invalidErrorCode; + pub const castTruncatedData = no_panic.castTruncatedData; + pub const negativeToUnsigned = no_panic.negativeToUnsigned; + pub const shlOverflow = no_panic.shlOverflow; + pub const shrOverflow = no_panic.shrOverflow; + pub const divideByZero = no_panic.divideByZero; + pub const exactDivisionRemainder = no_panic.exactDivisionRemainder; + pub const integerPartOutOfBounds = no_panic.integerPartOutOfBounds; + pub const corruptSwitch = no_panic.corruptSwitch; + pub const shiftRhsTooBig = no_panic.shiftRhsTooBig; + pub const invalidEnumValue = no_panic.invalidEnumValue; + pub const forLenMismatch = no_panic.forLenMismatch; + pub const memcpyLenMismatch = no_panic.memcpyLenMismatch; + pub const memcpyAlias = no_panic.memcpyAlias; + pub const noreturnReturned = no_panic.noreturnReturned; +}; +fn myPanicNew(msg: []const u8, _: ?usize) noreturn { + std.io.getStdOut().writer().print("third panic message: {s}\n", .{msg}) catch {}; + std.process.exit(0); +} +const std = @import("std"); +#expect_stdout="third panic message: integer overflow\n" diff --git a/test/src/Cases.zig b/test/src/Cases.zig index c49576b2f7..b57a476e89 100644 --- a/test/src/Cases.zig +++ b/test/src/Cases.zig @@ -358,7 +358,6 @@ pub fn addFromDir(ctx: *Cases, dir: std.fs.Dir, b: *std.Build) void { var current_file: []const u8 = "none"; ctx.addFromDirInner(dir, ¤t_file, b) catch |err| { std.debug.panicExtra( - @errorReturnTrace(), @returnAddress(), "test harness failed to process file '{s}': {s}\n", .{ current_file, @errorName(err) }, |
