mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 22:09:09 +00:00
ensure literal loading happens independently in branches
This commit is contained in:
parent
45769b9044
commit
079dd4c51e
2 changed files with 7 additions and 1 deletions
|
@ -822,7 +822,11 @@ impl<
|
||||||
.storage_manager
|
.storage_manager
|
||||||
.load_to_general_reg(&mut self.buf, cond_symbol);
|
.load_to_general_reg(&mut self.buf, cond_symbol);
|
||||||
|
|
||||||
|
// this state is updated destructively in the branches. We don't want the branches to
|
||||||
|
// influence each other, so we must clone here.
|
||||||
let mut base_storage = self.storage_manager.clone();
|
let mut base_storage = self.storage_manager.clone();
|
||||||
|
let base_literal_map = self.literal_map.clone();
|
||||||
|
|
||||||
let mut max_branch_stack_size = 0;
|
let mut max_branch_stack_size = 0;
|
||||||
let mut ret_jumps = bumpalo::vec![in self.env.arena];
|
let mut ret_jumps = bumpalo::vec![in self.env.arena];
|
||||||
let mut tmp = bumpalo::vec![in self.env.arena];
|
let mut tmp = bumpalo::vec![in self.env.arena];
|
||||||
|
@ -836,6 +840,7 @@ impl<
|
||||||
|
|
||||||
// Build all statements in this branch. Using storage as from before any branch.
|
// Build all statements in this branch. Using storage as from before any branch.
|
||||||
self.storage_manager = base_storage.clone();
|
self.storage_manager = base_storage.clone();
|
||||||
|
self.literal_map = base_literal_map.clone();
|
||||||
self.build_stmt(stmt, ret_layout);
|
self.build_stmt(stmt, ret_layout);
|
||||||
|
|
||||||
// Build unconditional jump to the end of this switch.
|
// Build unconditional jump to the end of this switch.
|
||||||
|
@ -858,6 +863,7 @@ impl<
|
||||||
base_storage.update_fn_call_stack_size(self.storage_manager.fn_call_stack_size());
|
base_storage.update_fn_call_stack_size(self.storage_manager.fn_call_stack_size());
|
||||||
}
|
}
|
||||||
self.storage_manager = base_storage;
|
self.storage_manager = base_storage;
|
||||||
|
self.literal_map = base_literal_map;
|
||||||
self.storage_manager
|
self.storage_manager
|
||||||
.update_stack_size(max_branch_stack_size);
|
.update_stack_size(max_branch_stack_size);
|
||||||
let (_branch_info, stmt) = default_branch;
|
let (_branch_info, stmt) = default_branch;
|
||||||
|
|
|
@ -1931,7 +1931,7 @@ fn match_on_result_with_uninhabited_error_branch() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
|
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
|
||||||
fn dispatch_tag_union_function_inferred() {
|
fn dispatch_tag_union_function_inferred() {
|
||||||
assert_evals_to!(
|
assert_evals_to!(
|
||||||
indoc!(
|
indoc!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue