behavior: add test coverage for corrupted slice in release
Closes #7325
This commit is contained in:
@@ -68,6 +68,7 @@ test {
|
||||
_ = @import("behavior/bugs/7003.zig");
|
||||
_ = @import("behavior/bugs/7047.zig");
|
||||
_ = @import("behavior/bugs/7187.zig");
|
||||
_ = @import("behavior/bugs/7325.zig");
|
||||
_ = @import("behavior/bugs/9584.zig");
|
||||
_ = @import("behavior/bugs/10138.zig");
|
||||
_ = @import("behavior/bugs/10147.zig");
|
||||
|
||||
113
test/behavior/bugs/7325.zig
Normal file
113
test/behavior/bugs/7325.zig
Normal file
@@ -0,0 +1,113 @@
|
||||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const testing = std.testing;
|
||||
|
||||
const string = "hello world";
|
||||
|
||||
const TempRef = struct {
|
||||
index: usize,
|
||||
is_weak: bool,
|
||||
};
|
||||
|
||||
const BuiltinEnum = struct {
|
||||
name: []const u8,
|
||||
};
|
||||
|
||||
const ParamType = union(enum) {
|
||||
boolean,
|
||||
buffer,
|
||||
one_of: BuiltinEnum,
|
||||
};
|
||||
|
||||
const CallArg = struct {
|
||||
value: Expression,
|
||||
};
|
||||
|
||||
const Expression = union(enum) {
|
||||
literal_boolean: bool,
|
||||
literal_enum_value: EnumLiteral,
|
||||
};
|
||||
|
||||
const EnumLiteral = struct {
|
||||
label: []const u8,
|
||||
};
|
||||
|
||||
const ExpressionResult = union(enum) {
|
||||
temp_buffer: TempRef,
|
||||
literal_boolean: bool,
|
||||
literal_enum_value: []const u8,
|
||||
};
|
||||
|
||||
fn commitCalleeParam(result: ExpressionResult, callee_param_type: ParamType) ExpressionResult {
|
||||
switch (callee_param_type) {
|
||||
.boolean => {
|
||||
return result;
|
||||
},
|
||||
.buffer => {
|
||||
return ExpressionResult{
|
||||
.temp_buffer = .{ .index = 0, .is_weak = false },
|
||||
};
|
||||
},
|
||||
.one_of => {
|
||||
return result;
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn genExpression(expr: Expression) !ExpressionResult {
|
||||
switch (expr) {
|
||||
.literal_boolean => |value| {
|
||||
return ExpressionResult{
|
||||
.literal_boolean = value,
|
||||
};
|
||||
},
|
||||
.literal_enum_value => |v| {
|
||||
try testing.expectEqualStrings(string, v.label);
|
||||
const result: ExpressionResult = .{
|
||||
.literal_enum_value = v.label,
|
||||
};
|
||||
switch (result) {
|
||||
.literal_enum_value => |w| {
|
||||
try testing.expectEqualStrings(string, w);
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
return result;
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
test {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
|
||||
var param: ParamType = .{
|
||||
.one_of = .{ .name = "name" },
|
||||
};
|
||||
var arg: CallArg = .{
|
||||
.value = .{
|
||||
.literal_enum_value = .{
|
||||
.label = string,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const result = try genExpression(arg.value);
|
||||
switch (result) {
|
||||
.literal_enum_value => |w| {
|
||||
try testing.expectEqualStrings(string, w);
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
|
||||
const derp = commitCalleeParam(result, param);
|
||||
switch (derp) {
|
||||
.literal_enum_value => |w| {
|
||||
try testing.expectEqualStrings(string, w);
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user