summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-11-15 07:28:19 -0800
committerPaul Phillips <paulp@improving.org>2012-11-15 07:28:19 -0800
commit4444369ddf39176dcfae4bcf1901697a6ccdfd42 (patch)
tree8185867c2809f115325c9589d06a220f8d8c5367
parentbc60605e182d526e4224c804d218e9a0e2952b72 (diff)
parent6023706458ca14ecd62a0b1b68352662e787020f (diff)
downloadscala-4444369ddf39176dcfae4bcf1901697a6ccdfd42.tar.gz
scala-4444369ddf39176dcfae4bcf1901697a6ccdfd42.tar.bz2
scala-4444369ddf39176dcfae4bcf1901697a6ccdfd42.zip
Merge pull request #1629 from paulp/issue/6355
Error for SI-6355, overloading of applyDynamic.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala9
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala2
-rw-r--r--test/files/neg/t6355.check4
-rw-r--r--test/files/neg/t6355.scala13
4 files changed, 27 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index dbd2a0e49b..24b0611d6a 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -130,6 +130,15 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
}
}
}
+
+ // Check for doomed attempt to overload applyDynamic
+ if (clazz isSubClass DynamicClass) {
+ clazz.info member nme.applyDynamic match {
+ case sym if sym.isOverloaded => unit.error(sym.pos, "implementation restriction: applyDynamic cannot be overloaded")
+ case _ =>
+ }
+ }
+
if (settings.lint.value) {
clazz.info.decls filter (x => x.isImplicit && x.typeParams.nonEmpty) foreach { sym =>
val alts = clazz.info.decl(sym.name).alternatives
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index f5e9540d28..0539735a51 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3871,7 +3871,7 @@ trait Typers extends Modes with Adaptations with Tags {
*
*/
def mkInvoke(cxTree: Tree, tree: Tree, qual: Tree, name: Name): Option[Tree] = {
- debuglog(s"mkInvoke($cxTree, $tree, $qual, $name)")
+ debuglog(s"dyna.mkInvoke($cxTree, $tree, $qual, $name)")
acceptsApplyDynamicWithType(qual, name) map { tp =>
// tp eq NoType => can call xxxDynamic, but not passing any type args (unless specified explicitly by the user)
// in scala-virtualized, when not NoType, tp is passed as type argument (for selection on a staged Struct)
diff --git a/test/files/neg/t6355.check b/test/files/neg/t6355.check
new file mode 100644
index 0000000000..c1fa147f52
--- /dev/null
+++ b/test/files/neg/t6355.check
@@ -0,0 +1,4 @@
+t6355.scala:12: error: implementation restriction: applyDynamic cannot be overloaded
+ def applyDynamic(name: String)(x: Int): Int = 2
+ ^
+one error found
diff --git a/test/files/neg/t6355.scala b/test/files/neg/t6355.scala
new file mode 100644
index 0000000000..3007dc49f6
--- /dev/null
+++ b/test/files/neg/t6355.scala
@@ -0,0 +1,13 @@
+package foo
+
+import scala.language.dynamics
+
+class DoesntExtendDynamic {
+ def applyDynamic(name: String)(s: String): Int = 1
+ def applyDynamic(name: String)(x: Int): Int = 2
+}
+
+class A extends Dynamic {
+ def applyDynamic(name: String)(s: String): Int = 1
+ def applyDynamic(name: String)(x: Int): Int = 2
+}