diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index aaec08fbe735..6728cab6f3d0 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -1478,8 +1478,10 @@ class Typer extends Namer case _ => if tree.isInline then checkInInlineContext("inline match", tree.srcPos) val sel1 = typedExpr(tree.selector) - val selType = fullyDefinedType(sel1.tpe, "pattern selector", tree.span).widen - + val rawSelectorTpe = fullyDefinedType(sel1.tpe, "pattern selector", tree.span) + val selType = rawSelectorTpe match + case c: ConstantType if tree.isInline => c + case otherTpe => otherTpe.widen /** Extractor for match types hidden behind an AppliedType/MatchAlias */ object MatchTypeInDisguise { def unapply(tp: AppliedType): Option[MatchType] = tp match { diff --git a/tests/pos/i12715/full.scala b/tests/pos/i12715/full.scala new file mode 100644 index 000000000000..2f10dd5aaaf5 --- /dev/null +++ b/tests/pos/i12715/full.scala @@ -0,0 +1,28 @@ +package repro + +import compiletime.{constValue, erasedValue} + +sealed trait ValidateExprInt + +class And[A <: ValidateExprInt, B <: ValidateExprInt] extends ValidateExprInt +class GreaterThan[T <: Int] extends ValidateExprInt + +object Repro: + inline def validate[E <: ValidateExprInt](v: Int): String = + val failMsg = validateV[E](v) + if failMsg == "neverPass" then "neverPass" + else "something else" + + transparent inline def validateV[E <: ValidateExprInt](v: Int): String = + inline erasedValue[E] match + case _: GreaterThan[t] => + "GreaterThan" + case _: And[a, b] => + inline validateV[a](v) match + case "" => + validateV[b](v) + case other => + other + + @main def test(): Unit = + println(validate[And[GreaterThan[10], GreaterThan[12]]](5)) diff --git a/tests/pos/i12715/minimized.scala b/tests/pos/i12715/minimized.scala new file mode 100644 index 000000000000..4bd8a2b1a404 --- /dev/null +++ b/tests/pos/i12715/minimized.scala @@ -0,0 +1,8 @@ +transparent inline def f: String = + inline 10 match + case _ => + inline "foo" match + case x : String => x + +def test = + inline val failMsg = f