diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-05-01 12:34:51 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-05-18 11:17:09 +1000 |
commit | aca8f96d1cf5f645c24eac11f695dadae08ea381 (patch) | |
tree | 46badacf236a24013536acee469a898aa979e9c8 /test/files/neg/t9286a.check | |
parent | 2f1b5259188698501dbc8430f63972bf7bc68154 (diff) | |
download | scala-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/t9286a.check')
-rw-r--r-- | test/files/neg/t9286a.check | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/test/files/neg/t9286a.check b/test/files/neg/t9286a.check new file mode 100644 index 0000000000..2bc7c0cf15 --- /dev/null +++ b/test/files/neg/t9286a.check @@ -0,0 +1,7 @@ +t9286a.scala:6: error: name clash between defined and inherited member: +def foo(o: (String,)): Unit in class T and +private def foo(o: (Any,)): Unit at line 6 +have same type after erasure: (o: Tuple1)Unit + private def foo(o: Tuple1[Any]) = () + ^ +one error found |