diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-01-14 13:37:26 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-01-14 16:00:29 +0100 |
commit | a09e143b7fd1c6b433386d45e9c5ae3548819b59 (patch) | |
tree | 09ab06f0c5532588f6cf96bc132e751f116eea5b /test/files/pos/t690.scala | |
parent | 2e28cf7f76c3d5fd0c2df4274f1af9acb42de699 (diff) | |
download | scala-a09e143b7fd1c6b433386d45e9c5ae3548819b59.tar.gz scala-a09e143b7fd1c6b433386d45e9c5ae3548819b59.tar.bz2 scala-a09e143b7fd1c6b433386d45e9c5ae3548819b59.zip |
SI-8146 Fix non-deterministic <:< for deeply nested types
In the interests of keeping subtyping decidable [1], 152563b
added some bookkeeping to `isSubType` to detect cycles.
However, this was based on a hash set containing instances of
`SubTypePair`, and that class had inconsistencies between its
`hashCode` (in terms of `Type#hashCode`) and `equals`
(in terms of `=:=`).
This inconsistency can be seen in:
scala> trait C { def apply: (Int @unchecked) }
defined trait C
scala> val intUnchecked = typeOf[C].decls.head.info.finalResultType
intUnchecked: $r.intp.global.Type = Int @unchecked
scala> val p1 = new SubTypePair(intUnchecked, intUnchecked)
p1: $r.intp.global.SubTypePair = Int @unchecked <:<? Int @unchecked
scala> val p2 = new SubTypePair(intUnchecked.withoutAnnotations, intUnchecked.withoutAnnotations)
p2: $r.intp.global.SubTypePair = Int <:<? Int
scala> p1 == p2
res0: Boolean = true
scala> p1.hashCode == p2.hashCode
res1: Boolean = false
This commit switches to using `Type#==`, by way of the standard
case class equality.
The risk here is that you could find a subtyping computation that
progresses in such a manner that we don't detect the cycle. It would
need to produce an infinite stream of representations for types that
were `=:=` but not `==`. If that happened, we'd fail to terminate,
rather than judging the relationship as `false`.
[1] http://research.microsoft.com/pubs/64041/fool2007.pdf
Diffstat (limited to 'test/files/pos/t690.scala')
0 files changed, 0 insertions, 0 deletions