[Issue 6094] && doesn't shortcut properly with CTFE

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Jun 29 23:24:30 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=6094


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|regression                  |enhancement


--- Comment #9 from Don <clugdbug at yahoo.com.au> 2011-06-29 23:19:32 PDT ---
(In reply to comment #8)
> I'm pretty sure this is a regression between DMD 2.052 and DMD 2.053. I found
> this 'regression' in template constraints:
> 
> if( isPointer!T && isPointer!(pointerTarget!T) )
> 
> the problem is that if T is a string, then pointerTarget!T can not compile.
> This wouldn't be an issue if that meant the template constraint failed
> gracefully, but instead it halts compilation.

No, that's not a regression. && was never defined to work in that way.
It's a Phobos bug which has been exposed.

> Anyways, there is the question of whether or not shortcutting is the correct
> behavior.
> 
> From a performance point of view, as someone who has spent time optimizing
> templates for compile times, anything that can reduce DMD's memory-usage or
> compile times is a good thing.
>
> From a practical point of view, being able to guard statements without using a
> static if is great for template constraints and other short templates.
> 
> From a consistently point of view CTFE is already shortcutting everything
> inside a if(!__ctfe){} block. (and probably other if(false){} blocks as well).
> And we will never be able give up shortcutting if(!__ctfe){} blocks.

That is COMPLETELY irrelevant. It has nothing in common. To repeat what I said
earlier: the constant folding behaviour of && does *not* involve CTFE. In fact,
it's not even a change to the constant folding; it's a change to the semantic
pass of &&.

What this request is: Given X && Y, if X always evaluates to false, do not
perform _any_ semantic analysis on Y. No matter what garbage it is.
Likewise for X || Y; if X is true, don't semantically analyse Y.

So, instead of 
 1. semantic analysis X and Y;
 2. constant fold X&&Y;
it would become:
 1. semantic X;
 2. constfold X;
 3. if (X is true) return true;
 4. semantic Y;
 5. constfold X&&Y.

This is clearly a major enhancement request and not a regression.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list