diff --git a/tooling/nargo_cli/src/cli/execute_cmd.rs b/tooling/nargo_cli/src/cli/execute_cmd.rs index 7f97d06bc5f..b139d206deb 100644 --- a/tooling/nargo_cli/src/cli/execute_cmd.rs +++ b/tooling/nargo_cli/src/cli/execute_cmd.rs @@ -67,6 +67,7 @@ pub(crate) fn run(args: ExecuteCommand, config: NargoConfig) -> Result<(), CliEr let program_artifact_path = workspace.package_build_path(package); let program: CompiledProgram = read_program_from_file(program_artifact_path.clone())?.into(); + let abi = program.abi.clone(); let results = execute_program_and_decode( program, @@ -93,6 +94,14 @@ pub(crate) fn run(args: ExecuteCommand, config: NargoConfig) -> Result<(), CliEr return Err(CliError::UnexpectedReturn { expected, actual: results.actual_return }); } } + // Abi::decode returns None if the WitnessMap is empty in places corresponding to the return, + // positing that the caller should decide whether a result should be present. + // Arguably at the end of circuit execution it should be. + if let Some(ref expected) = abi.return_type { + if results.actual_return.is_none() { + return Err(CliError::MissingReturn { expected: expected.clone() }); + } + } } Ok(()) } diff --git a/tooling/nargo_cli/src/errors.rs b/tooling/nargo_cli/src/errors.rs index ec0e90b1b76..9255d6fc6a6 100644 --- a/tooling/nargo_cli/src/errors.rs +++ b/tooling/nargo_cli/src/errors.rs @@ -5,6 +5,7 @@ use noir_debugger::errors::DapError; use noirc_abi::{ errors::{AbiError, InputParserError}, input_parser::InputValue, + AbiReturnType, }; use std::path::PathBuf; use thiserror::Error; @@ -70,4 +71,7 @@ pub(crate) enum CliError { #[error("Unexpected return value: expected {expected:?}; got {actual:?}")] UnexpectedReturn { expected: InputValue, actual: Option }, + + #[error("Missing return witnesses; expected {expected:?}")] + MissingReturn { expected: AbiReturnType }, }