summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2009-09-24 12:45:00 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2009-09-24 12:45:00 +0000
commit593d685e4fa50cf087bfc89a208ed2c89d2407c1 (patch)
tree04d0a413a11f9ccd96fc3a347602c8d3a7437f5a /src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
parentad9103538dec453a5e8a40a750ed3cc664296f68 (diff)
downloadscala-593d685e4fa50cf087bfc89a208ed2c89d2407c1.tar.gz
scala-593d685e4fa50cf087bfc89a208ed2c89d2407c1.tar.bz2
scala-593d685e4fa50cf087bfc89a208ed2c89d2407c1.zip
fixed #2290 and #2325
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index be0c65c49b..5b1ec93ffb 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -65,6 +65,30 @@ abstract class RefChecks extends InfoTransform {
var currentApplication: Tree = EmptyTree
var inPattern: Boolean = false
+ // only one overloaded alternative is allowed to define default arguments
+ private def checkDefaultsInOverloaded(clazz: Symbol) {
+ def check(members: List[Symbol]): Unit = members match {
+ case x :: xs =>
+ if (x.paramss.exists(_.exists(p => p.hasFlag(DEFAULTPARAM)))) {
+ val others = xs.filter(alt => {
+ alt.name == x.name &&
+ alt.paramss.exists(_.exists(_.hasFlag(DEFAULTPARAM))) &&
+ (!alt.isConstructor || alt.owner == x.owner) // constructors of different classes are allowed to have defaults
+ })
+ if (!others.isEmpty) {
+ val all = x :: others
+ val rest = if (all.exists(_.owner != clazz)) ".\nThe members with defaults are defined in "+
+ all.map(_.owner).mkString("", " and ", ".")
+ unit.error(clazz.pos, "in "+ clazz +", multiple overloaded alternatives of "+ x +
+ " define default arguments"+ rest)
+ }
+ }
+ check(xs)
+ case _ => ()
+ }
+ check(clazz.info.members)
+ }
+
// Override checking ------------------------------------------------------------
/** 1. Check all members of class `clazz' for overriding conditions.
@@ -891,6 +915,7 @@ abstract class RefChecks extends InfoTransform {
case Template(_, _, _) =>
localTyper = localTyper.atOwner(tree, currentOwner)
validateBaseTypes(currentOwner)
+ checkDefaultsInOverloaded(currentOwner)
checkAllOverrides(currentOwner)
case TypeTree() =>