@@ -3,7 +3,7 @@ package dotc
33package typer
44
55import core ._
6- import ast ._
6+ import ast .{ tpd , _ }
77import Trees ._
88import Constants ._
99import StdNames ._
@@ -28,15 +28,17 @@ import EtaExpansion.etaExpand
2828import dotty .tools .dotc .transform .Erasure .Boxing
2929import util .Positions ._
3030import util .common ._
31- import util .{SourcePosition , Property }
31+ import util .{Property , SourcePosition }
32+
3233import collection .mutable
3334import annotation .tailrec
3435import Implicits ._
35- import util .Stats .{track , record }
36- import config .Printers .{typr , gadts }
36+ import util .Stats .{record , track }
37+ import config .Printers .{gadts , typr }
3738import rewrite .Rewrites .patch
3839import NavigateAST ._
3940import transform .SymUtils ._
41+
4042import language .implicitConversions
4143import printing .SyntaxHighlighting ._
4244
@@ -2126,17 +2128,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
21262128 typed(untpd.Select (untpd.TypedSplice (tree), nme.apply), pt)
21272129 }
21282130 else if (ctx.mode is Mode .Pattern ) {
2129- tree match {
2130- case _ : RefTree | _ : Literal
2131- if ! isVarPattern(tree) &&
2132- ! (tree.tpe <:< pt)(ctx.addMode(Mode .GADTflexible )) =>
2133- val cmp =
2134- untpd.Apply (
2135- untpd.Select (untpd.TypedSplice (tree), nme.EQ ),
2136- untpd.TypedSplice (dummyTreeOfType(pt)))
2137- typedExpr(cmp, defn.BooleanType )(ctx.retractMode(Mode .Pattern ))
2138- case _ =>
2139- }
2131+ checkEqualityEvidence(tree, pt)
21402132 tree
21412133 }
21422134 else if (tree.tpe <:< pt) {
@@ -2289,4 +2281,24 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
22892281 }
22902282 }
22912283 }
2284+
2285+ /** Check that `tree == x: pt` is typeable. Used when checking a pattern
2286+ * against a selector of type `pt`. This implementation accounts for
2287+ * user-defined definitions of `==`.
2288+ *
2289+ * Overwritten to no-op in ReTyper.
2290+ */
2291+ protected def checkEqualityEvidence (tree : tpd.Tree , pt : Type )(implicit ctx : Context ) : Unit = {
2292+ tree match {
2293+ case _ : RefTree | _ : Literal
2294+ if ! isVarPattern(tree) &&
2295+ ! (tree.tpe <:< pt) (ctx.addMode(Mode .GADTflexible )) =>
2296+ val cmp =
2297+ untpd.Apply (
2298+ untpd.Select (untpd.TypedSplice (tree), nme.EQ ),
2299+ untpd.TypedSplice (dummyTreeOfType(pt)))
2300+ typedExpr(cmp, defn.BooleanType )
2301+ case _ =>
2302+ }
2303+ }
22922304}
0 commit comments