Switch else
All checks were successful
All checks were successful
This commit is contained in:
parent
b7aaa12f61
commit
da5d6182f3
@ -2353,6 +2353,26 @@ pub const Module = struct {
|
|||||||
while (true) {
|
while (true) {
|
||||||
module.skip_space();
|
module.skip_space();
|
||||||
|
|
||||||
|
const is_else = is_else_blk: {
|
||||||
|
var is_else = false;
|
||||||
|
if (is_identifier_start_ch(module.content[module.offset])) {
|
||||||
|
const i = module.parse_identifier();
|
||||||
|
is_else = lib.string.equal(i, "else");
|
||||||
|
if (!is_else) {
|
||||||
|
module.offset -= i.len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break :is_else_blk is_else;
|
||||||
|
};
|
||||||
|
|
||||||
|
const clause_values: []const *Value = if (is_else) b: {
|
||||||
|
module.skip_space();
|
||||||
|
|
||||||
|
module.expect_character('=');
|
||||||
|
module.expect_character('>');
|
||||||
|
break :b &.{};
|
||||||
|
} else b: {
|
||||||
var case_buffer: [64]*Value = undefined;
|
var case_buffer: [64]*Value = undefined;
|
||||||
var case_count: u64 = 0;
|
var case_count: u64 = 0;
|
||||||
|
|
||||||
@ -2371,13 +2391,15 @@ pub const Module = struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clause_values = module.arena.allocate(*Value, case_count);
|
||||||
|
@memcpy(clause_values, case_buffer[0..case_count]);
|
||||||
|
break :b clause_values;
|
||||||
|
};
|
||||||
|
|
||||||
module.skip_space();
|
module.skip_space();
|
||||||
|
|
||||||
const clause_block = module.parse_block(function);
|
const clause_block = module.parse_block(function);
|
||||||
|
|
||||||
const clause_values = module.arena.allocate(*Value, case_count);
|
|
||||||
@memcpy(clause_values, case_buffer[0..case_count]);
|
|
||||||
|
|
||||||
clause_buffer[clause_count] = .{
|
clause_buffer[clause_count] = .{
|
||||||
.values = clause_values,
|
.values = clause_values,
|
||||||
.block = clause_block,
|
.block = clause_block,
|
||||||
@ -6551,7 +6573,7 @@ pub const Module = struct {
|
|||||||
var else_clause_index: ?usize = null;
|
var else_clause_index: ?usize = null;
|
||||||
var total_discriminant_cases: u32 = 0;
|
var total_discriminant_cases: u32 = 0;
|
||||||
for (switch_statement.clauses, 0..) |*clause, clause_index| {
|
for (switch_statement.clauses, 0..) |*clause, clause_index| {
|
||||||
clause.basic_block = module.llvm.context.create_basic_block("case_block", llvm_function);
|
clause.basic_block = module.llvm.context.create_basic_block(if (clause.values.len == 0) "switch.else_case_block" else "switch.case_block", llvm_function);
|
||||||
total_discriminant_cases += @intCast(clause.values.len);
|
total_discriminant_cases += @intCast(clause.values.len);
|
||||||
if (clause.values.len == 0) {
|
if (clause.values.len == 0) {
|
||||||
if (else_clause_index != null) {
|
if (else_clause_index != null) {
|
||||||
@ -6568,7 +6590,7 @@ pub const Module = struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const else_block = if (else_clause_index) |i| switch_statement.clauses[i].basic_block else module.llvm.context.create_basic_block("else_case_block", llvm_function);
|
const else_block = if (else_clause_index) |i| switch_statement.clauses[i].basic_block else module.llvm.context.create_basic_block("switch.else_case_block", llvm_function);
|
||||||
const switch_instruction = module.llvm.builder.create_switch(switch_statement.discriminant.llvm.?, else_block, total_discriminant_cases);
|
const switch_instruction = module.llvm.builder.create_switch(switch_statement.discriminant.llvm.?, else_block, total_discriminant_cases);
|
||||||
for (switch_statement.clauses) |clause| {
|
for (switch_statement.clauses) |clause| {
|
||||||
for (clause.values) |v| {
|
for (clause.values) |v| {
|
||||||
@ -6586,10 +6608,7 @@ pub const Module = struct {
|
|||||||
|
|
||||||
current_function.exit_block = exit_block;
|
current_function.exit_block = exit_block;
|
||||||
|
|
||||||
if (else_clause_index) |i| {
|
if (else_clause_index == null) {
|
||||||
_ = i;
|
|
||||||
@trap();
|
|
||||||
} else {
|
|
||||||
module.llvm.builder.position_at_end(else_block);
|
module.llvm.builder.position_at_end(else_block);
|
||||||
_ = module.llvm.builder.create_unreachable();
|
_ = module.llvm.builder.create_unreachable();
|
||||||
module.llvm.builder.clear_insertion_position();
|
module.llvm.builder.clear_insertion_position();
|
||||||
|
22
tests/switch_else.bbb
Normal file
22
tests/switch_else.bbb
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
E = enum
|
||||||
|
{
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
c,
|
||||||
|
}
|
||||||
|
|
||||||
|
[export] main = fn [cc(c)] () s32
|
||||||
|
{
|
||||||
|
>some_enum: E = .a;
|
||||||
|
switch (some_enum)
|
||||||
|
{
|
||||||
|
.a =>
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
},
|
||||||
|
else =>
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user