From c73861779895b79c9f87172d306017b5f8851d5c Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:09:30 +0000 Subject: [PATCH 1/2] chore: merge `RangeCheckFailed` and `RangeCheckFailedWithMessage` --- .../src/ssa/interpreter/errors.rs | 10 +++------- .../noirc_evaluator/src/ssa/interpreter/mod.rs | 18 +++++++----------- tooling/ast_fuzzer/src/compare/interpreted.rs | 9 +++------ 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs b/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs index 9974f2b4fb9..c6659cb1597 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs @@ -33,18 +33,14 @@ pub enum InterpreterError { #[error("static_assert `{condition}` failed: {message}")] StaticAssertFailed { condition: ValueId, message: String }, #[error( - "Range check of {value_id} = {value} failed.\n Max bits allowed by range check = {max_bits}\n Actual bit count = {actual_bits}" + "Range check of {value_id} = {value} failed.\n Max bits allowed by range check = {max_bits}\n Actual bit count = {actual_bits}\n {message}", message = constraint_message(.msg) )] - RangeCheckFailed { value: String, value_id: ValueId, actual_bits: u32, max_bits: u32 }, - #[error( - "Range check of {value_id} = {value} failed.\n Max bits allowed by range check = {max_bits}\n Actual bit count = {actual_bits}\n {message}" - )] - RangeCheckFailedWithMessage { + RangeCheckFailed { value: String, value_id: ValueId, actual_bits: u32, max_bits: u32, - message: String, + msg: Option, }, /// This is not an internal error since the SSA is still valid. We're just not able to /// interpret it since we lack the context of what the external function is. diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs b/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs index 64ccf1f8ac2..08749a5cc95 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs @@ -714,17 +714,13 @@ impl<'ssa, W: Write> Interpreter<'ssa, W> { let actual_bits = bit_count; let max_bits = max_bit_size; - if let Some(message) = error_message { - Err(InterpreterError::RangeCheckFailedWithMessage { - value, - value_id, - actual_bits, - max_bits, - message: message.clone(), - }) - } else { - Err(InterpreterError::RangeCheckFailed { value, value_id, actual_bits, max_bits }) - } + Err(InterpreterError::RangeCheckFailed { + value, + value_id, + actual_bits, + max_bits, + msg: error_message.cloned(), + }) } else { Ok(()) } diff --git a/tooling/ast_fuzzer/src/compare/interpreted.rs b/tooling/ast_fuzzer/src/compare/interpreted.rs index 052925be12a..34135d20116 100644 --- a/tooling/ast_fuzzer/src/compare/interpreted.rs +++ b/tooling/ast_fuzzer/src/compare/interpreted.rs @@ -158,10 +158,10 @@ impl Comparable for ssa::interpreter::errors::InterpreterError { } ( Internal(InternalError::ConstantDoesNotFitInType { constant, .. }), - RangeCheckFailed { value, .. } | RangeCheckFailedWithMessage { value, .. }, + RangeCheckFailed { value, .. }, ) | ( - RangeCheckFailed { value, .. } | RangeCheckFailedWithMessage { value, .. }, + RangeCheckFailed { value, .. }, Internal(InternalError::ConstantDoesNotFitInType { constant, .. }), ) => { // The value should be a `NumericValue` display format, which is ` `. @@ -198,10 +198,7 @@ impl Comparable for ssa::interpreter::errors::InterpreterError { // So instead of reasoning about the `lhs` and `rhs` formats, let's just compare the message so we know it's the same constraint: msg1 == msg2 } - ( - RangeCheckFailedWithMessage { message: msg1, .. }, - ConstrainEqFailed { msg: msg2, .. }, - ) => { + (RangeCheckFailed { msg: Some(msg1), .. }, ConstrainEqFailed { msg: msg2, .. }) => { // The removal of unreachable instructions evaluates constant binary operations and can replace // e.g. a `mul` followed by a `range_check` with a `constrain true == false, "attempt to multiple with overflow"` msg2.as_ref().is_some_and(|msg| msg == msg1) From 2cbbb9b8527b5122d1ae96d7c978f3bbe22001a2 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:13:29 +0000 Subject: [PATCH 2/2] . --- compiler/noirc_evaluator/src/ssa/interpreter/errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs b/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs index c6659cb1597..1b15d46c518 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/errors.rs @@ -33,7 +33,7 @@ pub enum InterpreterError { #[error("static_assert `{condition}` failed: {message}")] StaticAssertFailed { condition: ValueId, message: String }, #[error( - "Range check of {value_id} = {value} failed.\n Max bits allowed by range check = {max_bits}\n Actual bit count = {actual_bits}\n {message}", message = constraint_message(.msg) + "Range check of {value_id} = {value} failed.\n Max bits allowed by range check = {max_bits}\n Actual bit count = {actual_bits}{message}", message = constraint_message(.msg) )] RangeCheckFailed { value: String,