Fixing spurious "statement is not reachable" in template code

tsbockman via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 28 10:32:18 PDT 2015


On Wednesday, 28 October 2015 at 10:02:01 UTC, Daniel Murphy 
wrote:
> If it's unreachable or not depends on what the template is 
> instantiated with, there is no clear concept of unreachable 
> code without knowing the template parameters.

If a statement in a template is reachable in at least one 
possible instantiation of that template, it is not "unreachable". 
What is unclear about this as a concept?

Just because implementing this definition perfectly in the 
compiler is difficult, doesn't mean the concept is unclear.

> bool func(T)(T value) if (isUnsigned!T)
> {
>     if (value < 0)
>         return true;
>     return false;
> }
>
> Here the first return is definitely dead code for any 
> instantiation, but to know this the compiler would have to 
> reverse-engineer properties from the template constraints, 
> which is not generally possible.

Detection of all dead code will never be "generally possible", 
with or without templates involved - if it was you could 
trivially solve the halting problem.

If false negatives are unacceptable, then we should remove the 
warning entirely, as achieving that goal is mathematically 
impossible on a normal computer.

> [snip]
>
> As one of the core compiler devs, I'm saying it sounds 
> infeasible.  I don't think either of your suggested solutions 
> are implementable. Templates just do not work that way.
>
> > 1. Defer "not reachable" warnings until compilation has been
> > completed, and only issue the warning if *all* instantiations
> of the
> > statement were unreachable.
>
> The exact set of instantiations depends on the current module 
> being compiled, so module A can still get an unreachable code 
> warning even if in an instantiation from module B the code is 
> reachable.

I know that solution #1 is far from perfect - it would, however, 
significantly reduce the frequency of false positives. As I said 
above, perfection is not the goal, since it is not even 
theoretically possible due to the halting problem.

> > 2. For semantic analysis purposes, first instantiate each
> template
> > using dummy parameters with the widest possible VRP ranges.
> Only
> > statements found to be "not reachable" in this dummy run
> should
> > actually generate warnings.
>
> Will not work with compile-time introspection.

I'm not sure precisely what you're referring to here. I know 
solution #2 would be a royal pain to implement, though, even if 
it is possible.

> In some trivial cases code can be found to be unreachable 
> without doing semantic analysis, and therefore can be done 
> before template instantiation.  Being limited, I doubt this is 
> of much value.

Perhaps the warning should just be removed then.


More information about the Digitalmars-d mailing list