Bug 3833 – pure/nothrow functions/delegates are a subtype of the nonpure/throw ones

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2010-02-18T12:58:00Z
Last change time
2015-06-09T01:27:41Z
Assigned to
nobody
Creator
bearophile_hugs
See also
http://d.puremagic.com/issues/show_bug.cgi?id=3766

Comments

Comment #0 by bearophile_hugs — 2010-02-18T12:58:00Z
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.)
Comment #1 by bearophile_hugs — 2010-12-16T00:50:55Z
With dmd 2.051beta all four examples don't compile, so the DMD is more strict.
Comment #2 by bearophile_hugs — 2011-02-02T10:15:39Z
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]; }
Comment #3 by yebblies — 2011-06-08T22:48:20Z
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 ***