From 62a22561b0597af2eb53257c7f8148d507d0c3c1 Mon Sep 17 00:00:00 2001 From: Aleksander Boruch-Gruszecki Date: Mon, 10 May 2021 10:25:35 +0200 Subject: [PATCH] GADTs: consider singletons when checking inv. refinement --- .../dotty/tools/dotc/core/PatternTypeConstrainer.scala | 1 + tests/pos/i12390-gadt.scala | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/pos/i12390-gadt.scala diff --git a/compiler/src/dotty/tools/dotc/core/PatternTypeConstrainer.scala b/compiler/src/dotty/tools/dotc/core/PatternTypeConstrainer.scala index 72914ebfee11..4c33d6e3e933 100644 --- a/compiler/src/dotty/tools/dotc/core/PatternTypeConstrainer.scala +++ b/compiler/src/dotty/tools/dotc/core/PatternTypeConstrainer.scala @@ -196,6 +196,7 @@ trait PatternTypeConstrainer { self: TypeComparer => */ def constrainSimplePatternType(patternTp: Type, scrutineeTp: Type, widenParams: Boolean): Boolean = { def refinementIsInvariant(tp: Type): Boolean = tp match { + case tp: SingletonType => true case tp: ClassInfo => tp.cls.is(Final) || tp.cls.is(Case) case tp: TypeProxy => refinementIsInvariant(tp.underlying) case _ => false diff --git a/tests/pos/i12390-gadt.scala b/tests/pos/i12390-gadt.scala new file mode 100644 index 000000000000..1525350b56f7 --- /dev/null +++ b/tests/pos/i12390-gadt.scala @@ -0,0 +1,9 @@ +enum Func[-A, +B] { + case Double extends Func[Int, Int] + case ToString extends Func[Float, String] + + def run: A => B = this match { + case Double => (x: Int) => x * 2 + case ToString => (x: Float) => x.toString + } +}