authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-21 19:49:58-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-21 19:49:58-07:00
log8ee0cbe50a61cdd9495a1276a6adee9955681ecc
tree3c3cd1d4bdca7def0ca55fcd667fcc95764feb19
parent570ed7b3bf331c95d151a052b1c3117a502127f7

AstGen: fix switch result location elision

It was eliding wrong instructions for nested break from labeled block

1 files changed, 10 insertions(+), 7 deletions(-)

src/AstGen.zig+10-7
......@@ -5179,7 +5179,9 @@ fn switchExpr(
51795179 }
51805180 extra_index += body_len - 2;
51815181 const store_inst = scalar_cases_payload.items[extra_index];
5182 if (zir_tags[store_inst] != .store_to_block_ptr) {
5182 if (zir_tags[store_inst] != .store_to_block_ptr or
5183 zir_datas[store_inst].bin.lhs != block_scope.rl_ptr)
5184 {
51835185 extra_index += 2;
51845186 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
51855187 break :special_prong;
......@@ -5220,7 +5222,9 @@ fn switchExpr(
52205222 }
52215223 extra_index += body_len - 2;
52225224 const store_inst = scalar_cases_payload.items[extra_index];
5223 if (zir_tags[store_inst] != .store_to_block_ptr) {
5225 if (zir_tags[store_inst] != .store_to_block_ptr or
5226 zir_datas[store_inst].bin.lhs != block_scope.rl_ptr)
5227 {
52245228 extra_index += 2;
52255229 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);
52265230 continue;
......@@ -5236,15 +5240,12 @@ fn switchExpr(
52365240 .rhs = zir_datas[break_inst].@"break".operand,
52375241 };
52385242 zir_datas[break_inst].@"break".operand = parent_gz.indexToRef(store_inst);
5239 } else if (zir_datas[store_inst].bin.lhs == block_scope.rl_ptr) {
5243 } else {
52405244 scalar_cases_payload.items[body_len_index] -= 1;
52415245 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);
52425246 extra_index += 1;
52435247 astgen.extra.appendAssumeCapacity(scalar_cases_payload.items[extra_index]);
52445248 extra_index += 1;
5245 } else {
5246 extra_index += 2;
5247 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);
52485249 }
52495250 }
52505251 extra_index = 0;
......@@ -5267,7 +5268,9 @@ fn switchExpr(
52675268 }
52685269 extra_index += body_len - 2;
52695270 const store_inst = multi_cases_payload.items[extra_index];
5270 if (zir_tags[store_inst] != .store_to_block_ptr) {
5271 if (zir_tags[store_inst] != .store_to_block_ptr or
5272 zir_datas[store_inst].bin.lhs != block_scope.rl_ptr)
5273 {
52715274 extra_index += 2;
52725275 astgen.extra.appendSliceAssumeCapacity(multi_cases_payload.items[start_index..extra_index]);
52735276 continue;