[Issue 23299] New: Detect if lambda does not access its delegate context pointer
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Aug 20 14:10:20 UTC 2022
https://issues.dlang.org/show_bug.cgi?id=23299
Issue ID: 23299
Summary: Detect if lambda does not access its delegate context
pointer
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: bugzilla at digitalmars.com
Consider:
final class RedBlackTree(alias less)
{
this()
{
}
}
auto redBlackTree(alias less)()
{
return new RedBlackTree!(less)();
}
@save void test()
{
//static bool compare(double x, double y) { return x < y; }
//auto rbt2 = redBlackTree!(compare, double)(5.1, 2.3);
auto rbt2 = redBlackTree!((a, b) => a < b)();
//auto rbt2 = redBlackTree!((a, b){return a < b;})();
}
This fails to compile with -preview=dip1000 with:
test.d(18): Error: `@safe` function `test.test` cannot call `@system` function
`test.test.redBlackTree!((a, b) => a < b).redBlackTree`
test.d(11): which was inferred `@system` because of:
test.d(11): escaping reference to stack allocated value returned by `new
RedBlackTree!(__lambda1)`
test.d(9): `test.test.redBlackTree!((a, b) => a < b).redBlackTree` is
declared here
The lambda (a,b)=>a<b is resolved as a delegate, but since it never accesses
its delegate pointer, it is not really an escaping reference to something the
delegate may refer to.
The compiler should detect this and not issue the error.
--
More information about the Digitalmars-d-bugs
mailing list