summaryrefslogtreecommitdiff
path: root/test/files/run/t4729
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-09-29 18:07:09 -0700
committerPaul Phillips <paulp@improving.org>2012-09-29 18:36:30 -0700
commit32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4 (patch)
tree68b610a5cedca13014acdfb1bde79085349f18a9 /test/files/run/t4729
parent75a075b507b1c3f4463ab0eb42fecde66978e903 (diff)
downloadscala-32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4.tar.gz
scala-32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4.tar.bz2
scala-32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4.zip
Fix for SI-4729, overriding java varargs in scala.
This was a bad interaction between anonymous subclasses and bridge methods. new Foo { override def bar = 5 } Scala figures it can mark "bar" private since hey, what's the difference. The problem is that if it was overriding a java-defined varargs method in scala, the bridge method logic says "Oh, it's private? Then you don't need a varargs bridge." Hey scalac, you're the one that made me private! You made me like this! You!
Diffstat (limited to 'test/files/run/t4729')
-rw-r--r--test/files/run/t4729/J_1.java4
-rw-r--r--test/files/run/t4729/S_2.scala29
2 files changed, 33 insertions, 0 deletions
diff --git a/test/files/run/t4729/J_1.java b/test/files/run/t4729/J_1.java
new file mode 100644
index 0000000000..2ffb5a88d1
--- /dev/null
+++ b/test/files/run/t4729/J_1.java
@@ -0,0 +1,4 @@
+// Java Interface:
+public interface J_1 {
+ public void method(String... s);
+}
diff --git a/test/files/run/t4729/S_2.scala b/test/files/run/t4729/S_2.scala
new file mode 100644
index 0000000000..e34e3d34d4
--- /dev/null
+++ b/test/files/run/t4729/S_2.scala
@@ -0,0 +1,29 @@
+ // Scala class:
+class ScalaVarArgs extends J_1 {
+ // -- no problem on overriding it using ordinary class
+ def method(s: String*) { println(s) }
+}
+
+object Test {
+ def main(args: Array[String]) {
+ //[1] Ok - no problem using inferred type
+ val varArgs = new J_1 {
+ def method(s: String*) { println(s) }
+ }
+ varArgs.method("1", "2")
+
+ //[2] Ok -- no problem when explicit set its type after construction
+ val b: J_1 = varArgs
+ b.method("1", "2")
+
+ //[3] Ok -- no problem on calling its method
+ (new ScalaVarArgs).method("1", "2")
+ (new ScalaVarArgs: J_1).method("1", "2")
+
+ //[4] Not Ok -- error when assigning anonymous class to a explictly typed val
+ // Compiler error: object creation impossible, since method method in trait VarArgs of type (s: <repeated...>[java.lang.String])Unit is not defined
+ val tagged: J_1 = new J_1 {
+ def method(s: String*) { println(s) }
+ }
+ }
+}