Fix ICE when function argument mismatches.
This commit is contained in:
parent
6378fbc366
commit
8b1c28fdd0
4 changed files with 70 additions and 10 deletions
|
@ -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 {
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
//@ known-bug: #135124
|
||||
trait A {
|
||||
fn y(&self)
|
||||
{
|
||||
fn call() -> impl Sized {}
|
||||
self.fold(call());
|
||||
}
|
||||
fn fold(&self, &self._) {}
|
||||
}
|
20
tests/ui/fn/error-recovery-mismatch.rs
Normal file
20
tests/ui/fn/error-recovery-mismatch.rs
Normal 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() {}
|
46
tests/ui/fn/error-recovery-mismatch.stderr
Normal file
46
tests/ui/fn/error-recovery-mismatch.stderr
Normal 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`.
|
Loading…
Add table
Add a link
Reference in a new issue