From 7e138cc15a29b09b77551db9d6e92e841fd0d197 Mon Sep 17 00:00:00 2001 From: liu fengyun Date: Fri, 24 Nov 2017 17:01:06 +0100 Subject: [PATCH 1/2] Fix #3548: set outer select type to be the type enclosing the expected type Otherwise, ElimOuterSelect will insert `ensureConforms(tp)` in outer test, which causes run-time exeception. --- .../tools/dotc/transform/PatternMatcher.scala | 2 +- tests/run/i3548.scala | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/run/i3548.scala diff --git a/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala b/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala index a562410b262c..1ca2635eb6a5 100644 --- a/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala +++ b/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala @@ -771,7 +771,7 @@ object PatternMatcher { val expectedClass = expectedTp.dealias.classSymbol.asClass ExplicitOuter.ensureOuterAccessors(expectedClass) scrutinee.ensureConforms(expectedTp) - .outerSelect(1, expectedOuter.tpe.widen) + .outerSelect(1, expectedClass.owner.typeRef) .select(defn.Object_eq) .appliedTo(expectedOuter) } diff --git a/tests/run/i3548.scala b/tests/run/i3548.scala new file mode 100644 index 000000000000..7d0d47a87269 --- /dev/null +++ b/tests/run/i3548.scala @@ -0,0 +1,19 @@ +trait Common { + case class Data(a: String) +} +object O1 extends Common +object O2 extends Common + +object Test { + def main(args: Array[String]): Unit = { + + val data = O2.Data("test") + + // Runtime error: java.lang.ClassCastException: O2$ cannot be cast to O1$ + data match { + case O1.Data(s) => println("O1 data") + case O2.Data(s) => println("O2 data") + case _ => println("Unknown") + } + } +} \ No newline at end of file From 37dca3b1b73f0fc84f9662fd3d49c0249f59b1f2 Mon Sep 17 00:00:00 2001 From: liu fengyun Date: Fri, 24 Nov 2017 17:23:39 +0100 Subject: [PATCH 2/2] address review: update test --- tests/run/i3548.scala | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/run/i3548.scala b/tests/run/i3548.scala index 7d0d47a87269..5dc6739934b8 100644 --- a/tests/run/i3548.scala +++ b/tests/run/i3548.scala @@ -9,11 +9,12 @@ object Test { val data = O2.Data("test") - // Runtime error: java.lang.ClassCastException: O2$ cannot be cast to O1$ - data match { - case O1.Data(s) => println("O1 data") - case O2.Data(s) => println("O2 data") - case _ => println("Unknown") + val result = data match { + case O1.Data(s) => 1 + case O2.Data(s) => 2 + case _ => 3 } + + assert(result == 2) } } \ No newline at end of file