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(...@@ -5179,7 +5179,9 @@ fn switchExpr(
5179 }5179 }
5180 extra_index += body_len - 2;5180 extra_index += body_len - 2;
5181 const store_inst = scalar_cases_payload.items[extra_index];5181 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 {
5183 extra_index += 2;5185 extra_index += 2;
5184 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);5186 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[0..extra_index]);
5185 break :special_prong;5187 break :special_prong;
...@@ -5220,7 +5222,9 @@ fn switchExpr(...@@ -5220,7 +5222,9 @@ fn switchExpr(
5220 }5222 }
5221 extra_index += body_len - 2;5223 extra_index += body_len - 2;
5222 const store_inst = scalar_cases_payload.items[extra_index];5224 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 {
5224 extra_index += 2;5228 extra_index += 2;
5225 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);5229 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);
5226 continue;5230 continue;
...@@ -5236,15 +5240,12 @@ fn switchExpr(...@@ -5236,15 +5240,12 @@ fn switchExpr(
5236 .rhs = zir_datas[break_inst].@"break".operand,5240 .rhs = zir_datas[break_inst].@"break".operand,
5237 };5241 };
5238 zir_datas[break_inst].@"break".operand = parent_gz.indexToRef(store_inst);5242 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 {
5240 scalar_cases_payload.items[body_len_index] -= 1;5244 scalar_cases_payload.items[body_len_index] -= 1;
5241 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);5245 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);
5242 extra_index += 1;5246 extra_index += 1;
5243 astgen.extra.appendAssumeCapacity(scalar_cases_payload.items[extra_index]);5247 astgen.extra.appendAssumeCapacity(scalar_cases_payload.items[extra_index]);
5244 extra_index += 1;5248 extra_index += 1;
5245 } else {
5246 extra_index += 2;
5247 astgen.extra.appendSliceAssumeCapacity(scalar_cases_payload.items[start_index..extra_index]);
5248 }5249 }
5249 }5250 }
5250 extra_index = 0;5251 extra_index = 0;
...@@ -5267,7 +5268,9 @@ fn switchExpr(...@@ -5267,7 +5268,9 @@ fn switchExpr(
5267 }5268 }
5268 extra_index += body_len - 2;5269 extra_index += body_len - 2;
5269 const store_inst = multi_cases_payload.items[extra_index];5270 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 {
5271 extra_index += 2;5274 extra_index += 2;
5272 astgen.extra.appendSliceAssumeCapacity(multi_cases_payload.items[start_index..extra_index]);5275 astgen.extra.appendSliceAssumeCapacity(multi_cases_payload.items[start_index..extra_index]);
5273 continue;5276 continue;