Overzealous recursive template expansion protection?
Gareth Charnock
gareth.charnock at gmail.com
Wed Nov 3 14:55:32 PDT 2010
On 03/11/10 03:21, Robert Jacques wrote:
>
> struct BinaryOp(L,string op,R) {
> pragma(msg,"Instansiating " ~ typeof(this).stringof);
> BinaryOp!(typeof(this),s,R1) opBinary(string s,R1)(R1 r) {
> pragma(msg,"Instansiating BinaryOp.opBinary ~L.stringof ~ op ~
> R1.stringof);
> return typeof(return)();
> }
> }
>
> struct Leaf {
> BinaryOp!(typeof(this),s,R) opBinary(string s,R)(R r) {
> pragma(msg,"Instansiating leaf.opBinary(" ~ R.stringof ~ ")");
> return typeof(return)();
> }
> };
>
> void main() {
> Leaf v1,v2,v3;
> pragma(msg,"");
> pragma(msg,"======= This Compiles ======");
> v1*(v2*v3);
> pragma(msg,"");
> pragma(msg,"======= This Doesn't ======");
> (v1*v2)*v3;
> }
> Output:
> ======= This Compiles ======
> Instansiating BinaryOp!(Leaf,s,Leaf)
> Instansiating leaf.opBinary(Leaf)
> Instansiating BinaryOp!(Leaf,s,BinaryOp!(Leaf,s,Leaf))
> Instansiating leaf.opBinary(BinaryOp!(Leaf,s,Leaf))
>
> ======= This Doesn't ======
> Error: recursive template expansion for template argument
> BinaryOp!(Leaf,s,Leaf)
Thanks, the workaround seems to work. I've reported the bug:
http://d.puremagic.com/issues/show_bug.cgi?id=5160
More information about the Digitalmars-d
mailing list