summaryrefslogtreecommitdiff
path: root/test/files/run/t7455/Outer.java
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-07-17 15:52:48 +1000
committerJason Zaugg <jzaugg@gmail.com>2013-07-28 07:38:16 +0200
commit050b4c951c838699c2fe30cbf01b63942c63a299 (patch)
treeb74d134cbfc14b3dad08162cf6126296ca285df6 /test/files/run/t7455/Outer.java
parent54cb6af7dbcf630a4f57e98f0099d77dd3b36693 (diff)
downloadscala-050b4c951c838699c2fe30cbf01b63942c63a299.tar.gz
scala-050b4c951c838699c2fe30cbf01b63942c63a299.tar.bz2
scala-050b4c951c838699c2fe30cbf01b63942c63a299.zip
SI-7455 Drop dummy param for synthetic access constructor
Java synthesizes public constructors in private classes to allow access from inner classes. The signature of that synthetic constructor (known as a "access constructor") has a dummy parameter appended to avoid overloading clashes. javac chooses the type "Enclosing$1" for the dummy parameter (called the "access constructor tag") which is either an existing anonymous class or a synthesized class for this purpose. In OpenJDK, this transformation is performed in: langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java (Incidentally, scalac would just emits a byte-code public constructor in this situation, rather than a private constructor / access constructor pair.) Scala parses the signature of the access contructor, and drops the $outer parameter, but retains the dummy parameter. This causes havoc when it tries to parse the bytecode for that anonymous class; the class file parser doesn't have the enclosing type parameters of Vector in scope and crash ensues. In any case, we shouldn't allow user code to see that constructor; it should only be called from within its own compilation unit. This commit drops the dummy parameter from access constructor signatures in class file parsing.
Diffstat (limited to 'test/files/run/t7455/Outer.java')
-rw-r--r--test/files/run/t7455/Outer.java31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/files/run/t7455/Outer.java b/test/files/run/t7455/Outer.java
new file mode 100644
index 0000000000..10c97a9150
--- /dev/null
+++ b/test/files/run/t7455/Outer.java
@@ -0,0 +1,31 @@
+public class Outer<E> {
+ public void elements() {
+ new C<E>() {
+ };
+ }
+
+ private Outer(String a) {}
+
+ static class SubSelf extends Outer<String> {
+ public SubSelf() { super(""); }
+ }
+
+ private class PrivateInner {
+ }
+ class SubPrivateInner extends PrivateInner {
+ }
+
+ private class PublicInner {
+ private PublicInner(String a) {}
+ }
+ class SubPublicInner extends PublicInner {
+ public SubPublicInner() { super(""); }
+ }
+
+ private static class PrivateStaticInner {
+ }
+ public static class SubPrivateStaticInner extends PrivateStaticInner {
+ }
+}
+
+class C<E> {}