Skip to content

Account for type param in '_ constraint for returned trait suggestion #73497

Closed
@estebank

Description

@estebank

Given

use std::any::Any;
fn foo<T: Any>(value: &T) -> Box<dyn Any> {
Box::new(value) as Box<dyn Any>
//~^ ERROR cannot infer an appropriate lifetime
}

we currently output

error[E0759]: cannot infer an appropriate lifetime
--> $DIR/issue-16922.rs:4:14
|
LL | fn foo<T: Any>(value: &T) -> Box<dyn Any> {
| -- this data with an anonymous lifetime `'_`...
LL | Box::new(value) as Box<dyn Any>
| ^^^^^ ...is captured here, requiring it to live as long as `'static`
|
help: to declare that the trait object captures data from argument `value`, you can add an explicit `'_` lifetime bound
|
LL | fn foo<T: Any>(value: &T) -> Box<dyn Any + '_> {
| ^^^^

The suggestion is incomplete and will not result in compilable code. Because the lifetime is coming from an argument of type T, which is an unconstrained type parameter, T itself will not have the needed lifetime and causes the 'static obligation that we're trying to reverse by suggesting '_. The appropriate changes to the code would be either fn foo<'a, T: Any + 'a>(value: &'a T) -> Box<dyn Any + 'a> or fn foo(value: &dyn Any) -> Box<dyn Any + '_>, depending on whether T appears in any other argument or not.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.D-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.P-lowLow priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions