diff options
author | Paul Phillips <paulp@improving.org> | 2012-10-01 05:44:50 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-10-01 07:11:41 -0700 |
commit | d2074796a8b822c4c82faecc8eb0eef4837508e3 (patch) | |
tree | f268171ea21f98a5c4d32185a59106f657b9912e /test/files/run/collection-stacks.scala | |
parent | c479a0e3a1fc5d5ee7391ecc8a0d599fd74bb40f (diff) | |
download | scala-d2074796a8b822c4c82faecc8eb0eef4837508e3.tar.gz scala-d2074796a8b822c4c82faecc8eb0eef4837508e3.tar.bz2 scala-d2074796a8b822c4c82faecc8eb0eef4837508e3.zip |
Fix for TypeVar instantiation.
In an effort to reduce the enormous amount of duplication
which now exists among methods which attempt to deduce something
about the relationship between two types, a sampling (and only
a sampling - this might not even be half of them) given here:
def isAsSpecific(ftpe1: Type, ftpe2: Type): Boolean
def isCompatibleByName(tp: Type, pt: Type): Boolean
def isConservativelyCompatible(tp: Type, pt: Type): Boolean
def isConsistent(tp1: Type, tp2: Type): Boolean
def isDifferentType(tp1: Type, tp2: Type): Boolean
def isDifferentTypeConstructor(tp1: Type, tp2: Type): Boolean
def isDistinguishableFrom(t1: Type, t2: Type): Boolean
def isNeverSubType(tp1: Type, tp2: Type): Boolean
def isNumericSubType(tp1: Type, tp2: Type): Boolean
def isPlausiblyCompatible(tp: Type, pt: Type): Boolean
def isPopulated(tp1: Type, tp2: Type): Boolean
def isSameType(tp1: Type, tp2: Type): Boolean
def isSameType2(tp1: Type, tp2: Type): Boolean
def isSubType(tp1: Type, tp2: Type): Boolean
def isWeakSubType(tp1: Type, tp2: Type): Boolean
def isWeaklyCompatible(tp: Type, pt: Type): Boolean
def matches(tpe1: Type, tpe2: Type): Boolean
def overlaps(tp1: Type, tp2: Type): Boolean
def typesConform(tp: Type, pt: Type): Boolean
I began pulling a thread left by moors in isPopulated:
need to investgate why this can't be made symmetric --
neg/gadts1 fails, and run/existials also.
Followed that to this code in TypeVar:
val newInst = wildcardToTypeVarMap(tp)
(constr isWithinBounds newInst) && { setInst(tp); true }
-------^
That was the obstacle to symmetry, because it creates a
cycle in e.g. run/existentials. Kept pulling the string,
came back to my own comment of long ago:
!!! Is it somehow guaranteed that this will not break
under nesting? In general one has to save and restore
the contents of the field...
Decided that uncertainty could no longer be tolerated.
Unless it can be proven somehow that there will never be
crosstalk among the save/suspension points, we should do
it this way even if nothing demands it yet.
What's in this commit:
- Made isPopulated symmetric.
- Made setInst resistant to TypeVar cycles.
- Fixed above mentioned bug in registerTypeEquality.
- Added some rigor to the suspension/unsuspension of TypeVars
so it will not break under nesting.
- Recovered pos/t0851.scala from its deletion.
Diffstat (limited to 'test/files/run/collection-stacks.scala')
0 files changed, 0 insertions, 0 deletions