Difference between "can call" and "can compile"
FeepingCreature
feepingcreature at gmail.com
Tue Sep 8 05:03:30 UTC 2020
On Monday, 7 September 2020 at 16:10:13 UTC, Steven Schveighoffer
wrote:
>
> This is somewhat different than what I was proposing. However,
> it's very closely related.
>
> I absolutely need it to be matched with a function call, I
> don't want to have to do type acrobatics or check for UFCS, or
> whatever.
>
> However, I think both our needs are satisfied if the feature is
> something like checking to see that all symbols are resolved
> and that all instantiations are unambiguous. What happens after
> that should be considered a normal ungagged error.
>
> If I can pull out a non-template analogy, imagine you had code
> like:
>
> int foo()
> {
> blahblah(); // unresolved symbol
> }
>
> int bar()
> {
> return foo();
> }
>
> And instead of the error on the "blahblah" line, you got an
> error that foo doesn't exist, and so bar cannot be compiled.
> This is kind of how the current template state of affairs is. I
> want the same benefits for template code that non-template code
> has.
>
> -Steve
Yesss.
Okay, so as far as I can see there's two avenues that should give
us both what we want. The first, and IMO best one (but W&A won't
agree) is a huge breaking language change that errors in
templates that have matched the constraints are always reported
as errors, even in a gagged context. The second, more limited one
that I think also gives you what you want (?) is a pragma *like*
__traits(compiles), maybe __traits(instantiates), with the change
that instead of gagging everything, it captures only one category
of error - "the call couldn't find a matching function or
template" - and only from the expression directly passed to it.
All other errors are reported as usual.
Would that do it?
More information about the Digitalmars-d
mailing list