Skip to content

Commit eb0d6a2

Browse files
committed
Wunused: Only use type treverser for checking refinements in refined type trees
closes lampepfl#17631
1 parent 0749271 commit eb0d6a2

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

compiler/src/dotty/tools/dotc/transform/CheckUnused.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,15 +229,15 @@ class CheckUnused private (phaseMode: CheckUnused.PhaseMode, suffix: String, _ke
229229
pushInBlockTemplatePackageDef(tree)
230230
traverseChildren(tree)(using newCtx)
231231
popOutBlockTemplatePackageDef()
232-
case t:tpd.ValDef =>
232+
case t: tpd.ValDef =>
233233
prepareForValDef(t)
234234
traverseChildren(tree)(using newCtx)
235235
transformValDef(t)
236-
case t:tpd.DefDef =>
236+
case t: tpd.DefDef =>
237237
prepareForDefDef(t)
238238
traverseChildren(tree)(using newCtx)
239239
transformDefDef(t)
240-
case t:tpd.TypeDef =>
240+
case t: tpd.TypeDef =>
241241
prepareForTypeDef(t)
242242
traverseChildren(tree)(using newCtx)
243243
transformTypeDef(t)
@@ -248,6 +248,10 @@ class CheckUnused private (phaseMode: CheckUnused.PhaseMode, suffix: String, _ke
248248
prepareForAssign(t)
249249
traverseChildren(tree)
250250
case _: tpd.InferredTypeTree =>
251+
case t@tpd.RefinedTypeTree(tpt, refinements) =>
252+
//! DIFFERS FROM MINIPHASE
253+
typeTraverser(unusedDataApply).traverse(t.tpe)
254+
traverse(tpt)(using newCtx)
251255
case t@tpd.TypeTree() =>
252256
//! DIFFERS FROM MINIPHASE
253257
typeTraverser(unusedDataApply).traverse(t.tpe)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// scalac: -Wunused:all
2+
3+
object foo {
4+
type Bar
5+
}
6+
7+
import foo.Bar
8+
9+
def Test = {
10+
11+
type Person = { val name: String }
12+
13+
def good: Person = ???
14+
def bad1: { val name: String } = ???
15+
def bad2 = (good: { val name: String })
16+
def justIs: { val bar: Bar } = ???
17+
(bad1, bad2, justIs)
18+
}
19+
20+
class Record(elems: (String, Any)*) extends Selectable:
21+
private val fields = elems.toMap
22+
def selectDynamic(name: String): Any = fields(name)
23+
24+
object Main {
25+
26+
type Person = Record { val name: String; val age: Int }
27+
28+
locally {
29+
def good: Person = ???
30+
def bad1: Record { val name: String; val age: Int } = ???
31+
def bad2 = (good: Record { val name: String; val age: Int })
32+
(bad1, bad2)
33+
}
34+
}

0 commit comments

Comments
 (0)