I totally see where you are coming from. I agree it’s consistent (modulo the challenges below). It still seems to me like not the ideal setup somehow. Each step that we took to got here was consistent but I’m not totally happy with the place it is leading us. But now I’m leading into the next blog post or two that I wanted to write – and I have to go get ready for the day, so I’ll leave it there. 
Well, I think your mental model is accurate; and if there are generic type parameters involved you can certainly create functions that could never be called with any actual type. But there’s an additional twist, which is that types and predicates and so forth have to be “well-formed” and I think this error falls out of that checking, though I’m not 100% convinced it ought to.
We’ve actually gone back and forth on errors like these. One complication is that, if such a function is not generic, then we are supposed to generate code for it. But if there are where-clauses that cannot be satisfied, we cannot generate code for it (i.e., it may call functions that don’t exist). We could certainly just generate a panic or some such thing (and we do similar cases in objects).
(One issue is that I think we need to do a large overhaul of our trait matching machinery in the compiler. I’ve had a rough plan in mind for some time but no time to try and elaborate on it into something more real. The current way that we handle caching and tracking what is in scope makes dealing with where clauses like String: Into<u32>, which contains no type variables, rather troublesome.)
Well, in nrc’s original scenario, the impls looked somewhat different, and there the orphan rules would not come into play:
trait Scannable {}
impl<T: FromStr> Scannable for T {}
impl<T: FromStr> Scannable for Result<T, ()> {}
So he would have to add:
impl<T: FromStr> Scannable for Result<T, ()> where Result<T, ()>: FromStr {}
But now it’s totally plausible that the original crate implements FromStr for Result<T, ()>.
So last night when I wrote that comment I was worried because that was exactly the scenario I’m trying to enable – but actually it’s not quite, though interconverting between arbitrary traits is desired (in particular, it’d be nice to have impl<T: Display> Debug for T). But other than that, the cases I am most interested in all have a subtrait relationship, which makes this particular case of negative reasoning a non-issue.