Issue 13683 - More precise error message for wrong lambda
Summary: More precise error message for wrong lambda
Status: REOPENED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All All
: P4 enhancement
Assignee: No Owner
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2014-11-04 10:53 UTC by bearophile_hugs
Modified: 2024-12-01 16:22 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2014-11-04 10:53:56 UTC
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 Nick Treleaven 2018-06-23 13:27:33 UTC
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 Seb 2018-06-24 14:59:55 UTC
An attempt at adding the better error message to Phobos: https://github.com/dlang/phobos/pull/6607
Comment 3 github-bugzilla 2018-11-19 07:45:08 UTC
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 basile-z 2018-11-19 08:10:02 UTC
More phobos algorithm that use lambda must be chnaged, in the same fashion, before closing. Seb's PR was "just" a RFC.
Comment 5 Nick Treleaven 2023-03-11 15:15:51 UTC
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/lekofsbnstkoqpspramg@forum.dlang.org

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 Nick Treleaven 2023-03-11 15:19:05 UTC
> 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 dlangBugzillaToGithub 2024-12-01 16:22:52 UTC
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