diff options
author | Paul Phillips <paulp@improving.org> | 2011-10-03 01:28:04 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-10-03 01:28:04 +0000 |
commit | beadafa2d83a539dae8f969b9789f896346484ec (patch) | |
tree | 90c69a49397cdb59120d59307b843c54c8f68908 /test/files/neg | |
parent | 55109d0d253c7e89660f1b61d17408648c0c53a4 (diff) | |
download | scala-beadafa2d83a539dae8f969b9789f896346484ec.tar.gz scala-beadafa2d83a539dae8f969b9789f896346484ec.tar.bz2 scala-beadafa2d83a539dae8f969b9789f896346484ec.zip |
Selective dealiasing when printing errors.
*** Important note for busy commit log skimmers ***
Symbol method "fullName" has been trying to serve the dual role of "how
to print a symbol" and "how to find a class file." It cannot serve both
these roles simultaneously, primarily because of package objects but
other little things as well. Since in the majority of situations we want
the one which corresponds to the idealized scala world, not the grubby
bytecode, I went with that for fullName. When you require the path to a
class (e.g. you are calling Class.forName) you should use javaClassName.
package foo { package object bar { class Bippy } }
If sym is Bippy's symbol, then
sym.fullName == foo.bar.Bippy
sym.javaClassName == foo.bar.package.Bippy
*** End important note ***
There are many situations where we (until now) forewent revealing
everything we knew about a type mismatch. For instance, this isn't very
helpful of scalac (at least in those more common cases where you didn't
define type X on the previous repl line.)
scala> type X = Int
defined type alias X
scala> def f(x: X): Byte = x
<console>:8: error: type mismatch;
found : X
required: Byte
def f(x: X): Byte = x
^
Now it says:
found : X
(which expands to) Int
required: Byte
def f(x: X): Byte = x
^
In addition I rearchitected a number of methods involving:
- finding a symbol's owner
- calculating a symbol's name
- determining whether to print a prefix
No review.
Diffstat (limited to 'test/files/neg')
30 files changed, 60 insertions, 58 deletions
diff --git a/test/files/neg/checksensible.check b/test/files/neg/checksensible.check index 085e00af2e..c085aa2719 100644 --- a/test/files/neg/checksensible.check +++ b/test/files/neg/checksensible.check @@ -25,10 +25,10 @@ checksensible.scala:26: error: comparing values of types Unit and Int using `==' checksensible.scala:27: error: comparing values of types Int and Unit using `==' will always yield false 0 == (c = 1) ^ -checksensible.scala:29: error: comparing values of types Int and java.lang.String using `==' will always yield false +checksensible.scala:29: error: comparing values of types Int and String using `==' will always yield false 1 == "abc" ^ -checksensible.scala:32: error: java.lang.String and Int are unrelated: they will most likely never compare equal +checksensible.scala:32: error: String and Int are unrelated: they will most likely never compare equal "abc" == 1 // warns because the lub of String and Int is Any ^ checksensible.scala:33: error: Some[Int] and Int are unrelated: they will most likely never compare equal @@ -37,7 +37,7 @@ checksensible.scala:33: error: Some[Int] and Int are unrelated: they will most l checksensible.scala:35: error: comparing a fresh object using `==' will always yield false new AnyRef == 1 ^ -checksensible.scala:38: error: comparing values of types Int and java.lang.Boolean using `==' will always yield false +checksensible.scala:38: error: comparing values of types Int and Boolean using `==' will always yield false 1 == (new java.lang.Boolean(true)) ^ checksensible.scala:40: error: comparing values of types Int and Boolean using `!=' will always yield true @@ -88,7 +88,7 @@ checksensible.scala:76: error: comparing values of types EqEqRefTest.this.Z1 and checksensible.scala:77: error: comparing values of types EqEqRefTest.this.Z1 and EqEqRefTest.this.C3 using `!=' will always yield true z1 != c3 ^ -checksensible.scala:78: error: comparing values of types EqEqRefTest.this.C3 and java.lang.String using `!=' will always yield true +checksensible.scala:78: error: comparing values of types EqEqRefTest.this.C3 and String using `!=' will always yield true c3 != "abc" ^ checksensible.scala:89: error: comparing values of types Unit and Int using `!=' will always yield true diff --git a/test/files/neg/found-req-variance.check b/test/files/neg/found-req-variance.check index 828e40a48b..cc26458ac5 100644 --- a/test/files/neg/found-req-variance.check +++ b/test/files/neg/found-req-variance.check @@ -163,15 +163,15 @@ You may wish to define A as +A instead. (SLS 4.5) ^ found-req-variance.scala:100: error: type mismatch; found : Set[String] - required: Set[java.lang.CharSequence] -Note: String <: java.lang.CharSequence, but trait Set is invariant in type A. -You may wish to investigate a wildcard type such as `_ <: java.lang.CharSequence`. (SLS 3.2.10) + required: Set[CharSequence] +Note: String <: CharSequence, but trait Set is invariant in type A. +You may wish to investigate a wildcard type such as `_ <: CharSequence`. (SLS 3.2.10) foo(s) ^ found-req-variance.scala:104: error: type mismatch; found : Misc.Trippy[String,String,String] - required: Misc.Trippy[java.lang.Object,java.lang.Object,java.lang.Object] -Note: String <: java.lang.Object, but class Trippy is invariant in type T2. + required: Misc.Trippy[Object,Object,Object] +Note: String <: Object, but class Trippy is invariant in type T2. You may wish to define T2 as +T2 instead. (SLS 4.5) def g1 = Set[Trippy[AnyRef, AnyRef, AnyRef]]() + new Trippy[String, String, String] ^ diff --git a/test/files/neg/implicits.check b/test/files/neg/implicits.check index f7923131e1..cd9dfebf48 100644 --- a/test/files/neg/implicits.check +++ b/test/files/neg/implicits.check @@ -1,5 +1,5 @@ implicits.scala:38: error: type mismatch; - found : test2.HSome[java.lang.String,test2.HMap] + found : test2.HSome[String,test2.HMap] required: Int foo(set) ^ diff --git a/test/files/neg/names-defaults-neg.check b/test/files/neg/names-defaults-neg.check index d2bd2d123b..03e44f745d 100644 --- a/test/files/neg/names-defaults-neg.check +++ b/test/files/neg/names-defaults-neg.check @@ -3,7 +3,7 @@ Unspecified value parameter b. val fac = Fact(1)(2, 3) ^ names-defaults-neg.scala:5: error: type mismatch; - found : java.lang.String("#") + found : String("#") required: Int test1(b = 2, a = "#") ^ @@ -40,26 +40,26 @@ names-defaults-neg.scala:26: error: Int does not take parameters test3(b = 3, a = 1)(3) ^ names-defaults-neg.scala:35: error: ambiguous reference to overloaded definition, -both method f in object t1 of type (b: String, a: Int)java.lang.String -and method f in object t1 of type (a: Int, b: String)java.lang.String -match argument types (b: java.lang.String,a: Int) +both method f in object t1 of type (b: String, a: Int)String +and method f in object t1 of type (a: Int, b: String)String +match argument types (b: String,a: Int) t1.f(b = "dkljf", a = 1) ^ names-defaults-neg.scala:42: error: ambiguous reference to overloaded definition, -both method f in object t3 of type (a2: Int)(b: Int)java.lang.String -and method f in object t3 of type (a1: Int)java.lang.String +both method f in object t3 of type (a2: Int)(b: Int)String +and method f in object t3 of type (a1: Int)String match argument types (Int) t3.f(1) ^ names-defaults-neg.scala:43: error: ambiguous reference to overloaded definition, -both method f in object t3 of type (a2: Int)(b: Int)java.lang.String -and method f in object t3 of type (a1: Int)java.lang.String +both method f in object t3 of type (a2: Int)(b: Int)String +and method f in object t3 of type (a1: Int)String match argument types (Int) t3.f(1)(2) ^ names-defaults-neg.scala:49: error: ambiguous reference to overloaded definition, -both method g in object t7 of type (a: B)java.lang.String -and method g in object t7 of type (a: C, b: Int*)java.lang.String +both method g in object t7 of type (a: B)String +and method g in object t7 of type (a: C, b: Int*)String match argument types (C) t7.g(new C()) // ambigous reference ^ @@ -73,9 +73,9 @@ names-defaults-neg.scala:55: error: when using named arguments, the vararg param test5(b = "dlkj") ^ names-defaults-neg.scala:61: error: ambiguous reference to overloaded definition, -both method f in object t8 of type (b: String, a: Int)java.lang.String -and method f in object t8 of type (a: Int, b: java.lang.Object)java.lang.String -match argument types (a: Int,b: java.lang.String) and expected result type Any +both method f in object t8 of type (b: String, a: Int)String +and method f in object t8 of type (a: Int, b: Object)String +match argument types (a: Int,b: String) and expected result type Any println(t8.f(a = 0, b = "1")) // ambigous reference ^ names-defaults-neg.scala:69: error: wrong number of arguments for <none>: (x: Int, y: String)A1 diff --git a/test/files/neg/no-predef.check b/test/files/neg/no-predef.check index 4f09c1c31f..a63d8c5ba5 100644 --- a/test/files/neg/no-predef.check +++ b/test/files/neg/no-predef.check @@ -8,7 +8,7 @@ no-predef.scala:3: error: type mismatch; required: scala.Long def f2 = new java.lang.Long(5) : Long ^ -no-predef.scala:4: error: value map is not a member of java.lang.String +no-predef.scala:4: error: value map is not a member of String def f3 = "abc" map (_ + 1) ^ three errors found diff --git a/test/files/neg/override-object-no.check b/test/files/neg/override-object-no.check index c509634b3f..6e028d0add 100644 --- a/test/files/neg/override-object-no.check +++ b/test/files/neg/override-object-no.check @@ -6,8 +6,8 @@ an overriding object must conform to the overridden object's class bound; ^ override-object-no.scala:21: error: overriding object Bar in trait Quux1 with object Bar in trait Quux2: an overriding object must conform to the overridden object's class bound; - found : java.lang.Object with ScalaObject{def g: java.lang.String} - required: java.lang.Object with ScalaObject{def g: Int} + found : Object with ScalaObject{def g: String} + required: Object with ScalaObject{def g: Int} trait Quux2 extends Quux1 { override object Bar { def g = "abc" } } // err ^ override-object-no.scala:25: error: overriding object Bar in trait Quux3 of type object Quux4.this.Bar; diff --git a/test/files/neg/patmat-type-check.check b/test/files/neg/patmat-type-check.check index 8f81cede8f..e045841ce1 100644 --- a/test/files/neg/patmat-type-check.check +++ b/test/files/neg/patmat-type-check.check @@ -1,6 +1,6 @@ patmat-type-check.scala:22: error: scrutinee is incompatible with pattern type; found : Seq[A] - required: java.lang.String + required: String def f1 = "bob".reverse match { case Seq('b', 'o', 'b') => true } // fail ^ patmat-type-check.scala:23: error: scrutinee is incompatible with pattern type; diff --git a/test/files/neg/primitive-sigs-1.check b/test/files/neg/primitive-sigs-1.check index befb8219dd..8713d95cc3 100644 --- a/test/files/neg/primitive-sigs-1.check +++ b/test/files/neg/primitive-sigs-1.check @@ -1,6 +1,6 @@ A_3.scala:3: error: type mismatch; found : Bippy - required: AC[java.lang.Integer] + required: AC[Integer] J_2.f(new Bippy()) ^ one error found diff --git a/test/files/neg/protected-constructors.check b/test/files/neg/protected-constructors.check index 3add24c089..f137158ed6 100644 --- a/test/files/neg/protected-constructors.check +++ b/test/files/neg/protected-constructors.check @@ -19,7 +19,7 @@ protected-constructors.scala:15: error: class Foo3 in object Ding cannot be acce object Ding in package dingus where target is defined class Bar3 extends Ding.Foo3("abc") ^ -protected-constructors.scala:15: error: too many arguments for constructor Object: ()java.lang.Object +protected-constructors.scala:15: error: too many arguments for constructor Object: ()Object class Bar3 extends Ding.Foo3("abc") ^ 5 errors found diff --git a/test/files/neg/t0152.check b/test/files/neg/t0152.check index 84f78dc83c..a7909bf14d 100644 --- a/test/files/neg/t0152.check +++ b/test/files/neg/t0152.check @@ -1,6 +1,6 @@ t0152.scala:10: error: illegal inheritance; object boom inherits different type instances of class Value: -Value[Int] and Value[java.lang.String] +Value[Int] and Value[String] object boom extends Value[java.lang.String]("foo") with PlusOne ^ one error found diff --git a/test/files/neg/t0764.check b/test/files/neg/t0764.check index 9f0cedc69b..0788db7f6e 100644 --- a/test/files/neg/t0764.check +++ b/test/files/neg/t0764.check @@ -1,5 +1,5 @@ t0764.scala:13: error: type mismatch; - found : java.lang.Object with Node{type T = _1.type} where val _1: Node{type T = NextType} + found : Object with Node{type T = _1.type} where val _1: Node{type T = NextType} required: Node{type T = Main.this.AType} new Main[AType]( (value: AType).prepend ) ^ diff --git a/test/files/neg/t112706A.check b/test/files/neg/t112706A.check index 42584b9707..30d0c3ec91 100644 --- a/test/files/neg/t112706A.check +++ b/test/files/neg/t112706A.check @@ -1,6 +1,6 @@ t112706A.scala:5: error: constructor cannot be instantiated to expected type; found : (T1, T2) - required: java.lang.String + required: String case Tuple2(node,_) => ^ one error found diff --git a/test/files/neg/t1701.check b/test/files/neg/t1701.check index 782b690bf0..d603e62e5a 100644 --- a/test/files/neg/t1701.check +++ b/test/files/neg/t1701.check @@ -1,4 +1,4 @@ -t1701.scala:1: error: java.lang.Cloneable does not take type parameters +t1701.scala:1: error: Cloneable does not take type parameters class A extends java.lang.Cloneable[String, Option, Int] ^ one error found diff --git a/test/files/neg/t1878.check b/test/files/neg/t1878.check index 4b9cfebde1..f3a6701d41 100644 --- a/test/files/neg/t1878.check +++ b/test/files/neg/t1878.check @@ -3,7 +3,7 @@ t1878.scala:3: error: _* may only come last ^ t1878.scala:3: error: scrutinee is incompatible with pattern type; found : Seq[A] - required: java.lang.String + required: String val err1 = "" match { case Seq(f @ _*, ',') => f } ^ t1878.scala:9: error: _* may only come last diff --git a/test/files/neg/t2078.check b/test/files/neg/t2078.check index 1b79c19621..3cdaa7d27a 100644 --- a/test/files/neg/t2078.check +++ b/test/files/neg/t2078.check @@ -1,4 +1,4 @@ -t2078.scala:2: error: contravariant type S occurs in covariant position in type => java.lang.Object{val x: S} of value f +t2078.scala:2: error: contravariant type S occurs in covariant position in type => Object{val x: S} of value f val f = new { val x = y } ^ one error found diff --git a/test/files/neg/t2386.check b/test/files/neg/t2386.check index 2caa46c731..1a01696a9a 100644 --- a/test/files/neg/t2386.check +++ b/test/files/neg/t2386.check @@ -1,4 +1,4 @@ -t2386.scala:2: error: could not find implicit value for evidence parameter of type scala.reflect.ClassManifest[Array[_ >: java.lang.String with Int]] +t2386.scala:2: error: could not find implicit value for evidence parameter of type scala.reflect.ClassManifest[Array[_ >: String with Int]] val a = Array(Array(1, 2), Array("a","b")) ^ one error found diff --git a/test/files/neg/t3006.check b/test/files/neg/t3006.check index 9a90d32b28..2447eebc9c 100644 --- a/test/files/neg/t3006.check +++ b/test/files/neg/t3006.check @@ -1,5 +1,5 @@ t3006.scala:8: error: type mismatch; - found : java.lang.String("H") + found : String("H") required: Int println(A(3) + "H") ^ diff --git a/test/files/neg/t3015.check b/test/files/neg/t3015.check index 32809b0669..6095efc6a7 100644 --- a/test/files/neg/t3015.check +++ b/test/files/neg/t3015.check @@ -1,10 +1,10 @@ t3015.scala:7: error: scrutinee is incompatible with pattern type; found : _$1 where type _$1 - required: java.lang.String + required: String val b(foo) = "foo" ^ t3015.scala:7: error: type mismatch; - found : _$1(in value foo) where type _$1(in value foo) <: java.lang.String + found : _$1(in value foo) where type _$1(in value foo) <: String required: (some other)_$1(in value foo) where type (some other)_$1(in value foo) val b(foo) = "foo" ^ diff --git a/test/files/neg/t3691.check b/test/files/neg/t3691.check index 1b548cc84d..cd7b440dce 100644 --- a/test/files/neg/t3691.check +++ b/test/files/neg/t3691.check @@ -1,15 +1,15 @@ t3691.scala:4: error: type mismatch; - found : java.lang.Object with Test.A[String] + found : Object with Test.A[String] required: AnyRef{type A[x]} val b = (new A[String]{}): { type A[x] } // not ok ^ t3691.scala:5: error: type mismatch; - found : java.lang.Object with Test.A[String] + found : Object with Test.A[String] required: AnyRef{type A} val c = (new A[String]{}): { type A } // not ok ^ t3691.scala:7: error: type mismatch; - found : java.lang.Object{type A = String} + found : Object{type A = String} required: AnyRef{type A[X]} val x = (new { type A = String }): { type A[X] } // not ok ^ diff --git a/test/files/neg/t3987.check b/test/files/neg/t3987.check index d72e2d4828..a9f7912b77 100644 --- a/test/files/neg/t3987.check +++ b/test/files/neg/t3987.check @@ -1,6 +1,7 @@ t3987.scala:11: error: type mismatch; found : Gox required: Test.GoxZed + (which expands to) t#Zed forSome { type t <: Gox } val y: GoxZed = x ^ one error found diff --git a/test/files/neg/t4158.check b/test/files/neg/t4158.check index db61ff2ec4..3ee2627c5b 100644 --- a/test/files/neg/t4158.check +++ b/test/files/neg/t4158.check @@ -3,7 +3,7 @@ t4158.scala:3: error: type mismatch; required: Int Note that implicit conversions are not applicable because they are ambiguous: both method Integer2intNullConflict in class LowPriorityImplicits of type (x: Null)Int - and method Integer2int in object Predef of type (x: java.lang.Integer)Int + and method Integer2int in object Predef of type (x: Integer)Int are possible conversion functions from Null(null) to Int var y = null: Int ^ @@ -12,7 +12,7 @@ t4158.scala:2: error: type mismatch; required: Int Note that implicit conversions are not applicable because they are ambiguous: both method Integer2intNullConflict in class LowPriorityImplicits of type (x: Null)Int - and method Integer2int in object Predef of type (x: java.lang.Integer)Int + and method Integer2int in object Predef of type (x: Integer)Int are possible conversion functions from Null(null) to Int var x: Int = null ^ diff --git a/test/files/neg/t4417.check b/test/files/neg/t4417.check index 0a5ea2265b..4e3f6c0b10 100644 --- a/test/files/neg/t4417.check +++ b/test/files/neg/t4417.check @@ -4,4 +4,4 @@ t4417.scala:11: error: constructor Pixel$mcD$sp in class Pixel$mcD$sp cannot be class Pixel$mcD$sp where target is defined def apply(v: Double): Pixel1d = new Pixel1d(v) ^ -one error found
\ No newline at end of file +one error found diff --git a/test/files/neg/t4727.check b/test/files/neg/t4727.check index 9fa0fa54d1..8a4536fec3 100644 --- a/test/files/neg/t4727.check +++ b/test/files/neg/t4727.check @@ -3,7 +3,7 @@ t4727.scala:5: error: type mismatch; required: Int Note that implicit conversions are not applicable because they are ambiguous: both method Integer2intNullConflict in class LowPriorityImplicits of type (x: Null)Int - and method Integer2int in object Predef of type (x: java.lang.Integer)Int + and method Integer2int in object Predef of type (x: Integer)Int are possible conversion functions from Null to Int Error occurred in an application involving default arguments. new C[Int] diff --git a/test/files/neg/t4877.check b/test/files/neg/t4877.check index 5a5561b070..0f72300bb4 100644 --- a/test/files/neg/t4877.check +++ b/test/files/neg/t4877.check @@ -1,22 +1,22 @@ t4877.scala:4: error: type mismatch; - found : java.lang.Object{def bar: Int} + found : Object{def bar: Int} required: AnyRef{def bar: String} def foo: AnyRef { def bar: String } = new AnyRef { def bar = 42 } ^ t4877.scala:6: error: type mismatch; - found : java.lang.Object{def bar(x: Int): java.lang.String} + found : Object{def bar(x: Int): String} required: AnyRef{def bar(x: Int): Int} def foo3: AnyRef { def bar(x: Int): Int } = new AnyRef { def bar(x: Int) = "abc" } ^ t4877.scala:7: error: type mismatch; - found : java.lang.Object with C{def bar(x: Int): Int} + found : Object with C{def bar(x: Int): Int} required: C{def bar(x: Int): Int; def quux(x: Int): Int} def foo4: C { def bar(x: Int): Int ; def quux(x: Int): Int } = new C { def bar(x: Int) = 5 } ^ t4877.scala:17: error: type mismatch; - found : java.lang.Object{type Mom = String; def bar(x: Int): Int; def bippy(): List[Int]} - required: B.this.Bippy (which expands to) - AnyRef{type Mom; def bar(x: Int): this.Mom; def bippy(): List[this.Mom]} + found : Object{type Mom = String; def bar(x: Int): Int; def bippy(): List[Int]} + required: B.this.Bippy + (which expands to) AnyRef{type Mom; def bar(x: Int): this.Mom; def bippy(): List[this.Mom]} val x: Bippy = new AnyRef { ^ four errors found diff --git a/test/files/neg/t515.check b/test/files/neg/t515.check index 351e99aa55..47d2d30d01 100644 --- a/test/files/neg/t515.check +++ b/test/files/neg/t515.check @@ -1,5 +1,5 @@ t515.scala:7: error: type mismatch; - found : java.lang.String + found : String required: Test.Truc val parent: Truc = file.getMachin ^ diff --git a/test/files/neg/t663.check b/test/files/neg/t663.check index a790a7d70a..40161fb3e3 100644 --- a/test/files/neg/t663.check +++ b/test/files/neg/t663.check @@ -1,7 +1,7 @@ t663.scala:11: error: name clash between defined and inherited member: method asMatch:(m: Test.this.Node)Any and method asMatch:(node: Test.this.Matchable)Any in trait MatchableImpl -have same type after erasure: (m: test.Test#NodeImpl)java.lang.Object +have same type after erasure: (m: test.Test#NodeImpl)Object def asMatch(m : Node) : Any = { ^ one error found diff --git a/test/files/neg/t836.check b/test/files/neg/t836.check index be3a87882b..cf2faf926f 100644 --- a/test/files/neg/t836.check +++ b/test/files/neg/t836.check @@ -1,6 +1,7 @@ t836.scala:9: error: type mismatch; found : Any required: A.this.S + (which expands to) A.this.MyObj#S val some: S = any // compiles => type X is set to scala.Any ^ one error found diff --git a/test/files/neg/t909.check b/test/files/neg/t909.check index 5138b8c507..e7a42bd246 100644 --- a/test/files/neg/t909.check +++ b/test/files/neg/t909.check @@ -1,5 +1,5 @@ t909.scala:6: error: type mismatch; - found : java.lang.String("Hello") + found : String("Hello") required: Int case Foo("Hello") => ^ diff --git a/test/files/neg/tcpoly_variance.check b/test/files/neg/tcpoly_variance.check index 0695fa09a1..c0dfcac2dd 100644 --- a/test/files/neg/tcpoly_variance.check +++ b/test/files/neg/tcpoly_variance.check @@ -1,4 +1,4 @@ -tcpoly_variance.scala:6: error: overriding method str in class A of type => m[java.lang.Object]; +tcpoly_variance.scala:6: error: overriding method str in class A of type => m[Object]; method str has incompatible type override def str: m[String] = sys.error("foo") // since x in m[x] is invariant, ! m[String] <: m[Object] ^ diff --git a/test/files/neg/varargs.check b/test/files/neg/varargs.check index 676a611341..424e24403c 100644 --- a/test/files/neg/varargs.check +++ b/test/files/neg/varargs.check @@ -1,10 +1,10 @@ -varargs.scala:16: error: A method with a varargs annotation produces a forwarder method with the same signature (a: Int, b: Array[java.lang.String])Int as an existing method. +varargs.scala:16: error: A method with a varargs annotation produces a forwarder method with the same signature (a: Int, b: Array[String])Int as an existing method. @varargs def v1(a: Int, b: String*) = a + b.length ^ varargs.scala:19: error: A method without repeated parameters cannot be annotated with the `varargs` annotation. @varargs def nov(a: Int) = 0 ^ -varargs.scala:21: error: A method with a varargs annotation produces a forwarder method with the same signature (a: Int, b: Array[java.lang.String])Int as an existing method. +varargs.scala:21: error: A method with a varargs annotation produces a forwarder method with the same signature (a: Int, b: Array[String])Int as an existing method. @varargs def v2(a: Int, b: String*) = 0 ^ three errors found |