-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
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
Internal error: StackOverflowError() #26665
Comments
Still an issue with latest master version. |
This is still an issue with 0.7-rc2. I have written a very qualitative description of when we seem to encounter the issue (which is now a hang rather than a segfault, depending on where we run it), in my third post on the thread here [1]. The issue is a showstopper for us, as it occurs widely across our package. It's not an isolated corner case, though it is somehow related to the complexity of the types that can be built up. We don't believe it can be triggered on fairly simple types or with a fairly simple method table. We are trying to find a more minimal example, separated from AbstractAlgebra.jl, though this seems to be hard to do due to the nature of the bug. [1] https://discourse.julialang.org/t/tests-do-not-start-after-some-minutes/12503 |
Can you post a manifest file? |
Thanks for bumping this. As long as we have some way to reproduce it we can make progress. |
I can reproduce this locally but there are a lot of deprecation warnings. It's hard not to wonder if fixing the depreciation warnings might make this issue go away. Do you have a version with the deprecations fixed? |
We don't have a version without the deprecation warnings. I don't think they are relevant, but we will check as soon as we can, to make sure. The issue arises because of a hang in type inference, to do with unions of abstract types and concrete types, as far as we can tell. So I think it is fairly fundamental. Was the manifest question (which I am not yet familiar with) just to be able to reproduce the issue? |
Yes; not necessary since I managed to reproduce it. Here's the manifest that I reproduced it with: [[AbstractAlgebra]]
deps = ["Test"]
path = "/Users/stefan/dev/AbstractAlgebra"
uuid = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
version = "0.0.9+"
[[Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
[[Distributed]]
deps = ["LinearAlgebra", "Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
[[InteractiveUtils]]
deps = ["LinearAlgebra", "Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
[[Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
[[LinearAlgebra]]
deps = ["Libdl"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
[[Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
[[Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
[[Random]]
deps = ["Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
[[Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
[[Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
[[Test]]
deps = ["Distributed", "InteractiveUtils", "Logging", "Random"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" |
Would be good to have the Project file as way just for convenience |
[deps]
AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d" |
What a beautiful type: Tuple{typeof(Base.:(*)), T, AbstractAlgebra.Generic.SparsePoly{T}} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:Union{AbstractAlgebra.RingElem, AbstractFloat, Integer, Base.Rational{T} where T<:Integer}))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) |
As a lisper, I can say it definitely almost has enough close parentheses. |
Recursion is not a crime.
More seriously, we don't create types that deep anywhere (at least not
intentionally). I guess you realised that though.
|
couldn't agree more :) |
I see what's wrong and have started work on a fix. Here's the shape of the recursion limiting results: sig = Tuple{typeof(Base.:(*)), T, AbstractAlgebra.Generic.SparsePoly{T}} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:Union{AbstractAlgebra.RingElem, AbstractFloat, Integer, Base.Rational{T} where T<:Integer}))))) comparison = Tuple{typeof(Base.:(*)), T, AbstractAlgebra.Generic.SparsePoly{T}} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:(AbstractAlgebra.Generic.SparsePoly{T} where T<:Union{AbstractAlgebra.RingElem, AbstractFloat, Integer, Base.Rational{T} where T<:Integer})))) callstack: |
There's several related issues here: 1. Covariant kinds provide no meaningful information for the type size limit heuristic. We should be just ignoring those and walking through to the actual structural information of any real substance. This seems to also make type_more_complex, _limit_type_size, and is_derived_type more similar, which is probably always preferable. 2. Allowing type intersection to revise our type later can cause it to reintroduce complexity (constraints) according to our metric, while we want to only move up the type-hierarchy, which can allow us to accidentally escape from the limit. So if we've limited the type, we don't want to use a different type that was derived by type-intersection and may not have our limits applied anymore. 3. Inside `is_derived_type`, the var field of a UnionAll should not increase the nesting depth, since `T<:(Ref{S} where S<:Any)`, should observe the same depth as `{S<:Any, T<:Ref{S}}`. fix #26665
There's several related issues here: 1. Covariant kinds provide no meaningful information for the type size limit heuristic. We should be just ignoring those and walking through to the actual structural information of any real substance. This seems to also make type_more_complex, _limit_type_size, and is_derived_type more similar, which is probably always preferable. 2. Allowing type intersection to revise our type later can cause it to reintroduce complexity (constraints) according to our metric, while we want to only move up the type-hierarchy, which can allow us to accidentally escape from the limit. So if we've limited the type, we don't want to use a different type that was derived by type-intersection and may not have our limits applied anymore. 3. Inside `is_derived_type`, the var field of a UnionAll should not increase the nesting depth, since `T<:(Ref{S} where S<:Any)`, should observe the same depth as `{S<:Any, T<:Ref{S}}`. fix #26665
There's several related issues here: 1. Covariant kinds provide no meaningful information for the type size limit heuristic. We should be just ignoring those and walking through to the actual structural information of any real substance. This seems to also make type_more_complex, _limit_type_size, and is_derived_type more similar, which is probably always preferable. 2. Allowing type intersection to revise our type later can cause it to reintroduce complexity (constraints) according to our metric, while we want to only move up the type-hierarchy, which can allow us to accidentally escape from the limit. So if we've limited the type, we don't want to use a different type that was derived by type-intersection and may not have our limits applied anymore. 3. Inside `is_derived_type`, the var field of a UnionAll should not increase the nesting depth, since `T<:(Ref{S} where S<:Any)`, should observe the same depth as `{S<:Any, T<:Ref{S}}`. fix #26665
I was testing https://github.com/Nemocas/AbstractAlgebra.jl on 0.7 and ran into the following issue on
The following works fine:
If you put it in a function, julia maxes out the CPU for a few minutes and throws a
StackOverFlow()
:See (https://gist.github.com/thofma/c6a252bce24f970940f7effa413ed792) for the full stacktrace.
Note that everything works fine on 0.6.2. I also looked at the subtyping/stack overflow issues, but the stacktraces looked different.
The text was updated successfully, but these errors were encountered: