https://gcc.gnu.org/g:bfc7edfb8d2e7144db57c04811762c13a3025d1e
commit r17-5152-gbfc7edfb8d2e7144db57c04811762c13a3025d1e Author: Owen Avery <[email protected]> Date: Sun Sep 20 18:53:30 2026 -0400 gccrs: Ignore bindings on bodyless functions Functions without bodies can have different parameters with the same name. gcc/rust/ChangeLog: * resolve/rust-late-name-resolver-2.0.cc (Late::Late): Initialize in_bodyless_params. (Late::visit (FunctionParam)): New function definition, skip visiting the patterns of function parameters on bodyless functions. (Late::visit_function_params): Set in_bodyless_params. * resolve/rust-late-name-resolver-2.0.h (Late::visit (FunctionParam)): New function declaration. (Late::in_bodyless_params): New member variable. gcc/testsuite/ChangeLog: * rust/compile/multiple_bindings3.rs: New test. Signed-off-by: Owen Avery <[email protected]> Diff: --- gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 21 ++++++++++++++++++++- gcc/rust/resolve/rust-late-name-resolver-2.0.h | 3 +++ gcc/testsuite/rust/compile/multiple_bindings3.rs | 10 ++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc index e910c7e3b266..b568b19b0e51 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -37,7 +37,8 @@ namespace Rust { namespace Resolver2_0 { Late::Late (NameResolutionContext &ctx) - : DefaultResolver (ctx), funny_error (false), block_big_self (false) + : DefaultResolver (ctx), funny_error (false), block_big_self (false), + in_bodyless_params (false) {} void @@ -226,15 +227,33 @@ Late::visit (AST::AltPattern &pattern) ctx.bindings.peek ().merge (); } +void +Late::visit (AST::FunctionParam ¶m) +{ + visit_outer_attrs (param); + // we can't handle bindings for bodyless functions + // since, ex, `fn foo (a: i32, a: f64);` is valid + // (parameter names are ignored) + if (param.has_name () && !in_bodyless_params) + visit (param.get_pattern ()); + + visit (param.get_type ()); +} + void Late::visit_function_params (AST::Function &function) { + bool was_in_bodyless_params = in_bodyless_params; + in_bodyless_params = !function.has_body (); + ctx.bindings.enter (BindingSource::Param); for (auto ¶m : function.get_function_params ()) visit (param); ctx.bindings.exit (); + + in_bodyless_params = was_in_bodyless_params; } void diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.h b/gcc/rust/resolve/rust-late-name-resolver-2.0.h index 38785633448c..04bb0b9d756e 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h @@ -39,6 +39,7 @@ public: // Specialized visit bits void visit_function_params (AST::Function &function) override; + void visit (AST::FunctionParam &) override; // some more label declarations void visit (AST::LetStmt &) override; @@ -79,6 +80,8 @@ private: /* used to prevent "impl Self {}", "impl (Self, i32) {}", etc */ bool block_big_self; + + bool in_bodyless_params; }; // TODO: Add missing mappings and data structures diff --git a/gcc/testsuite/rust/compile/multiple_bindings3.rs b/gcc/testsuite/rust/compile/multiple_bindings3.rs new file mode 100644 index 000000000000..25bcb859f3ce --- /dev/null +++ b/gcc/testsuite/rust/compile/multiple_bindings3.rs @@ -0,0 +1,10 @@ +#![feature(no_core)] +#![no_core] + +extern "C" { + fn f1(a: i32, a: i32); +} + +trait A { + fn f2(a: i32, a: i32); +}
