Functions

For associated types we include both bounds written on the type (type X: Trait) and predicates from the trait: where Self::X: Trait.
Opaque types don’t inherit bounds from their parent: for return position impl trait it isn’t possible to write a suitable predicate on the containing function and for type-alias impl trait we don’t have a backwards compatibility issue.