diff --git a/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala b/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala index bd521c8679d0..0eeec0f3cbec 100644 --- a/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala +++ b/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala @@ -229,15 +229,15 @@ class CheckUnused private (phaseMode: CheckUnused.PhaseMode, suffix: String, _ke pushInBlockTemplatePackageDef(tree) traverseChildren(tree)(using newCtx) popOutBlockTemplatePackageDef() - case t:tpd.ValDef => + case t: tpd.ValDef => prepareForValDef(t) traverseChildren(tree)(using newCtx) transformValDef(t) - case t:tpd.DefDef => + case t: tpd.DefDef => prepareForDefDef(t) traverseChildren(tree)(using newCtx) transformDefDef(t) - case t:tpd.TypeDef => + case t: tpd.TypeDef => prepareForTypeDef(t) traverseChildren(tree)(using newCtx) transformTypeDef(t) @@ -248,6 +248,10 @@ class CheckUnused private (phaseMode: CheckUnused.PhaseMode, suffix: String, _ke prepareForAssign(t) traverseChildren(tree) case _: tpd.InferredTypeTree => + case t@tpd.RefinedTypeTree(tpt, refinements) => + //! DIFFERS FROM MINIPHASE + typeTraverser(unusedDataApply).traverse(t.tpe) + traverse(tpt)(using newCtx) case t@tpd.TypeTree() => //! DIFFERS FROM MINIPHASE typeTraverser(unusedDataApply).traverse(t.tpe) diff --git a/tests/pos-special/fatal-warnings/i17631.scala b/tests/pos-special/fatal-warnings/i17631.scala new file mode 100644 index 000000000000..3846e51c16cf --- /dev/null +++ b/tests/pos-special/fatal-warnings/i17631.scala @@ -0,0 +1,34 @@ +// scalac: -Wunused:all + +object foo { + type Bar +} + +import foo.Bar + +def Test = { + + type Person = { val name: String } + + def good: Person = ??? + def bad1: { val name: String } = ??? + def bad2 = (good: { val name: String }) + def justIs: { val bar: Bar } = ??? + (bad1, bad2, justIs) +} + +class Record(elems: (String, Any)*) extends Selectable: + private val fields = elems.toMap + def selectDynamic(name: String): Any = fields(name) + +object Main { + + type Person = Record { val name: String; val age: Int } + + locally { + def good: Person = ??? + def bad1: Record { val name: String; val age: Int } = ??? + def bad2 = (good: Record { val name: String; val age: Int }) + (bad1, bad2) + } +}