diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2012-09-11 22:03:58 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2012-09-11 22:39:50 +0200 |
commit | 1776337253744482b7116326413de5e260a5984e (patch) | |
tree | f55b336022b6f0ba4a83e5332d247bb9071c48e0 | |
parent | ea651e6fe187920d207aa5fe3c645d294e72e627 (diff) | |
download | scala-1776337253744482b7116326413de5e260a5984e.tar.gz scala-1776337253744482b7116326413de5e260a5984e.tar.bz2 scala-1776337253744482b7116326413de5e260a5984e.zip |
Avoid spurious warning for `def foo = x.foo`.
Followup to SI-6276.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 7 | ||||
-rw-r--r-- | test/files/neg/t6276.check | 16 | ||||
-rw-r--r-- | test/files/neg/t6276.scala | 17 |
3 files changed, 33 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index f1f2794a95..d515934c58 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -1208,11 +1208,16 @@ abstract class RefChecks extends InfoTransform with reflect.internal.transform.R // SI-6276 warn for `def foo = foo` or `val bar: X = bar`, which come up more frequently than you might think. def checkInfiniteLoop(valOrDef: ValOrDefDef) { + def callsSelf = valOrDef.rhs match { + case t @ (Ident(_) | Select(This(_), _)) => + t hasSymbolWhich (_.accessedOrSelf == valOrDef.symbol) + case _ => false + } val trivialInifiniteLoop = ( !valOrDef.isErroneous && !valOrDef.symbol.isValueParameter && valOrDef.symbol.paramss.isEmpty - && valOrDef.rhs.hasSymbolWhich(_.accessedOrSelf == valOrDef.symbol) + && callsSelf ) if (trivialInifiniteLoop) unit.warning(valOrDef.rhs.pos, s"${valOrDef.symbol.fullLocationString} does nothing other than call itself recursively") diff --git a/test/files/neg/t6276.check b/test/files/neg/t6276.check index 8bd92cf293..0b3dfa5531 100644 --- a/test/files/neg/t6276.check +++ b/test/files/neg/t6276.check @@ -1,13 +1,19 @@ -t6276.scala:4: error: method a does nothing other than call itself recursively +t6276.scala:4: error: method a in class C does nothing other than call itself recursively def a: Any = a // warn ^ -t6276.scala:5: error: value b does nothing other than call itself recursively +t6276.scala:5: error: value b in class C does nothing other than call itself recursively val b: Any = b // warn ^ -t6276.scala:10: error: method a does nothing other than call itself recursively +t6276.scala:7: error: method c in class C does nothing other than call itself recursively + def c: Any = this.c // warn + ^ +t6276.scala:8: error: method d in class C does nothing other than call itself recursively + def d: Any = C.this.d // warn + ^ +t6276.scala:13: error: method a does nothing other than call itself recursively def a: Any = a // warn ^ -t6276.scala:19: error: method a does nothing other than call itself recursively +t6276.scala:22: error: method a does nothing other than call itself recursively def a = a // warn ^ -four errors found +6 errors found diff --git a/test/files/neg/t6276.scala b/test/files/neg/t6276.scala index 8333618964..bd0a473f71 100644 --- a/test/files/neg/t6276.scala +++ b/test/files/neg/t6276.scala @@ -1,8 +1,11 @@ object Test { def foo(a: Int, b: Int, c: Int) { - new { + class C { def a: Any = a // warn val b: Any = b // warn + + def c: Any = this.c // warn + def d: Any = C.this.d // warn } def method { @@ -25,5 +28,17 @@ object Test { val b: Any = {println(""); b} def c(i: Int): Any = c(i - 0) } + + class D { + def other: D = null + def foo: Any = other.foo + } + + class E { + def foo: Any = 0 + class D extends E { + override def foo: Any = E.this.foo + } + } } } |