From 35b70a971c6a69dd8df417b65b0f9e22444fc2f4 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Wed, 24 Feb 2021 16:11:06 +0100 Subject: [PATCH 1/3] Harden type checking for enum values This is a follow-up of #11327. We cannot generalize further without complications: ``` val b = 'b' 56 match case 'a' => case `b` => ``` --- .../src/dotty/tools/dotc/typer/Typer.scala | 2 +- tests/neg/i9740b.scala | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/neg/i9740b.scala diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index 71265fc07249..0a4612cf2d69 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -3803,7 +3803,7 @@ class Typer extends Namer mapOver(tp) } - if tree.symbol.is(Module) + if tree.symbol.isOneOf(Module | Enum) && !(tree.tpe frozen_<:< pt) // fast track && !(tree.tpe frozen_<:< approx(pt)) then diff --git a/tests/neg/i9740b.scala b/tests/neg/i9740b.scala new file mode 100644 index 000000000000..8006056684c7 --- /dev/null +++ b/tests/neg/i9740b.scala @@ -0,0 +1,19 @@ +enum Recovery: + case RecoveryCompleted + +enum TypedRecovery: + case TypedRecoveryCompleted + +import Recovery.* +import TypedRecovery.* + +class Test { + TypedRecoveryCompleted match { + case RecoveryCompleted => println("Recovery completed") // error + case TypedRecoveryCompleted => println("Typed recovery completed") + } + + def foo(x: TypedRecovery) = x match + case RecoveryCompleted => // error + case TypedRecoveryCompleted => +} From 71aac7f92f5af868e353f8bc3fc87734860cdad2 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Wed, 24 Feb 2021 16:27:28 +0100 Subject: [PATCH 2/3] Remove unreachable branch --- .../tools/scaladoc/translators/ScalaSignatureProvider.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureProvider.scala b/scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureProvider.scala index 6d3667fdab62..a2ade47bbbb2 100644 --- a/scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureProvider.scala +++ b/scaladoc/src/dotty/tools/scaladoc/translators/ScalaSignatureProvider.scala @@ -22,8 +22,6 @@ object ScalaSignatureProvider: givenClassSignature(documentable, cls, builder) case Kind.Given(d: Kind.Def, _, _) => givenMethodSignature(documentable, d, builder) - case Kind.Given(Kind.Val, _, _) => - givenPropertySignature(documentable, builder) case cls: Kind.Class => classSignature(documentable, cls, builder) case enm: Kind.Enum => From f7e0d31e519c93d489d5082ac64fc7d5c3bac3d6 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Wed, 24 Feb 2021 17:13:17 +0100 Subject: [PATCH 3/3] Fix tests --- tests/run/option-extract.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run/option-extract.scala b/tests/run/option-extract.scala index 7b87ad28bc68..e0397afcf903 100644 --- a/tests/run/option-extract.scala +++ b/tests/run/option-extract.scala @@ -6,7 +6,7 @@ enum Option[+A]: opaque type ExtractResult[B] = (=> B) => B def extract[B](f: A => B): ExtractResult[B] = - def result(default: => B): B = this match + def result(default: => B): B = (this: Option[A]) match case None => default case Some(elem) => f(elem) result