diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-10-30 18:42:56 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-10-31 09:24:02 +0100 |
commit | 251c2b9313728bbac5e47ee096b65d1183624650 (patch) | |
tree | f8f45da7d1632e04604d80808decf6e6df601f12 /test | |
parent | c38235fd44f1ccb280e31a2f34f58deb59c5b2ee (diff) | |
download | scala-251c2b9313728bbac5e47ee096b65d1183624650.tar.gz scala-251c2b9313728bbac5e47ee096b65d1183624650.tar.bz2 scala-251c2b9313728bbac5e47ee096b65d1183624650.zip |
SI-7944 FOUND: stray undetermined type params in vicinity of implicits
Implicit search created a nested Context into which the results of
its typechecking, namely, errors and undetermined type parameters
(roughly: those inferred as Nothing) are stashed.
The code the drives the process was checking for errors, but
discarded those undetermined type parameters.
This commit copies them from the child context to the parent,
which lets `Typer#adapt` to get to:
else if (hasUndetsInMonoMode) { // (9)
assert(!context.inTypeConstructorAllowed, context) //@M
instantiatePossiblyExpectingUnit(tree, mode, pt)
}
Our lost TypeVar has found its way home! The reward for which
is being instantiated, based on another type inference session
adapting the expression's type to the expected type.
Diffstat (limited to 'test')
-rw-r--r-- | test/files/pos/t7944.scala | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/test/files/pos/t7944.scala b/test/files/pos/t7944.scala new file mode 100644 index 0000000000..2fe2c5866d --- /dev/null +++ b/test/files/pos/t7944.scala @@ -0,0 +1,24 @@ +class M[+A, +B] + +object Test { + implicit class EitherOps[A, B](self: Either[A, B]) { + def disjunction: M[A, B] = null + } + + def foo = { + val l: Either[Int, Nothing] = Left[Int, Nothing](1) + + var ok = EitherOps(l).disjunction + + val runawayTypeVar = l.disjunction + + // reported bug: + // found : M[Int,B]; required: M[Int,Nothing] + val assign: M[Int, Nothing] = runawayTypeVar + + // variations on the theme, all failed before similarly. + val assign1: M[Int, Nothing] = {val temp = runawayTypeVar; temp} + val assign2: M[Int, String] = runawayTypeVar + val assign3: M[Int, Nothing] = {val temp = Left(1).disjunction; temp} + } +} |