diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-02-02 15:37:24 +0100 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2015-02-07 07:45:51 +0100 |
commit | cd8f2f327106c7e2944afa7ac8b7675262626c1e (patch) | |
tree | c4d820e34fd0a975655d7b30f0975e30fe990fdd /test/files/jvm/innerClassAttribute/Classes_1.scala | |
parent | 1437aa88241d5e99900a86b25c6ce385c2708570 (diff) | |
download | scala-cd8f2f327106c7e2944afa7ac8b7675262626c1e.tar.gz scala-cd8f2f327106c7e2944afa7ac8b7675262626c1e.tar.bz2 scala-cd8f2f327106c7e2944afa7ac8b7675262626c1e.zip |
Fix InnerClass/EnclosingMethod for trait impl and specialized classes
Trait implementation classes and specialized classes are always
considered top-level in terms of the InnerClass / EnclosingMethod
attributes. These attributes describe source-level properties, and
such classes are a compilation artifact.
Note that the same is true for delambdafy:method closure classes
(they are always top-level).
Diffstat (limited to 'test/files/jvm/innerClassAttribute/Classes_1.scala')
-rw-r--r-- | test/files/jvm/innerClassAttribute/Classes_1.scala | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/test/files/jvm/innerClassAttribute/Classes_1.scala b/test/files/jvm/innerClassAttribute/Classes_1.scala index 7b5f5d93b9..e58fd6e26f 100644 --- a/test/files/jvm/innerClassAttribute/Classes_1.scala +++ b/test/files/jvm/innerClassAttribute/Classes_1.scala @@ -240,3 +240,40 @@ trait SI_9124 { val f1 = { new A { def f5 = 0 }; 1 } // encl class SI_9124, no encl meth private val f2 = { new A { def f6 = 0 }; 1 } // like above } + +trait ImplClassesAreTopLevel { + // all impl classes are top-level, so they don't appear in any InnerClass entry, and none of them have an EnclosingMethod attr + trait B1 { def f = 1 } + { trait B2 { def f = 1 }; new B2 {} } + val m = { + trait B3 { def f = 1 } + new B3 {} + } + def n = { + trait B4 { def f = 1 } + new B4 {} + } +} + +class SpecializedClassesAreTopLevel { + // all specialized classes are top-level + class A[@specialized(Int) T]; new A[Int] + + object T { + class B[@specialized(Int) T]; new B[Int] + } + + // these crash the compiler, SI-7625 + + // { class B[@specialized(Int) T]; new B[Int] } + + // val m: Object = { + // class C[@specialized(Int) T] + // new C[Int] + // } + + // def n: Object = { + // class D[@specialized(Int) T] + // new D[Int] + // } +} |