Print a friendly error for the if-let construct without an else block

Fixes #19991.
It is definitely an ugly hack. When an `if-else` construct without an `else` block is desugared to a `match` expression, and `_ => ()` is generated by the compiler, which has the same span as the whole expression. I could not find a reliable method to detect this, nor guess a better span for the desugaring process. Could you suggest an alternative?