Merge pull request #2979 from retronym/ticket/7870
SI-7870 Detect default getter clashes in constructors
This commit is contained in:
commit
0aaf591498
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1,3 @@
|
|||
class C(a: Int = 0, b: Any) {
|
||||
def this(a: Int = 0) = this(???, ???)
|
||||
}
|
Loading…
Reference in New Issue