diff --git a/compiler/noirc_frontend/src/elaborator/statements.rs b/compiler/noirc_frontend/src/elaborator/statements.rs index 9e29978a9d5..543cf20b647 100644 --- a/compiler/noirc_frontend/src/elaborator/statements.rs +++ b/compiler/noirc_frontend/src/elaborator/statements.rs @@ -249,6 +249,13 @@ impl<'context> Elaborator<'context> { } else { if let Some(definition) = self.interner.try_definition(ident.id) { mutable = definition.mutable; + + if definition.comptime && !self.in_comptime_context() { + self.push_err(ResolverError::MutatingComptimeInNonComptimeContext { + name: definition.name.clone(), + span: ident.location.span, + }); + } } let typ = self.interner.definition_type(ident.id).instantiate(self.interner).0; diff --git a/compiler/noirc_frontend/src/hir/resolution/errors.rs b/compiler/noirc_frontend/src/hir/resolution/errors.rs index ec22c8f1986..cb726a01dec 100644 --- a/compiler/noirc_frontend/src/hir/resolution/errors.rs +++ b/compiler/noirc_frontend/src/hir/resolution/errors.rs @@ -128,6 +128,8 @@ pub enum ResolverError { QuoteInRuntimeCode { span: Span }, #[error("Comptime-only type `{typ}` cannot be used in runtime code")] ComptimeTypeInRuntimeCode { typ: String, span: Span }, + #[error("Comptime variable `{name}` cannot be mutated in a non-comptime context")] + MutatingComptimeInNonComptimeContext { name: String, span: Span }, } impl ResolverError { @@ -522,6 +524,13 @@ impl<'a> From<&'a ResolverError> for Diagnostic { *span, ) }, + ResolverError::MutatingComptimeInNonComptimeContext { name, span } => { + Diagnostic::simple_error( + format!("Comptime variable `{name}` cannot be mutated in a non-comptime context"), + format!("`{name}` mutated here"), + *span, + ) + }, } } }