@@ -231,7 +231,7 @@ object Matcher {
231231 scrutinee =?= expr2
232232
233233 /* Match selection */
234- case (ref : Ref , Select (qual2, _)) if symbolMatch(scrutinee.symbol , pattern.symbol ) =>
234+ case (ref : Ref , Select (qual2, _)) if symbolMatch(scrutinee, pattern) =>
235235 ref match
236236 case Select (qual1, _) => qual1 =?= qual2
237237 case ref : Ident =>
@@ -240,7 +240,7 @@ object Matcher {
240240 case _ => matched
241241
242242 /* Match reference */
243- case (_ : Ref , _ : Ident ) if symbolMatch(scrutinee.symbol , pattern.symbol ) =>
243+ case (_ : Ref , _ : Ident ) if symbolMatch(scrutinee, pattern) =>
244244 matched
245245
246246 /* Match application */
@@ -348,10 +348,19 @@ object Matcher {
348348 * - The scrutinee has is in the environment and they are equivalent
349349 * - The scrutinee overrides the symbol of the pattern
350350 */
351- private def symbolMatch (scrutinee : Symbol , pattern : Symbol )(using Env ): Boolean =
352- scrutinee == pattern
353- || summon[Env ].get(scrutinee).contains(pattern)
354- || scrutinee.allOverriddenSymbols.contains(pattern)
351+ private def symbolMatch (scrutineeTree : Tree , patternTree : Tree )(using Env ): Boolean =
352+ val scrutinee = scrutineeTree.symbol
353+ val devirtualizedScrutinee = scrutineeTree match
354+ case Select (qual, _) =>
355+ val sym = scrutinee.overridingSymbol(qual.tpe.typeSymbol)
356+ if sym.exists then sym
357+ else scrutinee
358+ case _ => scrutinee
359+ val pattern = patternTree.symbol
360+
361+ devirtualizedScrutinee == pattern
362+ || summon[Env ].get(devirtualizedScrutinee).contains(pattern)
363+ || devirtualizedScrutinee.allOverriddenSymbols.contains(pattern)
355364
356365 private object ClosedPatternTerm {
357366 /** Matches a term that does not contain free variables defined in the pattern (i.e. not defined in `Env`) */
0 commit comments