diff options
author | Seth Tisue <seth@tisue.net> | 2017-04-10 14:34:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-10 14:34:51 -0500 |
commit | 15e2759f49a3ef0f71290f4bbd9839cbf2346b0e (patch) | |
tree | a809f665e61208cb7e8ae098c676e80f341a68ed /test | |
parent | 715c88e9b74d1b4d1d0c4da9d0cc8f1b740e2dd3 (diff) | |
parent | bad61ce0ff9f460c2f8873c134a7f6bee0a53824 (diff) | |
download | scala-15e2759f49a3ef0f71290f4bbd9839cbf2346b0e.tar.gz scala-15e2759f49a3ef0f71290f4bbd9839cbf2346b0e.tar.bz2 scala-15e2759f49a3ef0f71290f4bbd9839cbf2346b0e.zip |
Merge pull request #5402 from som-snytt/issue/8040-unused
SI-8040 Improve unused warnings
Diffstat (limited to 'test')
31 files changed, 493 insertions, 36 deletions
diff --git a/test/files/neg/abstract-inaccessible.check b/test/files/neg/abstract-inaccessible.check index d56f5691be..739620a4ce 100644 --- a/test/files/neg/abstract-inaccessible.check +++ b/test/files/neg/abstract-inaccessible.check @@ -8,7 +8,7 @@ Classes which cannot access Bippy may be unable to override overrideMe. ^ abstract-inaccessible.scala:7: warning: method overrideMeAlso in trait YourTrait references private[foo] trait Bippy. Classes which cannot access Bippy may be unable to override overrideMeAlso. - def overrideMeAlso(x: Map[Int, Set[Bippy]]) = 5 + def overrideMeAlso(x: Map[Int, Set[Bippy]]) = x.keys.head ^ error: No warnings can be incurred under -Xfatal-warnings. three warnings found diff --git a/test/files/neg/abstract-inaccessible.flags b/test/files/neg/abstract-inaccessible.flags index 6c1dd108ae..ea7773e255 100644 --- a/test/files/neg/abstract-inaccessible.flags +++ b/test/files/neg/abstract-inaccessible.flags @@ -1 +1 @@ --Xfatal-warnings -Xlint
\ No newline at end of file +-Xfatal-warnings -Xlint:inaccessible diff --git a/test/files/neg/abstract-inaccessible.scala b/test/files/neg/abstract-inaccessible.scala index 3c80f30522..02b458016f 100644 --- a/test/files/neg/abstract-inaccessible.scala +++ b/test/files/neg/abstract-inaccessible.scala @@ -4,6 +4,6 @@ package foo { trait YourTrait { def implementMe(f: Int => (String, Bippy)): Unit def overrideMe[T <: Bippy](x: T): T = x - def overrideMeAlso(x: Map[Int, Set[Bippy]]) = 5 + def overrideMeAlso(x: Map[Int, Set[Bippy]]) = x.keys.head } } diff --git a/test/files/neg/forgot-interpolator.flags b/test/files/neg/forgot-interpolator.flags index 7949c2afa2..b0d7bc25cb 100644 --- a/test/files/neg/forgot-interpolator.flags +++ b/test/files/neg/forgot-interpolator.flags @@ -1 +1 @@ --Xlint -Xfatal-warnings +-Xlint:missing-interpolator -Xfatal-warnings diff --git a/test/files/neg/overloaded-implicit.flags b/test/files/neg/overloaded-implicit.flags index 9c1e74e4ef..e04a4228ba 100644 --- a/test/files/neg/overloaded-implicit.flags +++ b/test/files/neg/overloaded-implicit.flags @@ -1 +1 @@ --Xlint -Xfatal-warnings -Xdev +-Xlint:poly-implicit-overload -Xfatal-warnings -Xdev diff --git a/test/files/neg/t1980.flags b/test/files/neg/t1980.flags index 7949c2afa2..cdc464a47d 100644 --- a/test/files/neg/t1980.flags +++ b/test/files/neg/t1980.flags @@ -1 +1 @@ --Xlint -Xfatal-warnings +-Xlint:by-name-right-associative -Xfatal-warnings diff --git a/test/files/neg/t4877.flags b/test/files/neg/t4877.flags deleted file mode 100644 index 7ccd56103a..0000000000 --- a/test/files/neg/t4877.flags +++ /dev/null @@ -1 +0,0 @@ --Xlint
\ No newline at end of file diff --git a/test/files/neg/t6567.flags b/test/files/neg/t6567.flags index e93641e931..076333a011 100644 --- a/test/files/neg/t6567.flags +++ b/test/files/neg/t6567.flags @@ -1 +1 @@ --Xlint -Xfatal-warnings
\ No newline at end of file +-Xlint:option-implicit -Xfatal-warnings diff --git a/test/files/neg/t6675.flags b/test/files/neg/t6675.flags index 2843ea9efc..c6bfaf1f64 100644 --- a/test/files/neg/t6675.flags +++ b/test/files/neg/t6675.flags @@ -1 +1 @@ --deprecation -Xlint -Xfatal-warnings
\ No newline at end of file +-deprecation -Xfatal-warnings diff --git a/test/files/neg/t7860.check b/test/files/neg/t7860.check new file mode 100644 index 0000000000..9b9d86c89d --- /dev/null +++ b/test/files/neg/t7860.check @@ -0,0 +1,9 @@ +t7860.scala:5: warning: private class for your eyes only in object Test is never used + private implicit class `for your eyes only`(i: Int) { // warn + ^ +t7860.scala:31: warning: private class C in object Test3 is never used + private implicit class C(val i: Int) extends AnyVal { // warn + ^ +error: No warnings can be incurred under -Xfatal-warnings. +two warnings found +one error found diff --git a/test/files/neg/t7860.flags b/test/files/neg/t7860.flags new file mode 100644 index 0000000000..6ff0dea0b2 --- /dev/null +++ b/test/files/neg/t7860.flags @@ -0,0 +1 @@ +-Xfatal-warnings -Ywarn-unused:privates diff --git a/test/files/neg/t7860.scala b/test/files/neg/t7860.scala new file mode 100644 index 0000000000..6cc0d3e7f5 --- /dev/null +++ b/test/files/neg/t7860.scala @@ -0,0 +1,42 @@ + +class Test + +object Test { + private implicit class `for your eyes only`(i: Int) { // warn + def f = i + } +} + +class Test2 { + import Test2._ + println(5.toStr) +} + +object Test2 { + // was: warning: private object in object Test2 is never used + // i.e. synthetic object C + private implicit class C(val i: Int) extends AnyVal { // no warn + def toStr = i.toString + } +} + +class Test3 { + import Test3._ + //println(5.toStr) +} + +object Test3 { + // was: warning: private object in object Test2 is never used + // i.e. synthetic object C + private implicit class C(val i: Int) extends AnyVal { // warn + def toStr = i.toString + } +} + +object Test4 { + class A { class B } + + private val a: A = new A + + def b = (new a.B).## +} diff --git a/test/files/neg/warn-unused-implicits.check b/test/files/neg/warn-unused-implicits.check new file mode 100644 index 0000000000..4cc5836800 --- /dev/null +++ b/test/files/neg/warn-unused-implicits.check @@ -0,0 +1,9 @@ +warn-unused-implicits.scala:11: warning: parameter value s in method f is never used + )(implicit s: String): Int = { // warn + ^ +warn-unused-implicits.scala:31: warning: parameter value s in method i is never used + def i(implicit s: String, t: Int) = t // yes, warn + ^ +error: No warnings can be incurred under -Xfatal-warnings. +two warnings found +one error found diff --git a/test/files/neg/warn-unused-implicits.flags b/test/files/neg/warn-unused-implicits.flags new file mode 100644 index 0000000000..18169f3218 --- /dev/null +++ b/test/files/neg/warn-unused-implicits.flags @@ -0,0 +1 @@ +-Ywarn-unused:implicits -Xfatal-warnings diff --git a/test/files/neg/warn-unused-implicits.scala b/test/files/neg/warn-unused-implicits.scala new file mode 100644 index 0000000000..54f924eac0 --- /dev/null +++ b/test/files/neg/warn-unused-implicits.scala @@ -0,0 +1,32 @@ + +trait InterFace { + /** Call something. */ + def call(a: Int, b: String, c: Double)(implicit s: String): Int +} + +trait BadAPI extends InterFace { + def f(a: Int, + b: String, + c: Double + )(implicit s: String): Int = { // warn + println(b + c) + a + } + @deprecated ("no warn in deprecated API", since="yesterday") + def g(a: Int, + b: String, + c: Double + )(implicit s: String): Int = { // no warn + println(b + c) + a + } + override def call(a: Int, + b: String, + c: Double + )(implicit s: String): Int = { // no warn, required by superclass + println(b + c) + a + } + + def i(implicit s: String, t: Int) = t // yes, warn +} diff --git a/test/files/neg/warn-unused-imports.check b/test/files/neg/warn-unused-imports.check index 0a53d7a9cd..29d73a6264 100644 --- a/test/files/neg/warn-unused-imports.check +++ b/test/files/neg/warn-unused-imports.check @@ -51,5 +51,8 @@ warn-unused-imports_2.scala:149: warning: Unused import warn-unused-imports_2.scala:150: warning: Unused import import p1.A // warn ^ -16 warnings found +warn-unused-imports_2.scala:158: warning: Unused import + def x = Macro.f // warn, not crash + ^ +17 warnings found one error found diff --git a/test/files/neg/warn-unused-imports.flags b/test/files/neg/warn-unused-imports.flags index 24db705df1..c4e11e7fe7 100644 --- a/test/files/neg/warn-unused-imports.flags +++ b/test/files/neg/warn-unused-imports.flags @@ -1 +1 @@ --Xfatal-warnings -Ywarn-unused-import +-Xfatal-warnings -Ywarn-unused:imports diff --git a/test/files/neg/warn-unused-imports/sample_1.scala b/test/files/neg/warn-unused-imports/sample_1.scala index d2f86239db..eea4d0eb4c 100644 --- a/test/files/neg/warn-unused-imports/sample_1.scala +++ b/test/files/neg/warn-unused-imports/sample_1.scala @@ -15,3 +15,18 @@ object Sample { def f(x: X) = ??? def g(y: Y) = ??? } + +import scala.language.experimental.macros +import scala.reflect.macros.blackbox.Context + +object Macro { + def f: Int = macro fImpl + def fImpl(c: Context): c.Tree = { + import c.universe._ + + q""" + import scala.util.Random + 42 // TODO randomize + """ + } +} diff --git a/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala b/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala index ded1186209..58fe0131d9 100644 --- a/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala +++ b/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala @@ -96,7 +96,7 @@ trait Warn { trait Nested { { import p1._ // warn - trait Warn { // warn about unused local trait for good measure + trait Warn { // don't warn about unused local trait with -Ywarn-unused:imports import p2._ println(new A) println("abc".bippy) @@ -153,3 +153,7 @@ trait Outsiders { //Future("abc".bippy) } } + +class MacroClient { + def x = Macro.f // warn, not crash +} diff --git a/test/files/neg/warn-unused-params.check b/test/files/neg/warn-unused-params.check new file mode 100644 index 0000000000..373417ce08 --- /dev/null +++ b/test/files/neg/warn-unused-params.check @@ -0,0 +1,18 @@ +warn-unused-params.scala:9: warning: parameter value b in method f is never used + b: String, // warn + ^ +warn-unused-params.scala:32: warning: parameter value s in method i is never used + def i(implicit s: String) = 42 // yes, warn + ^ +warn-unused-params.scala:49: warning: parameter value u in class Unusing is never used +class Unusing(u: Int) { // warn + ^ +warn-unused-params.scala:59: warning: parameter value s in class CaseyAtTheBat is never used +case class CaseyAtTheBat(k: Int)(s: String) // warn + ^ +warn-unused-params.scala:62: warning: parameter value readResolve in method f is never used + def f(readResolve: Int) = 42 // warn + ^ +error: No warnings can be incurred under -Xfatal-warnings. +5 warnings found +one error found diff --git a/test/files/neg/warn-unused-params.flags b/test/files/neg/warn-unused-params.flags new file mode 100644 index 0000000000..795fb74272 --- /dev/null +++ b/test/files/neg/warn-unused-params.flags @@ -0,0 +1 @@ +-Ywarn-unused:params -Xfatal-warnings diff --git a/test/files/neg/warn-unused-params.scala b/test/files/neg/warn-unused-params.scala new file mode 100644 index 0000000000..b166e8fae6 --- /dev/null +++ b/test/files/neg/warn-unused-params.scala @@ -0,0 +1,69 @@ + +trait InterFace { + /** Call something. */ + def call(a: Int, b: String, c: Double): Int +} + +trait BadAPI extends InterFace { + def f(a: Int, + b: String, // warn + c: Double): Int = { + println(c) + a + } + @deprecated ("no warn in deprecated API", since="yesterday") + def g(a: Int, + b: String, // no warn + c: Double): Int = { + println(c) + a + } + override def call(a: Int, + b: String, // no warn, required by superclass + c: Double): Int = { + println(c) + a + } + + def meth(x: Int) = x + + override def equals(other: Any): Boolean = true // no warn + + def i(implicit s: String) = 42 // yes, warn + + /* + def future(x: Int): Int = { + val y = 42 + val x = y // maybe option to warn only if shadowed + x + } + */ +} + +// mustn't alter warnings in super +trait PoorClient extends BadAPI { + override def meth(x: Int) = ??? // no warn + override def f(a: Int, b: String, c: Double): Int = a + b.toInt + c.toInt +} + +class Unusing(u: Int) { // warn + def f = ??? +} + +class Valuing(val u: Int) // no warn + +class Revaluing(u: Int) { def f = u } // no warn + +case class CaseyKasem(k: Int) // no warn + +case class CaseyAtTheBat(k: Int)(s: String) // warn + +trait Ignorance { + def f(readResolve: Int) = 42 // warn +} + +class Reusing(u: Int) extends Unusing(u) // no warn + +class Main { + def main(args: Array[String]): Unit = println("hello, args") // no warn +} diff --git a/test/files/neg/warn-unused-patvars.check b/test/files/neg/warn-unused-patvars.check new file mode 100644 index 0000000000..2665126a36 --- /dev/null +++ b/test/files/neg/warn-unused-patvars.check @@ -0,0 +1,12 @@ +warn-unused-patvars.scala:9: warning: private val x in trait Boundings is never used + private val x = 42 // warn, sanity check + ^ +warn-unused-patvars.scala:28: warning: local val x in method v is never used + val D(x) = d // warn, fixme + ^ +warn-unused-patvars.scala:32: warning: local val x in method w is never used + val D(x @ _) = d // warn, fixme (valdef pos is different) + ^ +error: No warnings can be incurred under -Xfatal-warnings. +three warnings found +one error found diff --git a/test/files/neg/warn-unused-patvars.flags b/test/files/neg/warn-unused-patvars.flags new file mode 100644 index 0000000000..d5bd86a658 --- /dev/null +++ b/test/files/neg/warn-unused-patvars.flags @@ -0,0 +1 @@ +-Ywarn-unused:-patvars,_ -Xfatal-warnings diff --git a/test/files/neg/warn-unused-patvars.scala b/test/files/neg/warn-unused-patvars.scala new file mode 100644 index 0000000000..3d35dfedd6 --- /dev/null +++ b/test/files/neg/warn-unused-patvars.scala @@ -0,0 +1,53 @@ + +// verify no warning when -Ywarn-unused:-patvars + +case class C(a: Int, b: String, c: Option[String]) +case class D(a: Int) + +trait Boundings { + + private val x = 42 // warn, sanity check + + def c = C(42, "hello", Some("world")) + def d = D(42) + + def f() = { + val C(x, y, Some(z)) = c // no warn + 17 + } + def g() = { + val C(x @ _, y @ _, Some(z @ _)) = c // no warn + 17 + } + def h() = { + val C(x @ _, y @ _, z @ Some(_)) = c // no warn for z? + 17 + } + + def v() = { + val D(x) = d // warn, fixme + 17 + } + def w() = { + val D(x @ _) = d // warn, fixme (valdef pos is different) + 17 + } + +} + +trait Forever { + def f = { + val t = Option((17, 42)) + for { + ns <- t + (i, j) = ns // no warn + } yield (i + j) + } + def g = { + val t = Option((17, 42)) + for { + ns <- t + (i, j) = ns // no warn + } yield 42 + } +} diff --git a/test/files/neg/warn-unused-privates.check b/test/files/neg/warn-unused-privates.check index 2e93f338bb..2a88d3e6c3 100644 --- a/test/files/neg/warn-unused-privates.check +++ b/test/files/neg/warn-unused-privates.check @@ -1,66 +1,120 @@ warn-unused-privates.scala:2: warning: private constructor in class Bippy is never used private def this(c: Int) = this(c, c) // warn ^ -warn-unused-privates.scala:4: warning: private method in class Bippy is never used +warn-unused-privates.scala:4: warning: private method boop in class Bippy is never used private def boop(x: Int) = x+a+b // warn ^ -warn-unused-privates.scala:6: warning: private val in class Bippy is never used +warn-unused-privates.scala:6: warning: private val MILLIS2 in class Bippy is never used final private val MILLIS2: Int = 1000 // warn ^ -warn-unused-privates.scala:13: warning: private val in object Bippy is never used +warn-unused-privates.scala:13: warning: private val HEY_INSTANCE in object Bippy is never used private val HEY_INSTANCE: Int = 1000 // warn ^ -warn-unused-privates.scala:14: warning: private val in object Bippy is never used +warn-unused-privates.scala:14: warning: private val BOOL in object Bippy is never used private lazy val BOOL: Boolean = true // warn ^ -warn-unused-privates.scala:36: warning: private val in class Boppy is never used +warn-unused-privates.scala:36: warning: private val hummer in class Boppy is never used private val hummer = "def" // warn ^ -warn-unused-privates.scala:43: warning: private var in trait Accessors is never used +warn-unused-privates.scala:43: warning: private var v1 in trait Accessors is never used private var v1: Int = 0 // warn ^ -warn-unused-privates.scala:44: warning: private var in trait Accessors is never used +warn-unused-privates.scala:44: warning: private var v2 in trait Accessors is never used private var v2: Int = 0 // warn, never set ^ -warn-unused-privates.scala:45: warning: private var in trait Accessors is never used +warn-unused-privates.scala:45: warning: private var v3 in trait Accessors is never used private var v3: Int = 0 // warn, never got ^ -warn-unused-privates.scala:57: warning: private default argument in trait DefaultArgs is never used +warn-unused-privates.scala:56: warning: private var s1 in class StableAccessors is never used + private var s1: Int = 0 // warn + ^ +warn-unused-privates.scala:57: warning: private setter of s2 in class StableAccessors is never used + private var s2: Int = 0 // warn, never set + ^ +warn-unused-privates.scala:58: warning: private var s3 in class StableAccessors is never used + private var s3: Int = 0 // warn, never got + ^ +warn-unused-privates.scala:70: warning: private default argument in trait DefaultArgs is never used private def bippy(x1: Int, x2: Int = 10, x3: Int = 15): Int = x1 + x2 + x3 ^ -warn-unused-privates.scala:57: warning: private default argument in trait DefaultArgs is never used +warn-unused-privates.scala:70: warning: private default argument in trait DefaultArgs is never used private def bippy(x1: Int, x2: Int = 10, x3: Int = 15): Int = x1 + x2 + x3 ^ -warn-unused-privates.scala:68: warning: local var in method f0 is never used +warn-unused-privates.scala:86: warning: local var x in method f0 is never used var x = 1 // warn ^ -warn-unused-privates.scala:75: warning: local val in method f1 is never used +warn-unused-privates.scala:93: warning: local val b in method f1 is never used val b = new Outer // warn ^ -warn-unused-privates.scala:85: warning: private object in object Types is never used +warn-unused-privates.scala:103: warning: private object Dongo in object Types is never used private object Dongo { def f = this } // warn ^ -warn-unused-privates.scala:95: warning: local object in method l1 is never used +warn-unused-privates.scala:113: warning: local object HiObject in method l1 is never used object HiObject { def f = this } // warn ^ -warn-unused-privates.scala:79: warning: local var x in method f2 is never set - it could be a val +warn-unused-privates.scala:136: warning: private method x_= in class OtherNames is never used + private def x_=(i: Int): Unit = ??? + ^ +warn-unused-privates.scala:137: warning: private method x in class OtherNames is never used + private def x: Int = 42 + ^ +warn-unused-privates.scala:138: warning: private method y_= in class OtherNames is never used + private def y_=(i: Int): Unit = ??? + ^ +warn-unused-privates.scala:153: warning: local val x in method f is never used + val C(x, y, Some(z)) = c // warn + ^ +warn-unused-privates.scala:153: warning: local val y in method f is never used + val C(x, y, Some(z)) = c // warn + ^ +warn-unused-privates.scala:153: warning: local val z in method f is never used + val C(x, y, Some(z)) = c // warn + ^ +warn-unused-privates.scala:161: warning: local val z in method h is never used + val C(x @ _, y @ _, z @ Some(_)) = c // warn for z? + ^ +warn-unused-privates.scala:166: warning: local val x in method v is never used + val D(x) = d // warn + ^ +warn-unused-privates.scala:170: warning: local val x in method w is never used + val D(x @ _) = d // warn, fixme (valdef pos is different) + ^ +warn-unused-privates.scala:97: warning: local var x in method f2 is never set: consider using immutable val var x = 100 // warn about it being a var ^ -warn-unused-privates.scala:86: warning: private class Bar1 in object Types is never used +warn-unused-privates.scala:104: warning: private class Bar1 in object Types is never used private class Bar1 // warn ^ -warn-unused-privates.scala:88: warning: private type Alias1 in object Types is never used +warn-unused-privates.scala:106: warning: private type Alias1 in object Types is never used private type Alias1 = String // warn ^ -warn-unused-privates.scala:96: warning: local class Hi is never used +warn-unused-privates.scala:114: warning: local class Hi is never used class Hi { // warn ^ -warn-unused-privates.scala:100: warning: local class DingDongDoobie is never used +warn-unused-privates.scala:118: warning: local class DingDongDoobie is never used class DingDongDoobie // warn ^ -warn-unused-privates.scala:103: warning: local type OtherThing is never used +warn-unused-privates.scala:121: warning: local type OtherThing is never used type OtherThing = String // warn ^ +warn-unused-privates.scala:216: warning: private class for your eyes only in object not even using companion privates is never used + private implicit class `for your eyes only`(i: Int) { // warn + ^ +warn-unused-privates.scala:201: warning: pattern var z in method f is never used; `z@_' suppresses this warning + case z => "warn" + ^ +warn-unused-privates.scala:208: warning: pattern var z in method f is never used; `z@_' suppresses this warning + case Some(z) => "warn" + ^ +warn-unused-privates.scala:20: warning: parameter value msg0 in class B3 is never used +class B3(msg0: String) extends A("msg") + ^ +warn-unused-privates.scala:136: warning: parameter value i in method x_= is never used + private def x_=(i: Int): Unit = ??? + ^ +warn-unused-privates.scala:138: warning: parameter value i in method y_= is never used + private def y_=(i: Int): Unit = ??? + ^ error: No warnings can be incurred under -Xfatal-warnings. -21 warnings found +39 warnings found one error found diff --git a/test/files/neg/warn-unused-privates.scala b/test/files/neg/warn-unused-privates.scala index 2eda280d40..f7640927fb 100644 --- a/test/files/neg/warn-unused-privates.scala +++ b/test/files/neg/warn-unused-privates.scala @@ -52,6 +52,19 @@ trait Accessors { } } +class StableAccessors { + private var s1: Int = 0 // warn + private var s2: Int = 0 // warn, never set + private var s3: Int = 0 // warn, never got + private var s4: Int = 0 // no warn + + def bippy(): Int = { + s3 = 5 + s4 = 6 + s2 + s4 + } +} + trait DefaultArgs { // warn about default getters for x2 and x3 private def bippy(x1: Int, x2: Int = 10, x3: Int = 15): Int = x1 + x2 + x3 @@ -59,6 +72,11 @@ trait DefaultArgs { def boppy() = bippy(5, 100, 200) } +/* SI-7707 Both usages warn default arg because using PrivateRyan.apply, not new. +case class PrivateRyan private (ryan: Int = 42) { def f = PrivateRyan() } +object PrivateRyan { def f = PrivateRyan() } +*/ + class Outer { class Inner } @@ -104,3 +122,105 @@ object Types { (new Bippy): Something } } + +trait Underwarn { + def f(): Seq[Int] + + def g() = { + val Seq(_, _) = f() // no warn + true + } +} + +class OtherNames { + private def x_=(i: Int): Unit = ??? + private def x: Int = 42 + private def y_=(i: Int): Unit = ??? + private def y: Int = 42 + + def f = y +} + +case class C(a: Int, b: String, c: Option[String]) +case class D(a: Int) + +trait Boundings { + + def c = C(42, "hello", Some("world")) + def d = D(42) + + def f() = { + val C(x, y, Some(z)) = c // warn + 17 + } + def g() = { + val C(x @ _, y @ _, Some(z @ _)) = c // no warn + 17 + } + def h() = { + val C(x @ _, y @ _, z @ Some(_)) = c // warn for z? + 17 + } + + def v() = { + val D(x) = d // warn + 17 + } + def w() = { + val D(x @ _) = d // warn, fixme (valdef pos is different) + 17 + } + +} + +trait Forever { + def f = { + val t = Option((17, 42)) + for { + ns <- t + (i, j) = ns // no warn + } yield (i + j) + } + def g = { + val t = Option((17, 42)) + for { + ns <- t + (i, j) = ns // warn, fixme + } yield 42 // val emitted only if needed, hence nothing unused + } +} + +trait Ignorance { + private val readResolve = 42 // ignore +} + +trait CaseyKasem { + def f = 42 match { + case x if x < 25 => "no warn" + case y if toString.nonEmpty => "no warn" + y + case z => "warn" + } +} +trait CaseyAtTheBat { + def f = Option(42) match { + case Some(x) if x < 25 => "no warn" + case Some(y @ _) if toString.nonEmpty => "no warn" + case Some(z) => "warn" + case None => "no warn" + } +} + +class `not even using companion privates` + +object `not even using companion privates` { + private implicit class `for your eyes only`(i: Int) { // warn + def f = i + } +} + +class `no warn in patmat anonfun isDefinedAt` { + def f(pf: PartialFunction[String, Int]) = pf("42") + def g = f { + case s => s.length // no warn (used to warn case s => true in isDefinedAt) + } +} diff --git a/test/files/pos/t6091.scala b/test/files/pos/t6091.scala index 72e663ec3b..0318640e7b 100644 --- a/test/files/pos/t6091.scala +++ b/test/files/pos/t6091.scala @@ -1,6 +1,6 @@ -object Foo { def eq(x:Int) = x } +object Foo { def eq(x: Int) = x } -class X { def ==(other: String) = true } +class X { def ==(other: String) = other.nonEmpty } object Test { def main(args: Array[String]): Unit = { diff --git a/test/files/pos/t8013.flags b/test/files/pos/t8013.flags index 3955bb6710..219723cec9 100644 --- a/test/files/pos/t8013.flags +++ b/test/files/pos/t8013.flags @@ -1 +1 @@ --Xfatal-warnings -Xlint:-infer-any,_ +-Xfatal-warnings -Xlint:missing-interpolator diff --git a/test/files/pos/t8040.flags b/test/files/pos/t8040.flags new file mode 100644 index 0000000000..3126c059f0 --- /dev/null +++ b/test/files/pos/t8040.flags @@ -0,0 +1 @@ +-Xfatal-warnings -Ywarn-unused:params diff --git a/test/files/pos/t8040.scala b/test/files/pos/t8040.scala new file mode 100644 index 0000000000..3e01014ab4 --- /dev/null +++ b/test/files/pos/t8040.scala @@ -0,0 +1,13 @@ + +object Test { + implicit class C(val sc: StringContext) { // no warn unused sc + def c(args: Any*): String = "c?" + args.mkString(",") // would warn unused args + } + + def f(implicit x: DummyImplicit) = 42 // no warn DummyImplicit + + + def f(x: Int)(y: Int = 1) = x + y // no warn default getter + + def g(@deprecated("","") x: Int) = 42 // no warn deprecated +} |