1
Fork 0

Suggest the use of impl Trait in function parameter only

Currently in case of a Trait object in closure parameter, the compiler
suggests either to use a reference, which is correct or to use an
`impl Trait` which is not. Do not emit this suggestion when the parameter
is part of a closure.
This commit is contained in:
Romain Perier 2025-03-26 15:49:42 +01:00
parent c1b8b7e86f
commit 8b6ff4a378
3 changed files with 38 additions and 6 deletions

View file

@ -3018,12 +3018,23 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
[] => span_bug!(ty.span, "trait object with no traits: {ty:?}"),
};
let needs_parens = traits.len() != 1;
err.span_suggestion_verbose(
span,
"you can use `impl Trait` as the argument type",
"impl ",
Applicability::MaybeIncorrect,
);
// Don't recommend impl Trait as a closure argument
if let Some(hir_id) = hir_id
&& matches!(
self.tcx.parent_hir_node(hir_id),
hir::Node::Item(hir::Item {
kind: hir::ItemKind::Fn { .. },
..
})
)
{
err.span_suggestion_verbose(
span,
"you can use `impl Trait` as the argument type",
"impl ",
Applicability::MaybeIncorrect,
);
}
let sugg = if !needs_parens {
vec![(span.shrink_to_lo(), format!("&{kw}"))]
} else {

View file

@ -0,0 +1,5 @@
// Suggestion to use impl trait in closure parameter is invalid, see issue 138932
fn main() {
let c = |f: dyn Fn()| f();
//~^ ERROR: the size for values of type `(dyn Fn() + 'static)` cannot be known at compilation time
}

View file

@ -0,0 +1,16 @@
error[E0277]: the size for values of type `(dyn Fn() + 'static)` cannot be known at compilation time
--> $DIR/dont-suggest-impl-as-closure-arg.rs:3:17
|
LL | let c = |f: dyn Fn()| f();
| ^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `(dyn Fn() + 'static)`
= help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size
|
LL | let c = |f: &dyn Fn()| f();
| +
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0277`.