Skip to content

Commit d4c8001

Browse files
authored
Unrolled build for rust-lang#130496
Rollup merge of rust-lang#130496 - jder:issue-130400, r=compiler-errors Fix circular fn_sig queries to correct number of args for methods Fixes rust-lang#130400. This was a [debug assert](https://github.com/rust-lang/rust/blob/28e8f01c2a2f33fb4214925a704e3223b372cad5/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs#L2557) added to some argument error reporting code in rust-lang#129320 which verified that the number of params (from the HIR) matched the `matched_inputs` which ultimately come from ty::FnSig. In the reduced test case: ``` fn foo(&mut self) -> _ { foo() } ``` There is a circular dependency computing the ty::FnSig -- when trying to compute it, we try to figure out the return value, which again depends on this ty::FnSig. In rust-lang#105162, this was supported by short-circuiting the cycle by synthesizing a FnSig with error types for parameters. The [code in question](https://github.com/rust-lang/rust/pull/105162/files#diff-a65feec6bfffb19fbdc60a80becd1030c82a56c16b177182cd277478fdb04592R44) computes the number of parameters by taking the number of parameters from the hir::FnDecl and adding 1 if there is an implicit self parameter. I might be missing a subtlety here, but AFAICT the adjustment for implicit self args is unnecessary and results in one too many args. For example, for this non-errorful code: ``` trait Foo { fn bar(&self) {} } ``` The resulting hir::FnDecl and ty::FnSig both have the same number of inputs -- 1. So, this PR removes that adjustment and adds a test for the debug ICE. r? `@compiler-errors`
2 parents 60c3673 + 3cb1f33 commit d4c8001

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

compiler/rustc_middle/src/values.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl<'tcx> Value<TyCtxt<'tcx>> for ty::Binder<'_, ty::FnSig<'_>> {
5656
&& let Some(node) = tcx.hir().get_if_local(def_id)
5757
&& let Some(sig) = node.fn_sig()
5858
{
59-
sig.decl.inputs.len() + sig.decl.implicit_self.has_implicit_self() as usize
59+
sig.decl.inputs.len()
6060
} else {
6161
tcx.dcx().abort_if_errors();
6262
unreachable!()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
trait Bar {
2+
fn foo(&mut self) -> _ {
3+
//~^ ERROR the placeholder `_` is not allowed within types on item signatures for return types
4+
Self::foo() //~ ERROR this function takes 1 argument but 0 arguments were supplied
5+
}
6+
}
7+
8+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
error[E0061]: this function takes 1 argument but 0 arguments were supplied
2+
--> $DIR/mismatch-args-crash-issue-130400.rs:4:9
3+
|
4+
LL | Self::foo()
5+
| ^^^^^^^^^-- argument #1 is missing
6+
|
7+
note: method defined here
8+
--> $DIR/mismatch-args-crash-issue-130400.rs:2:8
9+
|
10+
LL | fn foo(&mut self) -> _ {
11+
| ^^^ ---------
12+
help: provide the argument
13+
|
14+
LL | Self::foo(/* value */)
15+
| ~~~~~~~~~~~~~
16+
17+
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
18+
--> $DIR/mismatch-args-crash-issue-130400.rs:2:26
19+
|
20+
LL | fn foo(&mut self) -> _ {
21+
| ^ not allowed in type signatures
22+
23+
error: aborting due to 2 previous errors
24+
25+
Some errors have detailed explanations: E0061, E0121.
26+
For more information about an error, try `rustc --explain E0061`.

0 commit comments

Comments
 (0)