Thread overview
[Issue 3833] New: pure/nothrow functions/delegates are a subtype of the nonpure/throw ones
Jun 09, 2011
yebblies
February 18, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3833

           Summary: pure/nothrow functions/delegates are a subtype of the
                    nonpure/throw ones
           Product: D
           Version: 2.040
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: bearophile_hugs@eml.cc


--- Comment #0 from bearophile_hugs@eml.cc 2010-02-18 12:58:00 PST ---
This compiles, but it's an error because the array is mixed, &sqr is not pure:

void main() {
    double sqr(double x) { return x * x; }
    pure double psqr(double x) { return x * x; }
    pure double delegate(double)[] funcs = [&sqr, &psqr];
}


This doesn't compile, but pure functions are a subsets of impure functions:

pure real sqr1(real x) { return x * x; }
real sqr2(real x) { return x * x; }
void main() {
    real function(real x)[] funcs = [&sqr1, &sqr2];
}



While this compiles:

void main() {
    double sqr(double x) { return x * x; }
    pure double psqr(double x) { return x * x; }
    double delegate(double)[] funcs = [&sqr, &psqr];
}


The following doesn't compile, but nothrow functions are a subset of throwing functions:

nothrow real sqr1(real x) { return x * x; }
real sqr2(real x) {
    if (x == 0) throw new Error("");
    return x * x;
}
void main() {
    real function(real x)[] funcs = [&sqr1, &sqr2];
}


(Similar things happen with "pure nothrow" functions/delegates.)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 16, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3833



--- Comment #1 from bearophile_hugs@eml.cc 2010-12-16 00:50:55 PST ---
With dmd 2.051beta all four examples don't compile, so the DMD is more strict.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 02, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=3833



--- Comment #2 from bearophile_hugs@eml.cc 2011-02-02 10:15:39 PST ---
This D2 program shows a cost of a strong type system: creating collections of functions becomes a problem because there are so many attributes that change a type. This specific problem is solved managing correctly variance/covariance of function pointers and delegates, typing the array 'a' as an array of impure nothrow @trusted functions:


import std.math;
void main() {
    auto a = [&asin, &cbrt];
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 09, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=3833


yebblies <yebblies@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |yebblies@gmail.com
         Resolution|                            |DUPLICATE


--- Comment #3 from yebblies <yebblies@gmail.com> 2011-06-08 22:48:20 PDT ---
I'm going to mark this as a dupe of 3180, along with 4000, as both cases are covered by covariance.

*** This issue has been marked as a duplicate of issue 3180 ***

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