On Friday, 24 June 2016 at 18:27:07 UTC, Steven Schveighoffer
wrote:
Even with this, I still didn't understand. Now with your
example in the bug report, it's clear. Reproducing here:
void fun(T)(T obj)
{
static if (!hasMember(T, "gun")) throw new Exception("No
gun");
obj.gun;
}
Call with something that doesn't have a gun member, and even
without the reachability warnings (no -w switch), it doesn't
compile. However, with an else clause, it would compile.
It should be (!hasMember!(T, "gun"))
But otherwise, yes, it seems unintuitive to require the else
statement. Your point about types not having the gun member
failing to compile is what I found confusing. By contrast, when
the type has a gun member, it compiles fine. I changed it to
return obj.gun and it was fine. So I wouldn't characterize this
as a situation where the code below is ignored. I would
characterize it as code that should be ignored is otherwise
compiled.