From d2d33ddf8ce4dff503c8830958bac0e449eb7d34 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Fri, 18 Nov 2016 15:29:53 +1000 Subject: SI-10067 Java defined inner classes don't have outer accessors If we pretend they do, we can walk into NoSuchMethodErrors when translating type patterns path dependent types. This commit avoids this symptom by changing the explicitouter info transformer. A following commit will change the pattern matcher itself to avoid speculatively adding this outer check that will be always dropped in explicitouter. --- test/files/run/t10067.check | 3 +++ test/files/run/t10067.flags | 1 + test/files/run/t10067/OuterClass.java | 7 +++++++ test/files/run/t10067/Test.scala | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 test/files/run/t10067.check create mode 100644 test/files/run/t10067.flags create mode 100644 test/files/run/t10067/OuterClass.java create mode 100644 test/files/run/t10067/Test.scala (limited to 'test') diff --git a/test/files/run/t10067.check b/test/files/run/t10067.check new file mode 100644 index 0000000000..7e8e5ce4b9 --- /dev/null +++ b/test/files/run/t10067.check @@ -0,0 +1,3 @@ +Test.scala:16: warning: The outer reference in this type test cannot be checked at run time. + case ic: ocStable.InnerClass => ; + ^ diff --git a/test/files/run/t10067.flags b/test/files/run/t10067.flags new file mode 100644 index 0000000000..c02e5f2461 --- /dev/null +++ b/test/files/run/t10067.flags @@ -0,0 +1 @@ +-unchecked diff --git a/test/files/run/t10067/OuterClass.java b/test/files/run/t10067/OuterClass.java new file mode 100644 index 0000000000..15c2c990d7 --- /dev/null +++ b/test/files/run/t10067/OuterClass.java @@ -0,0 +1,7 @@ +public class OuterClass { + public class InnerClass { } + + public Object getInnerClassInstance() { + return new InnerClass(); + } +} diff --git a/test/files/run/t10067/Test.scala b/test/files/run/t10067/Test.scala new file mode 100644 index 0000000000..af1e12592e --- /dev/null +++ b/test/files/run/t10067/Test.scala @@ -0,0 +1,19 @@ +object Test { + def main(args: Array[String]): Unit = { + //get inner class as some instance of super type + var oc = new OuterClass(); + var icObj = oc.getInnerClassInstance(); + + //get a stable identifier on outer class + val ocStable = oc; + + //these will work + icObj.isInstanceOf[ocStable.InnerClass]; + icObj.asInstanceOf[ocStable.InnerClass]; + + //this will fail with java.lang.NoSuchMethodError + icObj match { + case ic: ocStable.InnerClass => ; + } + } +} -- cgit v1.2.3