diff options
author | Paul Phillips <paulp@improving.org> | 2009-11-04 20:12:41 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-11-04 20:12:41 +0000 |
commit | 85cac0f0e0125ae069234ad87d424864adc393a1 (patch) | |
tree | 9dbcbd9ac4d211de6a394172df42e6b9d9c4d6cf /src/compiler | |
parent | a4895b85928399db4ed8d744ac3fc7208bee3a2f (diff) | |
download | scala-85cac0f0e0125ae069234ad87d424864adc393a1.tar.gz scala-85cac0f0e0125ae069234ad87d424864adc393a1.tar.bz2 scala-85cac0f0e0125ae069234ad87d424864adc393a1.zip |
Proposed fix for #2144 plus test case.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 9 |
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 && |