Right, you’ve invented a nicer syntax that Rust doesn’t support.
trait Bar2<S>: Foo<Foo = Option<S>>
This means “for each S, make a new version of this trait”, which in this case is necessary, because every Option<S> may have different layout, and a different way of encoding Some, so every call to is_some() may be different. Rust just likes to be explicit about it.