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 &param)
+{
+  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 &param : 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);
+}

Reply via email to