Bug 13683 – More precise error message for wrong lambda

Status
REOPENED
Severity
enhancement
Priority
P4
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-11-04T10:53:56Z
Last change time
2024-12-01T16:22:52Z
Keywords
diagnostic
Assigned to
No Owner
Creator
bearophile_hugs
See also
https://issues.dlang.org/show_bug.cgi?id=14217, https://issues.dlang.org/show_bug.cgi?id=23663
Moved to GitHub: phobos#10096 →

Comments

Comment #0 by bearophile_hugs — 2014-11-04T10:53:56Z
This is wrong code: class Foo {} void main() { import std.algorithm: all; Foo[] data; assert(data.all!(f => f != null)); } DMD 2.067alpha gives: test.d(5,16): Error: template std.algorithm.all cannot deduce function from argument types !((f) => f != null)(Foo[]), candidates are: ..\dmd2\src\phobos\std\algorithm.d(12251,1): std.algorithm.all(alias pred = "a") The correct code needs "!is" instead of "!=": assert(data.all!(f => f !is null)); The error message should tell me more precisely what's the problem.
Comment #1 by nick — 2018-06-23T13:27:33Z
Changing to phobos bug because `all`'s constraint uses: is(typeof(unaryFun!pred(range.front))) Instead this could be made a static assert, so at least the user can be informed that the predicate is not callable with Foo.
Comment #2 by greensunny12 — 2018-06-24T14:59:55Z
An attempt at adding the better error message to Phobos: https://github.com/dlang/phobos/pull/6607
Comment #3 by github-bugzilla — 2018-11-19T07:45:08Z
Commits pushed to master at https://github.com/dlang/phobos https://github.com/dlang/phobos/commit/887f7558e01535cc570b169d65358a7282361564 Fix Issue 13683 - More precise error message for wrong lambda https://github.com/dlang/phobos/commit/f953e2c31137ce529da89a256ce9057cb06c8ec5 Merge pull request #6607 from wilzbach/fix-13683 [RFC] Fix Issue 13683 - More precise error message for wrong lambda
Comment #4 by b2.temp — 2018-11-19T08:10:02Z
More phobos algorithm that use lambda must be chnaged, in the same fashion, before closing. Seb's PR was "just" a RFC.
Comment #5 by nick — 2023-03-11T15:15:51Z
static assert is an improvement over the constraint, but it still hides the actual error message which should be: Error: use `!is` instead of `!=` when comparing with `null` Removing the constraint allows the correct error to be seen. But then the constraint may be needed to disambiguate overloads. Without a compiler solution, we could have a new trait - __traits(canPass, pred, range.front) which ignores the body of pred: https://forum.dlang.org/post/[email protected] In the absence of that, the best I've come up with is: if (__traits(isTemplate, pred) || is(typeof(pred(range.front)))) Which doesn't check that pred can take that argument when pred is a lambda, but it doesn't hide the actual error unlike the constraint status quo or the static assert way. A compiler solution might not work in the presence of overloads, because currently failing constraints are only shown when there are no overloads.
Comment #6 by nick — 2023-03-11T15:19:05Z
> Without a compiler solution BTW that would show the failing lambda with Phobos as is. The static assert PR discussion said a compiler solution is needed rather than having to update every template that accepts a lambda in Phobos.
Comment #7 by robert.schadek — 2024-12-01T16:22:52Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/10096 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB