zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8ee0cbe50a61cdd9495a1276a6adee9955681ecc (tree)
parent 570ed7b3bf331c95d151a052b1c3117a502127f7
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Wed, 21 Apr 2021 19:49:58 -0700

AstGen: fix switch result location elision

It was eliding wrong instructions for nested break from labeled block

Diffstat:
Msrc/AstGen.zig | 17++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/AstGen.zig b/src/AstGen.zig @@ -5179,7 +5179,9 @@ fn switchExpr( } extra_index += body_len - 2; const store_inst = scalar_cases_payload.items[extra_index]; - if (zir_tags[store_inst] != .store_to_block_ptr) { + if (zir_tags[store_inst] != .store_to_block_ptr or + zir_datas[store_inst].bin.lhs != block_scope.rl_ptr) + { extra_index += 2; astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]); break :special_prong; @@ -5220,7 +5222,9 @@ fn switchExpr( } extra_index += body_len - 2; const store_inst = scalar_cases_payload.items[extra_index]; - if (zir_tags[store_inst] != .store_to_block_ptr) { + if (zir_tags[store_inst] != .store_to_block_ptr or + zir_datas[store_inst].bin.lhs != block_scope.rl_ptr) + { extra_index += 2; astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]); continue; @@ -5236,15 +5240,12 @@ fn switchExpr( .rhs = zir_datas[break_inst].@"break".operand, }; zir_datas[break_inst].@"break".operand = parent_gz.indexToRef(store_inst); - } else if (zir_datas[store_inst].bin.lhs == block_scope.rl_ptr) { + } else { scalar_cases_payload.items[body_len_index] -= 1; astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]); extra_index += 1; astgen.extra.appendAssumeCapacity(scalar_cases_payload.items[extra_index]); extra_index += 1; - } else { - extra_index += 2; - astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]); } } extra_index = 0; @@ -5267,7 +5268,9 @@ fn switchExpr( } extra_index += body_len - 2; const store_inst = multi_cases_payload.items[extra_index]; - if (zir_tags[store_inst] != .store_to_block_ptr) { + if (zir_tags[store_inst] != .store_to_block_ptr or + zir_datas[store_inst].bin.lhs != block_scope.rl_ptr) + { extra_index += 2; astgen.extra.appendSliceAssumeCapacity(multi_cases_payload.items[start_index..extra_index]); continue;