Based on a read of the implementation, I believe situations like this are incorrectly handled:
trait Foo {
    type Out;
}
trait Bar<T: Foo> {
}The problem is that Bar needs a synthetic parameter to play the role of T::Out, but the current code only adds synthetic parameters to things other than traits (since, in a trait, we add the parameters for the associated types defined within the trait itself). We also do not add synthetic parameters for bounds appearing on structs etc.