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.

Reply via email to