From 56fc243deea20d23f0961ff679368dd10005ca19 Mon Sep 17 00:00:00 2001 From: Mohamed Magdi Date: Wed, 5 Mar 2025 12:10:17 +0200 Subject: [PATCH] fix: validate function argument names for duplicates (#680) --- src/modules/function/declaration.rs | 7 +++++++ src/tests/erroring/duplicate_argument.ab | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 src/tests/erroring/duplicate_argument.ab diff --git a/src/modules/function/declaration.rs b/src/modules/function/declaration.rs index c5dbea57..b6fc44c4 100644 --- a/src/modules/function/declaration.rs +++ b/src/modules/function/declaration.rs @@ -155,6 +155,7 @@ impl SyntaxModule for FunctionDeclaration { meta.with_context_fn(Context::set_cc_flags, flags, |meta| { // Get the arguments token(meta, "(")?; + let mut seen_argument_names = HashSet::new(); loop { if token(meta, ")").is_ok() { break @@ -162,6 +163,12 @@ impl SyntaxModule for FunctionDeclaration { let is_ref = token(meta, "ref").is_ok(); let name_token = meta.get_current_token(); let name = variable(meta, variable_name_extensions())?; + + // Check for duplicate argument name + if !seen_argument_names.insert(name.clone()) { + return error!(meta, name_token, format!("Argument '{name}' is already defined")); + } + // Optionally parse the argument type let mut arg_type = Type::Generic; match token(meta, ":") { diff --git a/src/tests/erroring/duplicate_argument.ab b/src/tests/erroring/duplicate_argument.ab new file mode 100644 index 00000000..29cfc245 --- /dev/null +++ b/src/tests/erroring/duplicate_argument.ab @@ -0,0 +1,6 @@ +// Output +// Argument 'a' is already defined + +fun foo(a, a) { + return a +}