Skip to content

Commit

Permalink
fix(acir_gen): Nested dynamic array initialization (#5810)
Browse files Browse the repository at this point in the history
# Description

## Problem\*

Resolves #5782 

## Summary\*

We are using our recursive `initialize_array_inner` function to also
check whether the outer AcirValue we are trying to initialize is a
dynamic array. We should be able to initialize a new AcirValue::Array
with internal AcirValue::DynamicArray types.

## Additional Context



## Documentation\*

Check one:
- [X] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[For Experimental Features]** Documentation to be submitted in a
separate PR.

# PR Checklist\*

- [X] I have tested the changes locally.
- [X] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
vezenovm authored Aug 23, 2024
1 parent 335de05 commit 4df53ad
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 2 deletions.
15 changes: 13 additions & 2 deletions compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1933,6 +1933,9 @@ impl<F: AcirField> AcirContext<F> {
}
Some(optional_value) => {
let mut values = Vec::new();
if let AcirValue::DynamicArray(_) = optional_value {
unreachable!("Dynamic array should already be initialized");
}
self.initialize_array_inner(&mut values, optional_value)?;
values
}
Expand Down Expand Up @@ -1962,8 +1965,16 @@ impl<F: AcirField> AcirContext<F> {
self.initialize_array_inner(witnesses, value)?;
}
}
AcirValue::DynamicArray(_) => {
unreachable!("Dynamic array should already be initialized");
AcirValue::DynamicArray(AcirDynamicArray { block_id, len, .. }) => {
let dynamic_array_values = try_vecmap(0..len, |i| {
let index_var = self.add_constant(i);

let read = self.read_from_memory(block_id, &index_var)?;
Ok::<AcirValue, InternalError>(AcirValue::Var(read, AcirType::field()))
})?;
for value in dynamic_array_values {
self.initialize_array_inner(witnesses, value)?;
}
}
}
Ok(())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[package]
name = "nested_dyn_array_regression_5782"
type = "bin"
authors = [""]
compiler_version = ">=0.33.0"

[dependencies]
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
array = [5, 10]
i = 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
fn main(mut array: [Field; 2], i: u32) {
assert_eq(array[i - 1], 5);
assert_eq(array[i], 10);

array[i] = 2;

let array2 = [array, array];

assert_eq(array2[0][0], 5);
assert_eq(array2[0][i], 2);
assert_eq(array2[i][0], 5);
assert_eq(array2[i][i], 2);
}

0 comments on commit 4df53ad

Please sign in to comment.