diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs b/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs index 1eb90b92ade..46e1c487232 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/intrinsics.rs @@ -542,7 +542,7 @@ impl Interpreter<'_, W> { let mut slice_elements = slice.elements.borrow().to_vec(); let element_types = slice.element_types.clone(); - if slice_elements.is_empty() { + if slice_elements.is_empty() || length == 0 { let instruction = "slice_pop_back"; return Err(InterpreterError::PoppedFromEmptySlice { slice: args[1], instruction }); } @@ -566,7 +566,7 @@ impl Interpreter<'_, W> { let mut slice_elements = slice.elements.borrow().to_vec(); let element_types = slice.element_types.clone(); - if slice_elements.is_empty() { + if slice_elements.is_empty() || length == 0 { let instruction = "slice_pop_front"; return Err(InterpreterError::PoppedFromEmptySlice { slice: args[1], instruction }); } diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinsics.rs b/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinsics.rs index f6901d5796b..1fa024f0684 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinsics.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/tests/intrinsics.rs @@ -1,5 +1,6 @@ use crate::ssa::interpreter::{ - tests::{expect_printed_output, expect_value}, + errors::InterpreterError, + tests::{expect_error, expect_printed_output, expect_value}, value::{NumericValue, Value}, }; @@ -156,3 +157,26 @@ fn print_lambda() { < Field>> "); } + +#[test] +fn slice_pop_from_empty() { + // Initial SSA of the following program: + // fn main() -> pub Field { + // let s: [Field] = &[0]; + // let (s, _) = s.pop_back(); + // let (_, f) = s.pop_back(); + // f + // } + let err = expect_error( + " + acir(inline) fn main f0 { + b0(): + v1 = make_array [Field 0] : [Field] // src/main.nr:2:24 + v4 = unchecked_sub u32 0, u32 1 + v6, v7, v8 = call slice_pop_back(u32 0, v1) -> (u32, [Field], Field) // src/main.nr:4:18 + return v8 + } + ", + ); + assert!(matches!(err, InterpreterError::PoppedFromEmptySlice { .. })); +}