digitalmars.D.bugs - [Issue 8512] New: Nasty bug about template
- d-bugmail puremagic.com (55/55) Aug 05 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8512
- d-bugmail puremagic.com (22/22) Dec 12 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8512
http://d.puremagic.com/issues/show_bug.cgi?id=8512 Summary: Nasty bug about template Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: youxkei gmail.com --- I'm really sorry about this ambiguous summary, but I cannot come up with a suitable summary. If you come up with a suitable summary of this bug, please change the summary. struct Tuple(T...){ alias T Types; } template TempType(T, alias temp){ pragma(msg, temp.temp!T.Type); // [1] static assert(__traits(compiles, temp.temp!T.Type)); static if(is(temp.temp!T.Type Unused == Result!U, U)){ alias U TempType; }else{ static assert(false); } } struct Result(T){} template seq(T, temps...){ static if(temps.length == 1){ alias Tuple!(TempType!(T, temps[0]).Types) seq; // [2] }else{ alias Tuple!(TempType!(T, temps[0]).Types, seq!(T, temps[1..$]).Types) seq; // [3] } } template temp1(){ template temp(T){ alias Result!(Tuple!()) Type; pragma(msg, seq!(T, temp2!(), temp2!())); } } template temp2(){ template temp(T){ alias Result!(Tuple!()) Type; pragma(msg, seq!(T, temp1!(), temp2!())); } } pragma(msg, temp1!().temp!int); This code doesn't work with dmd 2.060. And the error messages changes depending on whether line [1] is comment-outed or not. If you remove all ".Types" from the lines [2] and [3], the code works well. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 05 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8512 I think this code has a forward reference error, so cannot compile. The starting of forward reference is here. template temp1(){ template temp(T){ alias Result!(Tuple!()) Type; pragma(msg, seq!(T, temp2!(), temp2!())); // bad } } And the dependencies direction is: 1. temp1!().temp!int instantiates temp2!() 2. temp2!() instantiates seq!(int, temp1!(), temp2!())) 3. seq!(int, temp1!(), temp2!()) instantiates TempType!(int, temp1!()) (at [2]) 4. TempType!(int, temp1!()) instantiates temp1!().temp!int 1 to 4 makes forward reference. In current dmd implementation, pragma(msg) requires *complete entities* for its arguments. It means that all semantic analysis for them are already done. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 12 2012