From aca8f96d1cf5f645c24eac11f695dadae08ea381 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Fri, 1 May 2015 12:34:51 +1000 Subject: 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 int foo() { return 1; } } } % javac sandbox/Test.java sandbox/Test.java:3: error: name clash: foo() in Test.D and foo() in Test.C have the same erasure, yet neither overrides the other class D extends C { private int foo() { return 1; } } ^ where A is a type-variable: A extends Object declared in method foo() 1 error ``` ``` % cat sandbox/Test.java public abstract class Test { class C { private int foo() { return 0; } } class D extends C { 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`. --- test/files/neg/t9286a.check | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 test/files/neg/t9286a.check (limited to 'test/files/neg/t9286a.check') 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 -- cgit v1.2.3