Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

better errors for standalone explicit generic instantiations #24276

Merged
merged 1 commit into from
Oct 18, 2024

Conversation

metagn
Copy link
Collaborator

@metagn metagn commented Oct 10, 2024

refs #8064, refs #24010

Error messages for standalone explicit generic instantiations are revamped. Failing standalone explicit generic instantiations now only error after overloading has finished and resolved to the default [] magic (this means [] can now be overloaded for procs but this isn't necessarily intentional, in #24010 it was documented that it isn't possible). The error messages for failed instantiations are also no longer a simple cannot instantiate: foo message, instead they now give the same type mismatch error message as overloads with mismatching explicit generic parameters.

This is now possible due to the changes in #24010 that delegate all explicit generic proc instantiations to overload resolution. Old code that worked around this is now removed. maybeInstantiateGeneric could maybe also be removed in favor of just explicitGenericSym, the result == n case is due to explicitGenericInstError which is only for niche cases.

Also, to cause "ambiguous identifier" error messages when the explicit instantiation is a symchoice and the expression context doesn't allow symchoices, we semcheck the sym/symchoice created by explicitGenericSym with the given expression flags.

#8064 isn't entirely fixed because the error message is still misleading for the original case which does values[1], as a consequence of #12664.

@metagn metagn changed the title better errors for explicit generic instantiations better errors for standalone explicit generic instantiations Oct 10, 2024
@Araq Araq merged commit 0a058a6 into nim-lang:devel Oct 18, 2024
19 checks passed
Copy link
Contributor

Thanks for your hard work on this PR!
The lines below are statistics of the Nim compiler built from 0a058a6

Hint: mm: orc; opt: speed; options: -d:release
175204 lines; 8.388s; 655.301MiB peakmem

Araq pushed a commit that referenced this pull request Nov 6, 2024
fixes issue described in https://forum.nim-lang.org/t/12579

In #24065 explicit generic parameter matching was made to fail matches
on arguments with unresolved types in generic contexts (the sigmatch
diff, following #24010), similar to what is done for regular calls since
#22029. However unlike regular calls, a failed match in a generic
context for a standalone explicit generic instantiation did not convert
the expression into one with `tyFromExpr` type, which means it would
error immediately given any unresolved parameter. This is now done to
fix the issue.

For explicit generic instantiations on single non-overloaded symbols, a
successful match is still instantiated. For multiple overloads (i.e.
symchoice), if any of the overloads fail the match, the entire
expression is considered untyped and any instantiations are not used, so
as to not void overloads that would match later. This means even
symchoices without unresolved arguments aren't instantiated, which may
be too restrictive, but it could also be too lenient and we might need
to make symchoice instantiations always untyped. The behavior for
symchoice is not sound anyway given it causes #9997 so this is something
to consider for a redesign.

Diff follows #24276.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants