diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-07-17 15:52:48 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-07-28 07:38:16 +0200 |
commit | 050b4c951c838699c2fe30cbf01b63942c63a299 (patch) | |
tree | b74d134cbfc14b3dad08162cf6126296ca285df6 /test/files/run/t7455.check | |
parent | 54cb6af7dbcf630a4f57e98f0099d77dd3b36693 (diff) | |
download | scala-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.check')
-rw-r--r-- | test/files/run/t7455.check | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/test/files/run/t7455.check b/test/files/run/t7455.check new file mode 100644 index 0000000000..0eb9342888 --- /dev/null +++ b/test/files/run/t7455.check @@ -0,0 +1,4 @@ +private[package <empty>] def <init>(x$1: String): Outer[E] +private[package <empty>] def <init>(): Outer$PrivateInner +private[package <empty>] def <init>(): Outer$PrivateStaticInner +private[package <empty>] def <init>(x$2: String): Outer$PublicInner |