Fix ICE when function argument mismatches.

This commit is contained in:
Jason Newcomb 2025-02-03 19:17:46 -05:00
parent 6378fbc366
commit 8b1c28fdd0
4 changed files with 70 additions and 10 deletions

View file

@ -126,7 +126,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
Err(guar) => Err(guar),
};
if let Err(guar) = has_error {
let err_inputs = self.err_args(args_no_rcvr.len(), guar);
let err_inputs = self.err_args(
method.map_or(args_no_rcvr.len(), |method| method.sig.inputs().len() - 1),
guar,
);
let err_output = Ty::new_error(self.tcx, guar);
let err_inputs = match tuple_arguments {

View file

@ -1,9 +0,0 @@
//@ known-bug: #135124
trait A {
fn y(&self)
{
fn call() -> impl Sized {}
self.fold(call());
}
fn fold(&self, &self._) {}
}

View file

@ -0,0 +1,20 @@
// Used to ICE due to a size mismatch between the actual fake signature of `fold` and the
// generated signature used reporting the parameter mismatch at the call site.
// See issue #135124
trait A {
fn y(&self)
{
fn call() -> impl Sized {}
self.fold(call(), call());
}
fn fold<T>(&self, _: T, &self._) {}
//~^ ERROR unexpected `self` parameter in function
//~| ERROR expected one of `)` or `,`, found `.`
//~| ERROR identifier `self` is bound more than once in this parameter list
//~| WARNING anonymous parameters are deprecated
//~| WARNING this is accepted in the current edition
//~| ERROR the placeholder `_` is not allowed within types
}
fn main() {}

View file

@ -0,0 +1,46 @@
error: unexpected `self` parameter in function
--> $DIR/error-recovery-mismatch.rs:11:29
|
LL | fn fold<T>(&self, _: T, &self._) {}
| ^^^^^ must be the first parameter of an associated function
error: expected one of `)` or `,`, found `.`
--> $DIR/error-recovery-mismatch.rs:11:34
|
LL | fn fold<T>(&self, _: T, &self._) {}
| ^
| |
| expected one of `)` or `,`
| help: missing `,`
error[E0415]: identifier `self` is bound more than once in this parameter list
--> $DIR/error-recovery-mismatch.rs:11:30
|
LL | fn fold<T>(&self, _: T, &self._) {}
| ^^^^ used as parameter more than once
warning: anonymous parameters are deprecated and will be removed in the next edition
--> $DIR/error-recovery-mismatch.rs:11:35
|
LL | fn fold<T>(&self, _: T, &self._) {}
| ^ help: try naming the parameter or explicitly ignoring it: `_: _`
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686>
= note: `#[warn(anonymous_parameters)]` on by default
error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions
--> $DIR/error-recovery-mismatch.rs:11:35
|
LL | fn fold<T>(&self, _: T, &self._) {}
| ^ not allowed in type signatures
|
help: use type parameters instead
|
LL | fn fold<T, U>(&self, _: T, &self.U) {}
| +++ ~
error: aborting due to 4 previous errors; 1 warning emitted
Some errors have detailed explanations: E0121, E0415.
For more information about an error, try `rustc --explain E0121`.