www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 8542] New: crosstalk between template instantiations

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542

           Summary: crosstalk between template instantiations
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: timon.gehr gmx.ch



With DMD 2.060, the following code compiles and runs correctly with dmd 
-version=A and dmd -version=B, but it fails to compile with
dmd -version=A -version=B

The code should compile and run correctly even when both version specifiers are
set.

import std.stdio, std.algorithm, std.range, std.bigint;
template Apply(alias a,T...){ alias a!T Apply; }

auto fun(T)(T n, T function(T) i, T function(T) d){
    return
    (z=>((T delegate(T,T) delegate(T delegate(T delegate(T,T),T,T)) AOY)
    =>((m,e)=>reduce!((a,b)=>AOY((f,a,b)=>z(a)?b:i(f(d(a),
    b)))(a,b))(zip([(T[] a)=>a.map!((T x)=>m(i(i(n)),x)).array,(T[] 
    a)=>a.map!((T x)=>m(i(i(i(n))),x)).array,delegate(T[] a)=>a.map!
    (a=>a).array].map!(a=>&Apply!(map!a,T[][])),[[i(n),i(i(n)),i(i(i(n))),
    i(i(i(i(n)))),i(i(i(i(i(n))))),i(i(i(i(i(i(n))))))],
   
[i(i(i(i(i(n))))),i(i(i(i(i(i(n)))))),i(i(i(i(i(i(i(n))))))),i(i(i(i(i(i(i(i(n)))))))),
   
i(i(i(i(i(i(i(i(i(n))))))))),i(i(i(i(n))))],[e(n,i(n)),e(i(n),i(i(n))),e(i(i(n)),i(n))]]
   
).map!(t=>t[0](t[1].map!(a=>[a,i(a),m(a,i(i(n)))]).array)).joiner.map!(a=>zip(a,retro(a))
   
.map!(t=>AOY((f,a,b)=>z(a)?b:i(f(d(a),b)))(t[0],t[1]))).joiner.chain(repeat(
    i(i(i(i(i(i(i(i(i(i(i(i(n))))))))))))).map!(a=>AOY
    ((f,a,b)=>z(b)?a:f(d(a),d(b)))(a,i(i(i(i(i(i(i(i(i(i(i(i(i(n)))))))))))
    )))).take(1))))((T a,T b)=>AOY((f,a,b)=>z(a)?n:AOY((g,a,b)=>z(a)?
   
b:i(g(d(a),b)))(b,f(d(a),b)))(a,b),AOY((h,a,b)=>z(a)?z(b)?i(n):n:z(b)?n:h(d(a),d(b)))))(
    (a){struct S{ T delegate(T,T) delegate(S) r; } return
    ((x)=>x(S(x)))((S x)=>(T u,T v)=>a(x.r(x),u,v)); }))((T a)=>a==n);
}

void main(){
    version(A) assert(fun(0,(int a)=>a+1,(int a)=>a-1)==1337);

    static inc(int[] a){
        if(!a.length) return [1];
        if(a[0]<0) return a[0..$-1];
        return a~(a[$-1]+1);
    }

    static dec(int[] a){
        if(!a.length) return [-1];
        if(a[0]>0) return a[0..$-1];
        return a~(a[$-1]-1);
    }

    version(B) assert(fun((int[]).init,&inc,&dec).equal(iota(1,1338)));
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 12 2012
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




importing std.bigint is not required to reproduce.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 12 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542


deadalnix <deadalnix gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |deadalnix gmail.com



import std.algorithm, std.range;
template Apply(alias a,T...){ alias a!T Apply; }
auto fun(T)(T n, T function(T) i, T function(T) ){
(z=>(T delegate(T,T) delegate(T delegate(T delegate(T,T),T,T)) AOY)
=>((m,e)=>reduce!((a,b)=>AOY((f,a,b)=>z?b:i(a))(a,b))(zip([(T[]
a)=>a.map!(x=>m(n,x))].map!(a=>&Apply!(map!a,T[][])),[[n]]).map!(t=>t[0](t[1].map!(a=>[a]).array)).joiner.map!(a=>zip(a,retro(a)).map!(t=>AOY((f,a,b)=>z?b:i(a))(t[0],t[1]))).joiner.chain))((T
a,T b)=>AOY((f,a,b)=>z?n:AOY((g,a,b)=>z?b:i(a))(b,f(a,b)))(a,b),AOY))((T
a)=>a==n);
}
void main(){
version(A) fun(0,(int a)=>a+1,(int a)=>a-1);
static inc(int[] a){
return a;
}
static dec(int[] a){
return a;
}
version(B) fun((int[]).init,&inc,&dec);
}

I reduced it to that. I fail to got further.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 17 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542


hsteoh quickfur.ath.cx changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hsteoh quickfur.ath.cx



Here's a somewhat simpler case:

auto cprod(R1,R2)(R1 A, R2 B)
{
    return zip(sequence!"n"(cast(size_t)0), A.save, B.save, repeat(A),
repeat(B))
        .map!(function(a) => chain(
            zip(repeat(a[1]), take(a[4].save,a[0])),
            zip(take(a[3].save,a[0]+1), repeat(a[2]))
        )).joiner;
}

void main()
{
    auto A = sequence!"2*n"(0);
    auto B = sequence!"2*n+1"(0);
    auto AB = cprod(A,B);

    auto C = sequence!"100+n"(0);
    auto D = sequence!"200+n"(0);
    auto CD = cprod(C,D);
}

Produces the error:

Error: function
test3.cprod!(Sequence!("2*n",Tuple!(int)),Sequence!("2*n+1",Tuple!(int))).cprod.map!(__
funcliteral2).map!(Zip!(Sequence!("n",Tuple!(uint)),Sequence!("100+n",Tuple!(int)),Sequence!("200+n",Tupl
e!(int)),Repeat!(Sequence!("100+n",Tuple!(int))),Repeat!(Sequence!("200+n",Tuple!(int))))).map
is a neste
d function and cannot be accessed from
test3.cprod!(Sequence!("100+n",Tuple!(int)),Sequence!("200+n",Tupl
e!(int))).cprod


Commenting out either the first three lines (A, B, AB) or the second three
lines (C, D, CD) makes the problem go away.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 16 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542


Jesse Phillips <Jesse.K.Phillips+D gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |Jesse.K.Phillips+D gmail.co
                   |                            |m



11:23:02 PDT ---
I may have duplicated this issue:

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

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 19 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




Here's an unexpected data point: I discovered that this bug may be linked to
the -property compiler flag. To reproduce this odd effect, checkout the code
from: https://github.com/D-Programming-Language/phobos/pull/856, build Phobos
without unittest, then check the output of the following commands (I tested
this on Linux/64):

1) This one compiles just fine:

dmd -unittest -m64 std/algorithm.d generated/linux/debug/64/emptymain.d
-of/tmp/x

2) This one produces a whole bunch of template crosstalk errors:

dmd -property -unittest -m64 std/algorithm.d
generated/linux/debug/64/emptymain.d -of/tmp/x

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




Hmm, the -property effect also happens with the simpler test case I posted
earlier in comment 4:

$ dmd test.d

$ dmd -property test.d
test.d(5): Error: no property 'map' for type 'Zip!(Sequence!("n",
Tuple!(ulong)), Sequence!("2*n", Tuple!(int)), Sequence!("2*n+1", Tuple!(int)),
Repeat!(Sequence!("2*n", Tuple!(int))), Repeat!(Sequence!("2*n+1",
Tuple!(int))))'
test.d(17): Error: template instance test.cprod!(Sequence!("2*n", Tuple!(int)),
Sequence!("2*n+1", Tuple!(int))) error instantiating
test.d(5): Error: no property 'map' for type 'Zip!(Sequence!("n",
Tuple!(ulong)), Sequence!("100+n", Tuple!(int)), Sequence!("200+n",
Tuple!(int)), Repeat!(Sequence!("100+n", Tuple!(int))),
Repeat!(Sequence!("200+n", Tuple!(int))))'
test.d(21): Error: template instance test.cprod!(Sequence!("100+n",
Tuple!(int)), Sequence!("200+n", Tuple!(int))) error instantiating
$

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




Actually, nevermind that. I just realized that -property requires () for map
and joiner because they aren't declared with  property (and UFCS does not
alleviate the need for parentheses).

The sad thing, though, is that my reduced test case no longer produces template
crosstalk in git HEAD. :-(

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




Hmph. It seems that Timon's original code also compiles fine in git head
(without -property). With -property it fails, but seems the reason is that
-property requires functions like map and joiner to have trailing parentheses
(). The template crosstalk problem seems to have gone away.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




git bisect appears to indicate that it was dmd commit
688f7ce593eef75997a2b8f2527d3cd9338692aa that fixed this issue.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla digitalmars.com
         Resolution|                            |WORKSFORME



23:46:02 PST ---
Then we can resolve this as WORKSFORME.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2013
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=8542




Commit pushed to master at https://github.com/D-Programming-Language/phobos

https://github.com/D-Programming-Language/phobos/commit/468f7e12c4b1eea25bc88463f700fa62988a90cd
Replace unittests to avoid issue 8542.

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