http://d.puremagic.com/issues/show_bug.cgi?id=3867
Matti Niemenmaa <[email protected]> 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 <[email protected]> 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: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
