If I am not mistaken, :has(), :nth-*-child(), :current(), host-*(), are the only functional pseudo-classes taking a selector as their arguments, that are not logical pseudo-classes.
I suspect they should pass any restrictions on validity of selectors at their position to their arguments, like logical pseudo-classes. Otherwise, these cases would be valid:
::slotted(:has(type)) (valid in FF)
::slotted(:nth-child(1 of :hover > :hover)) (valid in Chrome)
:host(:has(type)) (valid in FF)
:host(:nth-child(1 of :hover > :hover)) (valid in Chrome)
This is surprising because the following cases are invalid per spec and in Chrome/FF:
::slotted(* > type)
::slotted(:hover > :hover:nth-child(1))
:host(type > type)
:host(:hover > :hover:nth-child(1))
::slotted() and :host-*() take compound selectors, but has() takes relative selectors and :nth-*-child() takes complex selectors.