Merge pull request #7592 from LemonBoy/fix-7188
Allow variable captures on multi-prong switch arms
This commit is contained in:
@@ -413,10 +413,7 @@ pub const DwarfInfo = struct {
|
||||
var this_unit_offset: u64 = 0;
|
||||
|
||||
while (this_unit_offset < try seekable.getEndPos()) {
|
||||
seekable.seekTo(this_unit_offset) catch |err| switch (err) {
|
||||
error.EndOfStream => unreachable,
|
||||
else => return err,
|
||||
};
|
||||
try seekable.seekTo(this_unit_offset);
|
||||
|
||||
var is_64: bool = undefined;
|
||||
const unit_length = try readUnitLength(in, di.endian, &is_64);
|
||||
@@ -520,10 +517,7 @@ pub const DwarfInfo = struct {
|
||||
var this_unit_offset: u64 = 0;
|
||||
|
||||
while (this_unit_offset < try seekable.getEndPos()) {
|
||||
seekable.seekTo(this_unit_offset) catch |err| switch (err) {
|
||||
error.EndOfStream => unreachable,
|
||||
else => return err,
|
||||
};
|
||||
try seekable.seekTo(this_unit_offset);
|
||||
|
||||
var is_64: bool = undefined;
|
||||
const unit_length = try readUnitLength(in, di.endian, &is_64);
|
||||
|
||||
@@ -24207,6 +24207,8 @@ static IrInstGen *ir_analyze_instruction_switch_var(IrAnalyze *ira, IrInstSrcSwi
|
||||
ref_type->data.pointer.allow_zero);
|
||||
return ir_analyze_ptr_cast(ira, &instruction->base.base, target_value_ptr,
|
||||
&instruction->target_value_ptr->base, new_target_value_ptr_type, &instruction->base.base, false, false);
|
||||
} else if (instruction->prongs_len > 1) {
|
||||
return target_value_ptr;
|
||||
} else {
|
||||
ir_add_error(ira, &instruction->base.base,
|
||||
buf_sprintf("switch on type '%s' provides no expression parameter", buf_ptr(&target_type->name)));
|
||||
|
||||
@@ -436,6 +436,26 @@ test "switch with disjoint range" {
|
||||
}
|
||||
}
|
||||
|
||||
test "switch variable for range and multiple prongs" {
|
||||
const S = struct {
|
||||
fn doTheTest() void {
|
||||
var u: u8 = 16;
|
||||
doTheSwitch(u);
|
||||
comptime doTheSwitch(u);
|
||||
var v: u8 = 42;
|
||||
doTheSwitch(v);
|
||||
comptime doTheSwitch(v);
|
||||
}
|
||||
fn doTheSwitch(q: u8) void {
|
||||
switch (q) {
|
||||
0...40 => |x| expect(x == 16),
|
||||
41, 42, 43 => |x| expect(x == 42),
|
||||
else => expect(false),
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var state: u32 = 0;
|
||||
fn poll() void {
|
||||
switch (state) {
|
||||
|
||||
@@ -742,7 +742,7 @@ test "@unionInit on union w/ tag but no fields" {
|
||||
const Data = union(Type) {
|
||||
no_op: void,
|
||||
|
||||
pub fn decode(buf: []const u8) !Data {
|
||||
pub fn decode(buf: []const u8) Data {
|
||||
return @unionInit(Data, "no_op", {});
|
||||
}
|
||||
};
|
||||
@@ -753,7 +753,7 @@ test "@unionInit on union w/ tag but no fields" {
|
||||
|
||||
fn doTheTest() void {
|
||||
var data: Data = .{ .no_op = .{} };
|
||||
var o = try Data.decode(&[_]u8{});
|
||||
var o = Data.decode(&[_]u8{});
|
||||
expectEqual(Type.no_op, o);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user