From 3cb1f334b8c74f7c8c5860e2c84b317fbc86165d Mon Sep 17 00:00:00 2001
From: Jesse Rusak <me@jesserusak.com>
Date: Tue, 17 Sep 2024 20:53:37 -0400
Subject: [PATCH] Fix circular fn_sig queries to return the correct number of
 arguments for methods

---
 compiler/rustc_middle/src/values.rs           |  2 +-
 .../mismatch-args-crash-issue-130400.rs       |  8 ++++++
 .../mismatch-args-crash-issue-130400.stderr   | 26 +++++++++++++++++++
 3 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 tests/ui/mismatched_types/mismatch-args-crash-issue-130400.rs
 create mode 100644 tests/ui/mismatched_types/mismatch-args-crash-issue-130400.stderr

diff --git a/compiler/rustc_middle/src/values.rs b/compiler/rustc_middle/src/values.rs
index 9e429f5a4c737..6163fa2932d08 100644
--- a/compiler/rustc_middle/src/values.rs
+++ b/compiler/rustc_middle/src/values.rs
@@ -56,7 +56,7 @@ impl<'tcx> Value<TyCtxt<'tcx>> for ty::Binder<'_, ty::FnSig<'_>> {
             && let Some(node) = tcx.hir().get_if_local(def_id)
             && let Some(sig) = node.fn_sig()
         {
-            sig.decl.inputs.len() + sig.decl.implicit_self.has_implicit_self() as usize
+            sig.decl.inputs.len()
         } else {
             tcx.dcx().abort_if_errors();
             unreachable!()
diff --git a/tests/ui/mismatched_types/mismatch-args-crash-issue-130400.rs b/tests/ui/mismatched_types/mismatch-args-crash-issue-130400.rs
new file mode 100644
index 0000000000000..16c4e639c29ac
--- /dev/null
+++ b/tests/ui/mismatched_types/mismatch-args-crash-issue-130400.rs
@@ -0,0 +1,8 @@
+trait Bar {
+    fn foo(&mut self) -> _ {
+        //~^ ERROR the placeholder `_` is not allowed within types on item signatures for return types
+        Self::foo() //~ ERROR  this function takes 1 argument but 0 arguments were supplied
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/mismatched_types/mismatch-args-crash-issue-130400.stderr b/tests/ui/mismatched_types/mismatch-args-crash-issue-130400.stderr
new file mode 100644
index 0000000000000..0e4b94b98e268
--- /dev/null
+++ b/tests/ui/mismatched_types/mismatch-args-crash-issue-130400.stderr
@@ -0,0 +1,26 @@
+error[E0061]: this function takes 1 argument but 0 arguments were supplied
+  --> $DIR/mismatch-args-crash-issue-130400.rs:4:9
+   |
+LL |         Self::foo()
+   |         ^^^^^^^^^-- argument #1 is missing
+   |
+note: method defined here
+  --> $DIR/mismatch-args-crash-issue-130400.rs:2:8
+   |
+LL |     fn foo(&mut self) -> _ {
+   |        ^^^ ---------
+help: provide the argument
+   |
+LL |         Self::foo(/* value */)
+   |                  ~~~~~~~~~~~~~
+
+error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
+  --> $DIR/mismatch-args-crash-issue-130400.rs:2:26
+   |
+LL |     fn foo(&mut self) -> _ {
+   |                          ^ not allowed in type signatures
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0061, E0121.
+For more information about an error, try `rustc --explain E0061`.