Outlives-bounds in type aliases may affect object lifetime defaults which lint type_alias_bounds
fails to acknowledge · Issue #100270 · rust-lang/rust (original) (raw)
I tried this code:
#![allow(dead_code)]
pub type Borrow<'a, T: 'a> = &'a T;
pub trait Foo { fn foo(&self); }
impl<T: AsRef + ?Sized> Foo for T { fn foo(&self) {} }
pub struct Bar<'a> { foo: Borrow<'a, dyn Foo>, }
fn bar(name: &str) { let _ = Bar { foo: &name }; }
I expected to see this happen:
error[E0759]: `name` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
--> src/lib.rs🔞24
|
17 | fn bar(name: &str) {
| ---- this data with an anonymous lifetime `'_`...
18 | let _ = Bar { foo: &name };
| ^^^^^ ...is used and required to live as long as `'static` here
For more information about this error, try `rustc --explain E0759`.
Borrow<'a, dyn Foo>
should default to dyn Foo + 'static
and the T: 'a
should be ignored.
Instead, this happened:
warning: bounds on generic parameters are not enforced in type aliases
--> src/lib.rs:3:24
|
3 | pub type Borrow<'a, T: 'a> = &'a T;
| ^^
|
= note: `#[warn(type_alias_bounds)]` on by default
help: the bound will not be checked when the type alias is used, and should be removed
|
3 - pub type Borrow<'a, T: 'a> = &'a T;
3 + pub type Borrow<'a, T> = &'a T;
|
If you follow the guidance from the warning, it no longer compiles due to dyn Foo
being static-ish, as mentioned