diff options
author | Paul Phillips <paulp@improving.org> | 2010-08-07 19:36:38 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2010-08-07 19:36:38 +0000 |
commit | ed3dddae4e8b55917217b202f54d5b918ce4030e (patch) | |
tree | b24a8dae0b0ef840b44b13490d2dd6320f0e209f /src | |
parent | f36ea69f64ef5c6024944ba9a7cecca2eb3e9af4 (diff) | |
download | scala-ed3dddae4e8b55917217b202f54d5b918ce4030e.tar.gz scala-ed3dddae4e8b55917217b202f54d5b918ce4030e.tar.bz2 scala-ed3dddae4e8b55917217b202f54d5b918ce4030e.zip |
Disallowed super.XX calls to Any methods which ...
Disallowed super.XX calls to Any methods which are presently either
crashing the compiler (isInstanceOf) or leading to runtime failure (==
and !=) in addition to one which was being rewritten to a this call but
makes more sense disallowed like the others (##).
Closes #3736, review by odersky.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 541ef35b4b..16c6203474 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -80,11 +80,6 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT } private def transformSuperSelect(tree: Tree): Tree = tree match { - // Intercept super.## and translate it to this.## - // which is fine since it's final. - case Select(sup @ Super(_, _), nme.HASHHASH) => - Select(gen.mkAttributedThis(sup.symbol), Object_##) setType IntClass.tpe - case Select(sup @ Super(_, mix), name) => val sym = tree.symbol val clazz = sup.symbol @@ -127,6 +122,13 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT tree } + // Disallow some super.XX calls targeting Any methods which would + // otherwise lead to either a compiler crash or runtime failure. + private def isDisallowed(name: Name) = name match { + case nme.HASHHASH | nme.EQ | nme.NE | nme.isInstanceOf_ => true + case _ => false + } + override def transform(tree: Tree): Tree = { val sym = tree.symbol @@ -203,6 +205,9 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT unit.error(tree.pos, "super may be not be used on "+ (if (sym.hasFlag(ACCESSOR)) sym.accessed else sym)) } + else if (isDisallowed(name)) { + unit.error(tree.pos, "super not allowed here: use this." + name.decode + " instead") + } transformSuperSelect(tree) case TypeApply(sel @ Select(qual, name), args) => |