-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Object lifetime defaults of GATs are not respected #115379
Comments
Nominating this for lang team discussion since I really don't know if this works as intended or not. Feel free to remove the nomination if you don't think it's important enough for a team discussion. |
Possibly relevant: #91302 |
Hi @fmease ! We discussed this in our @rust-lang/lang triage meeting today. We felt the behavior is a bug and inconsistent. I'm nominating this issue for @rust-lang/types to discuss further and possibly fix. @rustbot labels +I-types-nominated -I-lang-nominated In particular, we felt that this example should behave the same as your motivating example: trait Ref<'a, T: 'a + ?Sized> {
type Ty;
}
trait Inner {}
fn f<'r, T>(x: <T as Ref<'r, dyn Inner + 'r>>::Ty) { g(x) }
fn g<'r, T>(x: <T as Ref<'r, dyn Inner>>::Ty) { g(x) } However, the above example gives an error, as does We felt that it was ok to give a hard error since that is forwards compatible and consistent with how we currently behave for other parameters appearing in associated type references, but of course that is technically a breaking change, although the impact seems likely to be small. @rust-lang/types, this kind of detail also feels like it's in your purview, how do you think we ought to proceed? |
discussed this in the @rust-lang/types meeting: zulip our takeaways are as follows:
This is theoretically breaking as |
[crater] Properly deduce the object lifetime default in GAT paths Fixes rust-lang#115379. r? ghost
To infer the default trait object lifetime of a trait object type, we first look at the bounds on the relevant type parameter of the containing generic type. According to my interpretation of the Reference, RFC 599 and RFC 1156, any kind of generic type can be an elegible container type, not just ADTs. However, if the containing generic type is a GAT, the compiler doesn't properly take into consideration the bounds on its type parameters. The RFCs obviously predate GATs.
For example, I expected the following code to compile since
dyn Inner
ing
's signature should be equivalent todyn Inner + 'r
given that'r
is the object lifetime default due to the boundT: 'a
at least according to my reading of the Reference and according to#[rustc_object_lifetime_default]
but it fails because the default is actually inferred to be'static
leading me to assume that rustc completely ignores the GAT param bounds.As attested by
#[rustc_object_lifetime_default]
, we seem to (be able to) compute the object lifetime defaults for GATs (but we don't use them during resolution):Is this an oversight in the current implementation or does this work as intended?
Note that it would be a breaking change to fix this, I'm almost certain.
@rustbot label C-bug T-compiler A-lifetimes A-trait-objects A-associated-items F-generic_associated_types
The text was updated successfully, but these errors were encountered: