Merge pull request #2979 from retronym/ticket/7870

SI-7870 Detect default getter clashes in constructors
This commit is contained in:
Jason Zaugg 2013-09-26 23:18:34 -07:00
commit 0aaf591498
3 changed files with 12 additions and 3 deletions

View File

@ -121,13 +121,13 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
var checkedCombinations = Set[List[Type]]()
// only one overloaded alternative is allowed to define default arguments
private def checkOverloadedRestrictions(clazz: Symbol): Unit = {
private def checkOverloadedRestrictions(clazz: Symbol, defaultClass: Symbol): Unit = {
// Using the default getters (such as methodName$default$1) as a cheap way of
// finding methods with default parameters. This way, we can limit the members to
// those with the DEFAULTPARAM flag, and infer the methods. Looking for the methods
// directly requires inspecting the parameter list of every one. That modification
// shaved 95% off the time spent in this method.
val defaultGetters = clazz.info.findMembers(0L, DEFAULTPARAM)
val defaultGetters = defaultClass.info.findMembers(0L, DEFAULTPARAM)
val defaultMethodNames = defaultGetters map (sym => nme.defaultGetterToMethod(sym.name))
defaultMethodNames.toList.distinct foreach { name =>
@ -1638,7 +1638,9 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
case Template(parents, self, body) =>
localTyper = localTyper.atOwner(tree, currentOwner)
validateBaseTypes(currentOwner)
checkOverloadedRestrictions(currentOwner)
checkOverloadedRestrictions(currentOwner, currentOwner)
// SI-7870 default getters for constructors live in the companion module
checkOverloadedRestrictions(currentOwner, currentOwner.companionModule)
val bridges = addVarargBridges(currentOwner)
checkAllOverrides(currentOwner)
checkAnyValSubclass(currentOwner)

View File

@ -0,0 +1,4 @@
t7870.scala:1: error: in class C, multiple overloaded alternatives of constructor C define default arguments.
class C(a: Int = 0, b: Any) {
^
one error found

View File

@ -0,0 +1,3 @@
class C(a: Int = 0, b: Any) {
def this(a: Int = 0) = this(???, ???)
}