8000 Merge pull request #11048 from som-snytt/revert/allow-unused-patvar · scala/scala@cdb1a1d · GitHub
[go: up one dir, main page]

8000
Skip to content

Commit cdb1a1d

Browse files
authored
Merge pull request #11048 from som-snytt/revert/allow-unused-patvar
Tighter condition for nowarn a single patvar
2 parents fb43522 + 5eef9f3 commit cdb1a1d

File tree

4 files changed

+50
-9
lines changed

4 files changed

+50
-9
lines changed

src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -579,9 +579,15 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
579579
}
580580
case Match(selector, cases) =>
581581
// don't warn when a patvar redefines the selector ident: x match { case x: X => }
582+
// or extracts a single patvar named identically to the selector
582583
def allowVariableBindings(n: Name, pat: Tree): Unit =
583-
pat.foreach {
584-
case bind @ Bind(`n`, _) => bind.updateAttachment(NoWarnAttachment)
584+
pat match {
585+
case Bind(`n`, _) => pat.updateAttachment(NoWarnAttachment)
586+
case Apply(_, _) | UnApply(_, _) => // really interested in args
587+
pat.filter(_.isInstanceOf[Bind]) match { // never nme.WILDCARD
588+
case (bind @ Bind(`n`, _)) :: Nil => bind.updateAttachment(NoWarnAttachment) // one only
589+
case _ =>
590+
}
585591
case _ =>
586592
}
587593
def allow(n: Name): Unit = cases.foreach(k => allowVariableBindings(n, k.pat))
@@ -594,7 +600,7 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
594600
}
595601
loop(selector)
596602
case CaseDef(pat, _, _) if settings.warnUnusedPatVars && !t.isErrorTyped =>
597-
def absolveVariableBindings(app: Apply, args: List[Tree]): Unit =
603+
def allowVariableBindings(app: Apply, args: List[Tree]): Unit =
598604
treeInfo.dissectApplied(app).core.tpe match {
599605
case MethodType(ps, _) =>
600606
foreach2(ps, args) { (p, x) =>
@@ -606,10 +612,7 @@ trait TypeDiagnostics extends splain.SplainDiagnostics {
606612
case _ =>
607613
}
608614
pat.foreach {
609-
case app @ Apply(_, args) => absolveVariableBindings(app, args)
610-
case _ =>
611-
}
612-
pat.foreach {
615+
case app @ Apply(_, args) => allowVariableBindings(app, args)
613616
case b @ Bind(n, _) if n != nme.DEFAULT_CASE => addPatVar(b)
614617
case _ =>
615618
}

src/reflect/scala/reflect/internal/Trees.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,8 @@ trait Trees extends api.Trees {
632632
case class UnApply(fun: Tree, args: List[Tree])
633633
extends TermTree with UnApplyApi {
634634
override def transform(transformer: Transformer): Tree =
635-
transformer.treeCopy.UnApply(this, transformer.transform(fun), transformer.transformTrees(args)) // bq: see test/.../unapplyContexts2.scala
635+
transformer.treeCopy.UnApply(this, transformer.transform(fun), transformer.transformTrees(args))
636+
// bq: see test/.../unapplyContexts2.scala
636637
override def traverse(traverser: Traverser): Unit = {
637638
traverser.traverse(fun)
638639
traverser.traverseTrees(args)

test/files/neg/t13095.check

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ t13095.scala:12: warning: pattern var z in object Main is never used
44
t13095.scala:13: warning: pattern var r in object Main is never used
55
private[this] val A(q, r) = A(42, 27) // warn
66
^
7+
t13095.scala:42: warning: pattern var s in method spam is never used
8+
case email(s, addr) => // warn // warn each, multiple extraction
9+
^
10+
t13095.scala:42: warning: pattern var addr in method spam is never used
11+
case email(s, addr) => // warn // warn each, multiple extraction
12+
^
13+
t13095.scala:52: warning: pattern var v in method scala-dev#902 is never used
14+
case (i, v @ (_, _)) => i // warn multiple patvars
15+
^
16+
t13095.scala:52: warning: a pure expression does nothing in statement position
17+
case (i, v @ (_, _)) => i // warn multiple patvars
18+
^
719
error: No warnings can be incurred under -Werror.
8-
2 warnings
20+
6 warnings
921
1 error

test/files/neg/t13095.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,31 @@ class C {
2626
case x: String => // nowarn because x is not a new reference but an alias
2727
case _ =>
2828
}
29+
def s(x: Option[String]) =
30+
x match {
31+
case x: Some[String] => // nowarn because x is not a new reference but an alias
32+
case _ =>
33+
}
34+
def t(x: Option[String]) =
35+
x match {
36+
case Some(x) => // nowarn because x is not a new reference but an alias of sorts
37+
case _ =>
38+
}
39+
val email = "(.*)@(.*)".r
40+
def spam(s: String) =
41+
s match {
42+
case email(s, addr) => // warn // warn each, multiple extraction
43+
case _ =>
44+
}
45+
def border(s: String) =
46+
s match {
47+
case email(s, _) => // nowarn only one patvar
48+
case _ =>
49+
}
50+
def `scala-dev#902`(v: (Int, (Boolean, String))): Unit =
51+
v match {
52+
case (i, v @ (_, _)) => i // warn multiple patvars
53+
}
2954
}
3055

3156
final class ArrayOps[A](private val xs: Array[A]) extends AnyVal {

0 commit comments

Comments
 (0)
0