From f8931ab794d6b803dee1d48e281c645097f1f4e3 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Mon, 25 Mar 2019 14:18:33 +0100 Subject: [PATCH 1/2] Fix #6033: avoid capture conversion if member absent --- compiler/src/dotty/tools/dotc/core/TypeComparer.scala | 2 +- tests/pos/i6033.scala | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 tests/pos/i6033.scala diff --git a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala index 3e7fce488a6a..3a85fc14b47b 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala @@ -1081,7 +1081,7 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] { */ def compareCaptured(arg1: TypeBounds, arg2: Type) = tparam match { case tparam: Symbol - if leftRoot.isStable || ctx.isAfterTyper || ctx.mode.is(Mode.TypevarsMissContext) => + if leftRoot.isStable || (ctx.isAfterTyper || ctx.mode.is(Mode.TypevarsMissContext)) && leftRoot.member(tparam.name).exists => val captured = TypeRef(leftRoot, tparam) assert(captured.exists, i"$leftRoot has no member $tparam in isSubArgs($args1, $args2, $tp1, $tparams2)") isSubArg(captured, arg2) diff --git a/tests/pos/i6033.scala b/tests/pos/i6033.scala new file mode 100644 index 000000000000..40e8ca557dc8 --- /dev/null +++ b/tests/pos/i6033.scala @@ -0,0 +1,5 @@ +class Test { + def f(a: Array[_]|Null): Unit = a match { + case x: Array[Int] => + } +} From f05e5956f6ae59be489bc9619800cabaf138b8ce Mon Sep 17 00:00:00 2001 From: Fengyun Liu Date: Wed, 27 Mar 2019 06:54:57 +0100 Subject: [PATCH 2/2] Address review --- compiler/src/dotty/tools/dotc/core/TypeComparer.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala index 3a85fc14b47b..902b099ccf20 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeComparer.scala @@ -1083,7 +1083,6 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] { case tparam: Symbol if leftRoot.isStable || (ctx.isAfterTyper || ctx.mode.is(Mode.TypevarsMissContext)) && leftRoot.member(tparam.name).exists => val captured = TypeRef(leftRoot, tparam) - assert(captured.exists, i"$leftRoot has no member $tparam in isSubArgs($args1, $args2, $tp1, $tparams2)") isSubArg(captured, arg2) case _ => false