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

fix regression with generic params in static type #24075

Merged
merged 3 commits into from
Sep 9, 2024

Conversation

metagn
Copy link
Collaborator

@metagn metagn commented Sep 7, 2024

Caught in https://github.com/metagn/applicates, I'm not sure which commit causes this but it's also in the 2.0 branch (but not 2.0.2), so it's not any recent PRs.

If a proc has a static parameter with type static Foo[T], then another parameter with type static Bar[T, U], the generic instantiation for Bar doesn't match U which has type tyGenericParam, but matches T since it has type tyTypeDesc. The reason is that concreteType returns the type itself for tyTypeDesc if c.isNoCall (i.e. matching a generic invocation), but returns nil for tyGenericParam. I'm guessing tyGenericParam is received here because of #22618, but that doesn't explain why T is still tyTypeDesc. I'm not sure.

Regardless, we can just copy the behavior for tyTypeDesc to tyGenericParam and also return the type itself when c.isNoCall. This feels like it defeats the purpose of concreteType but the way it's used doesn't make sense without it (generic param can't match another generic param?). Alternatively we could loosen the if concrete == nil: return isNone checks in some places for specific conditions, whether c.isNoCall or c.inGenericContext == 0 (though this would need #24005).

metagn added a commit to metagn/applicates that referenced this pull request Sep 7, 2024
@metagn metagn force-pushed the static-generic-param-regression branch from 268237a to 3873d06 Compare September 9, 2024 00:04
@Araq Araq merged commit 24e5b21 into nim-lang:devel Sep 9, 2024
19 checks passed
Copy link
Contributor

github-actions bot commented Sep 9, 2024

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

Hint: mm: orc; opt: speed; options: -d:release
174193 lines; 8.271s; 655.215MiB peakmem

narimiran pushed a commit that referenced this pull request Dec 16, 2024
Caught in https://github.com/metagn/applicates, I'm not sure which
commit causes this but it's also in the 2.0 branch (but not 2.0.2), so
it's not any recent PRs.

If a proc has a static parameter with type `static Foo[T]`, then another
parameter with type `static Bar[T, U]`, the generic instantiation for
`Bar` doesn't match `U` which has type `tyGenericParam`, but matches `T`
since it has type `tyTypeDesc`. The reason is that `concreteType`
returns the type itself for `tyTypeDesc` if `c.isNoCall` (i.e. matching
a generic invocation), but returns `nil` for `tyGenericParam`. I'm
guessing `tyGenericParam` is received here because of #22618, but that
doesn't explain why `T` is still `tyTypeDesc`. I'm not sure.

Regardless, we can just copy the behavior for `tyTypeDesc` to
`tyGenericParam` and also return the type itself when `c.isNoCall`. This
feels like it defeats the purpose of `concreteType` but the way it's
used doesn't make sense without it (generic param can't match another
generic param?). Alternatively we could loosen the `if concrete == nil:
return isNone` checks in some places for specific conditions, whether
`c.isNoCall` or `c.inGenericContext == 0` (though this would need

(cherry picked from commit 24e5b21)
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