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

Remove seen from TypeSizeAccumulator #20459

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft

Conversation

eejbyfeldt
Copy link

This fixes #15692 and does not seem to break any existing compilation tests. The problem with seen logic is that give types with repeated types will get a lower size and this incorrectly triggers the divergence check since #15692 some of the steps involved less repeated types.

The seen logic was introduced in #6329 and the motivation was to deal with F-bounds. Since no tests fail it not clear if this logic is still needed to deal with F-bounds? If it is still needed we can add a test that fails and instead of removing the seen logic we can make it track only types the appear as a bound and could cause infinite recursion instead of tracking all.

This fixes scala#15692 and does not seem to break an existing compilation
tests. The problem with seen when it comes scala#15692 is that seen means
that type that has repeated types will get a lower size and this
incorrectly triggers the divergence check since some of the steps
involved less repeated types.

The seen logic was introduced in scala#6329 and the motivation was to deal
with F-bounds. Since not tests fail it not clear if this logic is still
needed to deal with F-bounds? If it is still needed we can add a test
and instead of removing the seen logic we can make it track only types
the appear as a bound and could cause infinite recursion instead of
tracking all.
@odersky
Copy link
Contributor

odersky commented May 23, 2024

I agree it would be good to think of an F-bounded test where the change proposed here would fail. I believe such tests exist, but they might be a bit tricky to find.

I also agree that the current state, i.e. simply not counting types twice, is wrong. One thing we could do is have a seen check only for LazyRef types. In principle(*), every F-bounded recursion should go through a LazyRef. So if we stop traversing after the first time at a LazyRef, we should still be safe.

(*) I say in principle, since these protecting LazyRefs are introduced only after the type is first constructed, in checkNonCyclic. But hopefully the check is done before we do an implicit search on a type. F-bounds are a curse, it would be so nice if we could get rid of them!

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.

Math using implicits no longer works
3 participants