I am not familiar with the GHC input algorithm. However, here I can guess why the compiler cannot figure it out.
Consider this code:
rebar :: forall rp rq rp' rp'' . (Typeable rp', Typeable rp'') => Proxy rp' -> Proxy rp'' -> Foo rp -> Foo (Bar rp rq) rebar p1 p2 (Foo x) = let y = ... :: Foo (Bar rp Char) in case (eqT :: Maybe (Char :~: rq)) of Just Refl -> y
This should compile, since the Refl match proves Char ~ rq , so y at the end has the correct return type Foo (Bar rp rq) . The program is type checking.
However, suppose instead that we have
let y = ... :: Foo (Bar rp rq)
in this case, y already the correct type, and Refl useless. Again, the program passes type checking.
Now suppose we have no type annotation. How will it compile, what is the correct type for the binding let y = ... ? In the end, there are (at least) two of them leading to the correct set of all rebar .
It may also explain why if you add _ -> y , it works: in this case, the compiler knows that Refl not required. Instead, if you add y -> error "" , information about y will not be displayed.
The actual full story may be more complicated than the higher: here I just ignore the information coming from the definition of y , i.e. rebar p1 p2 x . In other words, I consider only the restrictions that the context places on the definition on y , and not those that go in the other direction.
In your example, an equation of type is actually rp' ~ rp'' , which seems to be inappropriate wrt type y at the end. Perhaps the compiler is not smart enough to figure this out.