This patch uses the attribute((enable_if)) hack suggested by @rsmith to diagnose invalid arguments when possible.
In order to diagnose an invalid argument m to f(m) we provide an additional overload of f that is only enabled when m is invalid. When that function is enabled it uses attribute((unavailable)) to produce a diagnostic message.
what about relaxed?