summaryrefslogtreecommitdiff
path: root/test/files/neg/t9286b.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-05-01 12:34:51 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-05-18 11:17:09 +1000
commitaca8f96d1cf5f645c24eac11f695dadae08ea381 (patch)
tree46badacf236a24013536acee469a898aa979e9c8 /test/files/neg/t9286b.scala
parent2f1b5259188698501dbc8430f63972bf7bc68154 (diff)
downloadscala-aca8f96d1cf5f645c24eac11f695dadae08ea381.tar.gz
scala-aca8f96d1cf5f645c24eac11f695dadae08ea381.tar.bz2
scala-aca8f96d1cf5f645c24eac11f695dadae08ea381.zip
SI-9286 Check subclass privates for "same type after erasure"
The overriding pairs cursor used to detect erased signature clashes was turning a blind eye to any pair that contained a private method. However, this could lead to a `VerifyError` or `IllegalAccessError`. Checking against javac's behaviour in both directions: ``` % cat sandbox/Test.java public abstract class Test { class C { int foo() { return 0; } } class D extends C { private <A> int foo() { return 1; } } } % javac sandbox/Test.java sandbox/Test.java:3: error: name clash: <A>foo() in Test.D and foo() in Test.C have the same erasure, yet neither overrides the other class D extends C { private <A> int foo() { return 1; } } ^ where A is a type-variable: A extends Object declared in method <A>foo() 1 error ``` ``` % cat sandbox/Test.java public abstract class Test { class C { private int foo() { return 0; } } class D extends C { <A> int foo() { return 1; } } } % javac sandbox/Test.java % ``` This commit only the exludes private symbols from the superclass from the checks by moving the test from `excludes` to `matches`.
Diffstat (limited to 'test/files/neg/t9286b.scala')
-rw-r--r--test/files/neg/t9286b.scala5
1 files changed, 5 insertions, 0 deletions
diff --git a/test/files/neg/t9286b.scala b/test/files/neg/t9286b.scala
new file mode 100644
index 0000000000..5c23075426
--- /dev/null
+++ b/test/files/neg/t9286b.scala
@@ -0,0 +1,5 @@
+class C { def foo = 0 }
+class D extends C { private def foo[A] = 0 }
+
+class E { private def foo = 0 }
+class F extends E { def foo[A] = 0 } // okay