summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-08-07 19:36:38 +0000
committerPaul Phillips <paulp@improving.org>2010-08-07 19:36:38 +0000
commited3dddae4e8b55917217b202f54d5b918ce4030e (patch)
treeb24a8dae0b0ef840b44b13490d2dd6320f0e209f /src
parentf36ea69f64ef5c6024944ba9a7cecca2eb3e9af4 (diff)
downloadscala-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.scala15
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) =>