Matti Niemenmaa <> changed:

           What    |Removed                     |Added
           Keywords|                            |rejects-valid, wrong-code
            Summary|forward delcaration         |Complex bug with a forward
                   |generates very stange bug   |referenced enum member via
                   |                            |an alias, templates,
                   |                            |tuples, and CTFE

--- Comment #3 from Matti Niemenmaa <> 
2010-03-02 10:46:07 PST ---
Here I come to save the day! To be fair, this is a /bit/ different in that the
original evaluated to the wrong thing twice, but I think that's related to the
compilation errors there, which are either a separate bug or also caused by
this (possible, given that removing the misbehaving code there also
mysteriously fixes the errors).

Anyway, here's something a bit shorter (though still involving just about every
nontrivial language feature) showing this problem:

enum ArrayFlags { None }

class NArray(T) {
    uint flags = Flags.None;
    alias ArrayFlags Flags;

char[] axisFilterLoop(S...)() {
    static if (is(S[0]==NArray!(double))) {}
    return "yyyy";

//pragma(msg, "Outside: " ~ axisFilterLoop!(NArray!(int))());

void axisFilter1(S...)() {
    pragma(msg, "Inside: " ~ axisFilterLoop!(S)());

void main() { axisFilter1!(NArray!(int))(); }

As shown above, the code prints:

"Inside: " ~ axisFilterLoop()
Inside: yyyy

Note that axisFilter1 is instantiated and run only once, yet we get two lines
of output. If you uncomment the other pragma(msg) you get:

Outside: yyyy
Inside: yyyy

As expected.

And yes, you need things like the false-giving (testing for the correct
NArray!(int) instead of NArray!(double) hides the bug) static if on S[0] on
line 9 and the access to the enum member through the alias on lines 4-5.

Configure issuemail:
------- You are receiving this mail because: -------

Reply via email to