diff --git a/noir/noir-repo/aztec_macros/src/transforms/functions.rs b/noir/noir-repo/aztec_macros/src/transforms/functions.rs index b5803d8ac9e4..0a628f473ef5 100644 --- a/noir/noir-repo/aztec_macros/src/transforms/functions.rs +++ b/noir/noir-repo/aztec_macros/src/transforms/functions.rs @@ -3,8 +3,8 @@ use noirc_errors::Span; use noirc_frontend::ast; use noirc_frontend::ast::{ BlockExpression, ConstrainKind, ConstrainStatement, Expression, ExpressionKind, - ForLoopStatement, ForRange, FunctionReturnType, Ident, Literal, NoirFunction, NoirStruct, - Param, PathKind, Pattern, Signedness, Statement, StatementKind, UnresolvedType, + ForLoopStatement, ForRange, FunctionKind, FunctionReturnType, Ident, Literal, NoirFunction, + NoirStruct, Param, PathKind, Pattern, Signedness, Statement, StatementKind, UnresolvedType, UnresolvedTypeData, Visibility, }; @@ -38,6 +38,7 @@ pub fn transform_function( let inputs_name = format!("{}ContextInputs", ty); let return_type_name = format!("{}CircuitPublicInputs", ty); let is_avm = ty == "Avm"; + let is_private = ty == "Private"; // Add check that msg sender equals this address and flag function as internal if is_internal { @@ -107,6 +108,11 @@ pub fn transform_function( // Public functions should have unconstrained auto-inferred func.def.is_unconstrained = matches!(ty, "Public" | "Avm"); + // Private functions need to be recursive + if is_private { + func.kind = FunctionKind::Recursive; + } + Ok(()) }