diff --git a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala index f0a22c9f62a4..a8a1be309b0c 100644 --- a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala @@ -2179,7 +2179,7 @@ object SymDenotations { Stats.record("basetype cache entries") if (!baseTp.exists) Stats.record("basetype cache NoTypes") } - if (!tp.isProvisional && !CapturingType.isUncachable(tp)) + if !(tp.isProvisional || CapturingType.isUncachable(tp) || ctx.gadt.isNarrowing) then btrCache(tp) = baseTp else btrCache.remove(tp) // Remove any potential sentinel value diff --git a/tests/pos/i19521.scala b/tests/pos/i19521.scala new file mode 100644 index 000000000000..19230fa4ed69 --- /dev/null +++ b/tests/pos/i19521.scala @@ -0,0 +1,13 @@ + +final abstract class PLet + +sealed trait Expr[+P] +case class ELet[+A](name: String, expr: Expr[A]) extends Expr[A | PLet] + +def go[P](e: Expr[P]): P = e match + case ELet(_, _) => + val x: Expr[P] | ELet[P] = ??? + val y: Expr[P] = x // conforms iff using gadt constraints + // error before changes: cast from gadt reasoning was not inserted because + // `Expr[P]` was erronously cached as a baseType of `Expr[P] | ELet[P]` (only true with gadt constraints) + ???