summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-11-04 20:12:41 +0000
committerPaul Phillips <paulp@improving.org>2009-11-04 20:12:41 +0000
commit85cac0f0e0125ae069234ad87d424864adc393a1 (patch)
tree9dbcbd9ac4d211de6a394172df42e6b9d9c4d6cf /src
parenta4895b85928399db4ed8d744ac3fc7208bee3a2f (diff)
downloadscala-85cac0f0e0125ae069234ad87d424864adc393a1.tar.gz
scala-85cac0f0e0125ae069234ad87d424864adc393a1.tar.bz2
scala-85cac0f0e0125ae069234ad87d424864adc393a1.zip
Proposed fix for #2144 plus test case.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 2b3a8561d8..e64abf9204 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1700,8 +1700,13 @@ trait Typers { self: Analyzer =>
computeParamAliases(meth.owner, vparamss1, rhs1)
if (tpt1.tpe.typeSymbol != NothingClass && !context.returnsSeen) rhs1 = checkDead(rhs1)
- if (meth.owner.isRefinementClass && meth.allOverriddenSymbols.isEmpty)
- for (vparams <- ddef.vparamss; vparam <- vparams)
+ // If only refinement owned methods are checked, invalid code can result; see ticket #2144.
+ def requiresStructuralCheck = meth.allOverriddenSymbols.isEmpty && (
+ meth.owner.isRefinementClass ||
+ (!meth.isConstructor && !meth.isSetter && meth.owner.isAnonymousClass)
+ )
+ if (requiresStructuralCheck)
+ for (vparam <- ddef.vparamss.flatten)
checkStructuralCondition(meth.owner, vparam)
if (phase.id <= currentRun.typerPhase.id && meth.owner.isClass &&