diff --git a/crates/nargo/tests/test_data/merkle_insert/src/main.nr b/crates/nargo/tests/test_data/merkle_insert/src/main.nr index 6078bef79d6..a821ae800c9 100644 --- a/crates/nargo/tests/test_data/merkle_insert/src/main.nr +++ b/crates/nargo/tests/test_data/merkle_insert/src/main.nr @@ -16,6 +16,8 @@ fn main( constrain new_leaf_exists == 1; let h = std::hash::mimc_bn254(mimc_input); + // Regression test for PR #891 + std::println(h); constrain h == 18226366069841799622585958305961373004333097209608110160936134895615261821931; } diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs index a679840d32c..845cec2924c 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs @@ -289,18 +289,25 @@ fn evaluate_println( log_string = format_field_string(field); } None => { - let var = var_cache.get(&node_id).unwrap_or_else(|| { - panic!( - "invalid input for print statement: {:?}", - ctx.try_get_node(node_id).expect("node is missing from SSA") - ) - }); + let mut var = var_cache + .get(&node_id) + .unwrap_or_else(|| { + panic!( + "invalid input for print statement: {:?}", + ctx.try_get_node(node_id).expect("node is missing from SSA") + ) + }) + .clone(); if let Some(field) = var.to_const() { log_string = format_field_string(field); - } else if let Some(w) = var.cached_witness() { - log_witnesses.push(*w); + } else if let Some(w) = var.get_or_compute_witness(evaluator, false) { + // We check whether there has already been a cached witness for this node. If not, we generate a new witness and include it in the logs + // TODO we need a witness because of the directive, but we should use an expression + log_witnesses.push(w); } else { - unreachable!("array element to be logged is missing a witness"); + unreachable!( + "a witness should have been computed for the non-constant expression" + ); } } },