On Friday, 1 April 2016 at 01:21:32 UTC, Walter Bright wrote:
On 3/16/2016 4:18 AM, Johan Engelen wrote:
I've found discussions, but not an actual "recommended" solution for the problem of "statement is not reachable" warnings in templates with early
returns, e.g.:
```
bool nobool(T...)() {
     foreach (i, U; T) {
         static if (is(U == bool)) {
             return false;
         }
     }
return true; // emits "Warning: statement is not reachable"
}


bool nobool(T...)() {
     bool result = true;
     foreach (i, U; T) {
         static if (is(U == bool)) {
             result = false;
             break;
         }
         else
         {
             ...
         }
     }
return result; // emits "Warning: statement is not reachable"
}

As you can see from my first post, that is the solution I used first (without the "break;" addition), but it works until...

Note that the optimizer will remove the dead loads.

... until someone adds a (imho useful) diagnostic of dead stores/loads. :-) In that case, I guess inverting all bools and then inverting the return value at the end will work (using default initialization of result); but this is not possible in a slightly more complicated case with non-bool return types.

In another piece of code, the return type is a struct with an immutable member. That's when I gave up on working around the warning and just disabled it.
Simplified, something like this:

struct IMM {
    immutable bool result;
}
IMM immut(T...)() {
    IMM retval = IMM(true);
    foreach (i, U; T) {
        static if (is(U == bool)) {
retval = IMM(false); // "Error: cannot modify struct retval IMM with immutable member".
        }
    }
    return retval;
}


Reply via email to