Description
Important context: Inherently, this would only become legal under the ongoing lang experiment
associated_const_equality
(#92827).
We permit trait object types where all 'active'1 non-generic associated types are specified (via assoc item bindings). We should extend this to cover 'active' non-generic2 associated constants, too.
Note that I haven't spent much time thinking about soundness yet. I still need to iron out the exact rules. Implementation-wise, I'm almost certain that any advances are blocked by #120905 (more precisely, its underlying issue) which I presume we would need to fix first for correctness.
Minimal & contrived example of something that would start compiling:
#![feature(associated_const_equality)]
trait Trait {
const K: ();
}
fn main() {
let _: dyn Trait<K = { () }>;
}
Presently, this gets rejected and we emit E0038 (cannot be made into an object).
Lastly, lest I forget, we should emit the lint unused_associated_type_bounds
3 (#112319) for assoc const bindings where the corresp. assoc const is 'disabled' via where Self: Sized
which is only possible to write under generic_const_items
(#113521).
Footnotes
-
I.e., not 'made inactive' / 'disabled' via
where Self: Sized
(Don't require associated types with Self: Sized bounds indyn Trait
objects #112319). ↩ -
This might or might not be a temporary restriction. For context, we don't (yet) permit GAT bindings in trait object types either on stable, due to soundness concerns. See
generic_associated_types_extended
(Tracking Issue for extended generic associated types #95451). Also note that generic assoc consts (GACs) are only available undergeneric_const_items
(Tracking issue for generic const items #113521). ↩ -
Indeed, the name would no longer be accurate. Ideally, we would rename the lint when generalizing it. ↩
Metadata
Metadata
Assignees
Labels
Type
Projects
Status