summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-03-16 16:14:27 +1000
committerJason Zaugg <jzaugg@gmail.com>2016-03-18 11:49:33 +1000
commitc8e6050c3c190dd064642b6b77fc179f27b0495d (patch)
tree467cd7042e9d889c797bde34bc00be676d668cac /test
parent699a5d907943330c59cea8e7b1abb536af8e5885 (diff)
downloadscala-c8e6050c3c190dd064642b6b77fc179f27b0495d.tar.gz
scala-c8e6050c3c190dd064642b6b77fc179f27b0495d.tar.bz2
scala-c8e6050c3c190dd064642b6b77fc179f27b0495d.zip
New trait encoding: use default methods, jettison impl classes
Until now, concrete methods in traits were encoded with "trait implementation classes". - Such a trait would compile to two class files - the trait interface, a Java interface, and - the implementation class, containing "trait implementation methods" - trait implementation methods are static methods has an explicit self parameter. - some methods don't require addition of an interface method, such as private methods. Calls to these directly call the implementation method - classes that mixin a trait install "trait forwarders", which implement the abstract method in the interface by forwarding to the trait implementation method. The new encoding: - no longer emits trait implementation classes or trait implementation methods. - instead, concrete methods are simply retained in the interface, as JVM 8 default interface methods (the JVM spec changes in [JSR-335](http://download.oracle.com/otndocs/jcp/lambda-0_9_3-fr-eval-spec/index.html) pave the way) - use `invokespecial` to call private or particular super implementations of a method (rather `invokestatic`) - in cases when we `invokespecial` to a method in an indirect ancestor, we add that ancestor redundantly as a direct parent. We are investigating alternatives approaches here. - we still emit trait fowrarders, although we are [investigating](https://github.com/scala/scala-dev/issues/98) ways to only do this when the JVM would be unable to resolve the correct method using its rules for default method resolution. Here's an example: ``` trait T { println("T") def m1 = m2 private def m2 = "m2" } trait U extends T { println("T") override def m1 = super[T].m1 } class C extends U { println("C") def test = m1 } ``` The old and new encodings are displayed and diffed here: https://gist.github.com/retronym/f174d23f859f0e053580 Some notes in the implementation: - No need to filter members from class decls at all in AddInterfaces (although we do have to trigger side effecting info transformers) - We can now emit an EnclosingMethod attribute for classes nested in private trait methods - Created a factory method for an AST shape that is used in a number of places to symbolically bind to a particular super method without needed to specify the qualifier of the `Super` tree (which is too limiting, as it only allows you to refer to direct parents.) - I also found a similar tree shape created in Delambdafy, that is better expressed with an existing tree creation factory method, mkSuperInit.
Diffstat (limited to 'test')
-rw-r--r--test/files/jvm/innerClassAttribute/Classes_1.scala2
-rw-r--r--test/files/jvm/innerClassAttribute/Test.scala2
-rw-r--r--test/files/pos/t3234.scala8
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala11
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala5
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala5
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala21
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala86
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala42
-rw-r--r--test/junit/scala/tools/nsc/symtab/FlagsTest.scala1
10 files changed, 106 insertions, 77 deletions
diff --git a/test/files/jvm/innerClassAttribute/Classes_1.scala b/test/files/jvm/innerClassAttribute/Classes_1.scala
index 5b821d43f8..0abed140f1 100644
--- a/test/files/jvm/innerClassAttribute/Classes_1.scala
+++ b/test/files/jvm/innerClassAttribute/Classes_1.scala
@@ -222,7 +222,7 @@ trait SI_9124 {
def f = new A { def f2 = 0 } // enclosing method is f in the interface SI_9124
- private def g = new A { def f3 = 0 } // only encl class (SI_9124), encl meth is null because the interface SI_9124 doesn't have a method g
+ private def g: Object = new A { def f3 = 0 } // only encl class (SI_9124), encl meth can be g in 2.12 because the interface SI_9124 now has the method g
object O { // member, no encl meth attribute
new A { def f4 = 0 } // enclosing class is O$, no enclosing method
diff --git a/test/files/jvm/innerClassAttribute/Test.scala b/test/files/jvm/innerClassAttribute/Test.scala
index 903d08f72d..490128d5d2 100644
--- a/test/files/jvm/innerClassAttribute/Test.scala
+++ b/test/files/jvm/innerClassAttribute/Test.scala
@@ -340,7 +340,7 @@ object Test extends BytecodeTest {
assertNoEnclosingMethod("SI_9124$A")
assertEnclosingMethod(classes("f1"), "SI_9124", null, null)
assertEnclosingMethod(classes("f2"), "SI_9124", "f", "()LSI_9124$A;")
- assertEnclosingMethod(classes("f3"), "SI_9124", null, null)
+ assertEnclosingMethod(classes("f3"), "SI_9124", "g", "()Ljava/lang/Object;")
assertEnclosingMethod(classes("f4"), "SI_9124$O$", null, null)
assertEnclosingMethod(classes("f5"), "SI_9124", null, null)
assertEnclosingMethod(classes("f6"), "SI_9124", null, null)
diff --git a/test/files/pos/t3234.scala b/test/files/pos/t3234.scala
index c3b7366db8..8c588e5aa9 100644
--- a/test/files/pos/t3234.scala
+++ b/test/files/pos/t3234.scala
@@ -1,17 +1,17 @@
trait Trait1 {
- @inline def foo2(n: Int) = n*n
+ @inline final def foo2(n: Int) = n*n
}
trait Trait2 {
- @inline def foo3(n: Int) = 1
+ @inline final def foo3(n: Int) = 1
}
class Base extends Trait1 {
- @inline def foo(n: Int) = n
+ @inline final def foo(n: Int) = n
}
object Test extends Base with Trait2 {
def main(args: Array[String]) = {
println(foo(42) + foo2(11) + foo3(2))
}
-} \ No newline at end of file
+}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala
index 9e6a148dba..dfbedbaa25 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/BTypesFromClassfileTest.scala
@@ -67,7 +67,16 @@ class BTypesFromClassfileTest {
// there's a separate InlineInfoTest.
val chk1 = sameBTypes(fromSym.superClass, fromClassfile.superClass, checked)
- val chk2 = sameBTypes(fromSym.interfaces, fromClassfile.interfaces, chk1)
+
+ val fromSymInterfaces = fromSym.interfaces
+ val fromClassFileInterfaces = fromClassfile.interfaces
+ val (matching, other) = fromClassFileInterfaces.partition(x => fromSymInterfaces.exists(_.internalName == x.internalName))
+ val chk2 = sameBTypes(fromSym.interfaces, matching, chk1)
+ for (redundant <- other) {
+ // TODO SD-86 The new trait encoding emits redundant parents in the backend to avoid linkage errors in invokespecial
+ // Need to give this some more thought, maybe do it earlier so it is reflected in the Symbol's info, too.
+ assert(matching.exists(x => x.isSubtypeOf(redundant).orThrow), redundant)
+ }
// The fromSym info has only member classes, no local or anonymous. The symbol is read from the
// Scala pickle data and only member classes are created / entered.
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala
index 036816605b..87794f1346 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineInfoTest.scala
@@ -59,7 +59,10 @@ class InlineInfoTest extends ClearAfterClass {
|}
|class C extends T with U
""".stripMargin
- val classes = compile(code)
+// val classes = compile(code) // SD-86
+ InlineInfoTest.notPerRun.foreach(_.clear())
+ val classes = compileClasses(compiler)(code, allowMessage = _ => true) // SD-86 inline warnings
+
val fromSyms = classes.map(c => compiler.genBCode.bTypes.classBTypeFromInternalName(c.name).info.get.inlineInfo)
val fromAttrs = classes.map(c => {
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala
index 84d3d71964..3f95be8560 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlineWarningTest.scala
@@ -67,10 +67,11 @@ class InlineWarningTest extends ClearAfterClass {
"T::m2()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
"D::m2()I is annotated @inline but cannot be inlined: the method is not final and may be overridden")
compile(code, allowMessage = i => {count += 1; warns.exists(i.msg contains _)})
- assert(count == 4, count)
+ assert(count == 5, count) // TODO SD-85: 5th warning
}
- @Test
+ // TODO SD-85: no more impl classes. this test (and the warning it tests!) can be removed
+ @org.junit.Ignore @Test
def traitMissingImplClass(): Unit = {
val codeA = "trait T { @inline final def f = 1 }"
val codeB = "class C { def t1(t: T) = t.f }"
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala
index 63c743b075..52e19b48fd 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerSeparateCompilationTest.scala
@@ -42,10 +42,15 @@ class InlinerSeparateCompilationTest {
|}
""".stripMargin
- val warn = "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
- val List(c, o, oMod, t, tCls) = compileClassesSeparately(List(codeA, codeB), args + " -Yopt-warnings", _.msg contains warn)
+ val warns = Set(
+ "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+ // TODO SD-85
+ """O$::f()I is annotated @inline but could not be inlined:
+ |The callee O$::f()I contains the instruction INVOKESPECIAL T.f ()I
+ |that would cause an IllegalAccessError when inlined into class C""".stripMargin)
+ val List(c, o, oMod, t) = compileClassesSeparately(List(codeA, codeB), args + " -Yopt-warnings", i => warns.exists(i.msg contains _))
assertInvoke(getSingleMethod(c, "t1"), "T", "f")
- assertNoInvoke(getSingleMethod(c, "t2"))
+// assertNoInvoke(getSingleMethod(c, "t2")) // SD-85
assertNoInvoke(getSingleMethod(c, "t3"))
}
@@ -63,7 +68,7 @@ class InlinerSeparateCompilationTest {
|}
""".stripMargin
- val List(c, t, tCls) = compileClassesSeparately(List(codeA, codeB), args)
+ val List(c, t) = compileClassesSeparately(List(codeA, codeB), args)
assertNoInvoke(getSingleMethod(c, "t1"))
}
@@ -86,7 +91,7 @@ class InlinerSeparateCompilationTest {
|}
""".stripMargin
- val List(c, t, tCls, u, uCls) = compileClassesSeparately(List(codeA, codeB), args)
+ val List(c, t, u) = compileClassesSeparately(List(codeA, codeB), args)
for (m <- List("t1", "t2", "t3")) assertNoInvoke(getSingleMethod(c, m))
}
@@ -107,8 +112,8 @@ class InlinerSeparateCompilationTest {
|$assembly
""".stripMargin
- val List(a, aCls, t, tCls) = compileClassesSeparately(List(codeA, assembly), args)
- assertNoInvoke(getSingleMethod(tCls, "f"))
- assertNoInvoke(getSingleMethod(aCls, "n"))
+ val List(a, t) = compileClassesSeparately(List(codeA, assembly), args)
+ assertNoInvoke(getSingleMethod(t, "f"))
+ assertNoInvoke(getSingleMethod(a, "n"))
}
}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala
index 2c8f5e794e..e3e7103f46 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala
@@ -323,7 +323,9 @@ class InlinerTest extends ClearAfterClass {
| def g(t: T) = t.f
|}
""".stripMargin
- val List(c, t, tClass) = compile(code)
+ val List(c, t) = compile(code)
+ println(textify(c))
+ println(textify(t))
assertNoInvoke(getSingleMethod(c, "g"))
}
@@ -451,7 +453,7 @@ class InlinerTest extends ClearAfterClass {
| def t2(c: C) = c.f
|}
""".stripMargin
- val List(c, t, tClass) = compile(code)
+ val List(c, t) = compile(code)
// both are just `return 1`, no more calls
assertNoInvoke(getSingleMethod(c, "t1"))
assertNoInvoke(getSingleMethod(c, "t2"))
@@ -465,7 +467,7 @@ class InlinerTest extends ClearAfterClass {
|}
|class C extends T
""".stripMargin
- val List(c, t, tClass) = compile(code)
+ val List(c, t) = compile(code)
// the static implementation method is inlined into the mixin, so there's no invocation in the mixin
assertNoInvoke(getSingleMethod(c, "f"))
}
@@ -484,7 +486,7 @@ class InlinerTest extends ClearAfterClass {
| def t2 = g
|}
""".stripMargin
- val List(c, t, tClass, u, uClass) = compile(code)
+ val List(c, t, u) = compile(code)
assertNoInvoke(getSingleMethod(c, "t1"))
assertNoInvoke(getSingleMethod(c, "t2"))
}
@@ -504,8 +506,9 @@ class InlinerTest extends ClearAfterClass {
"C::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
"T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden")
var count = 0
- val List(c, t, tClass) = compile(code, allowMessage = i => {count += 1; warns.exists(i.msg contains _)})
- assert(count == 2, count)
+ val List(c, t) = compile(code, allowMessage = i => {count += 1; warns.exists(i.msg contains _)})
+ // 3rd warnings because of mixin-method, see SD-86
+ assert(count == 3, count)
assertInvoke(getSingleMethod(c, "t1"), "T", "f")
assertInvoke(getSingleMethod(c, "t2"), "C", "f")
}
@@ -520,7 +523,7 @@ class InlinerTest extends ClearAfterClass {
| def t1(t: T) = t.f
|}
""".stripMargin
- val List(c, t, tClass) = compile(code)
+ val List(c, t) = compile(code)
assertNoInvoke(getSingleMethod(c, "t1"))
}
@@ -540,14 +543,19 @@ class InlinerTest extends ClearAfterClass {
| def t3(t: T) = t.f // no inlining here
|}
""".stripMargin
- val warn = "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
+ val warns = Set(
+ "T::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+ // SD-86 -- once the mixin-method O.f inlines the body of T.f, we can also inline O.g into class C.
+ """O$::f()I is annotated @inline but could not be inlined:
+ |The callee O$::f()I contains the instruction INVOKESPECIAL T.f ()I
+ |that would cause an IllegalAccessError when inlined into class C""".stripMargin)
var count = 0
- val List(c, oMirror, oModule, t, tClass) = compile(code, allowMessage = i => {count += 1; i.msg contains warn})
- assert(count == 1, count)
+ val List(c, oMirror, oModule, t) = compile(code, allowMessage = i => {count += 1; warns.exists(i.msg contains _)})
+ assert(count == 3, count) // SD-86
- assertNoInvoke(getSingleMethod(oModule, "f"))
+// assertNoInvoke(getSingleMethod(oModule, "f")) // SD-86
- assertNoInvoke(getSingleMethod(c, "t1"))
+// assertNoInvoke(getSingleMethod(c, "t1")) // SD-86
assertNoInvoke(getSingleMethod(c, "t2"))
assertInvoke(getSingleMethod(c, "t3"), "T", "f")
}
@@ -571,11 +579,11 @@ class InlinerTest extends ClearAfterClass {
|}
""".stripMargin
- val List(assembly, assemblyClass, c, t, tClass) = compile(code)
+ val List(assembly, c, t) = compile(code)
- assertNoInvoke(getSingleMethod(tClass, "f"))
+ assertNoInvoke(getSingleMethod(t, "f"))
- assertNoInvoke(getSingleMethod(assemblyClass, "n"))
+ assertNoInvoke(getSingleMethod(assembly, "n"))
assertNoInvoke(getSingleMethod(c, "t1"))
assertNoInvoke(getSingleMethod(c, "t2"))
@@ -646,28 +654,27 @@ class InlinerTest extends ClearAfterClass {
|}
""".stripMargin
- val warning = "T1::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden"
+ val warnings = Set(
+ "T1::f()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+ "T2b::g2b()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+ "T1::g1()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+ "T2a::g2a()I is annotated @inline but cannot be inlined: the method is not final and may be overridden",
+ "T1::g1()I is annotated @inline but cannot be inlined: the method is not final and may be overridden")
var count = 0
- val List(ca, cb, t1, t1C, t2a, t2aC, t2b, t2bC) = compile(code, allowMessage = i => {count += 1; i.msg contains warning})
- assert(count == 4, count) // see comments, f is not inlined 4 times
-
- val t2aCfDesc = t2aC.methods.asScala.find(_.name == "f").get.desc
- assert(t2aCfDesc == "(LT1;)I", t2aCfDesc) // self-type of T2a is T1
+ val List(ca, cb, t1, t2a, t2b) = compile(code, allowMessage = i => {count += 1; warnings.exists(i.msg contains _)})
+ assert(count == 8, count) // see comments, f is not inlined 4 times, additional warnings due to SD-86
- val t2bCfDesc = t2bC.methods.asScala.find(_.name == "f").get.desc
- assert(t2bCfDesc == "(LT2b;)I", t2bCfDesc) // self-type of T2b is T2b
+ assertNoInvoke(getSingleMethod(t2a, "g2a"))
+ assertInvoke(getSingleMethod(t2b, "g2b"), "T1", "f")
- assertNoInvoke(getSingleMethod(t2aC, "g2a"))
- assertInvoke(getSingleMethod(t2bC, "g2b"), "T1", "f")
-
- assertInvoke(getSingleMethod(ca, "m1a"), "T1", "f")
- assertNoInvoke(getSingleMethod(ca, "m2a")) // no invoke, see comment on def g2a
+// assertInvoke(getSingleMethod(ca, "m1a"), "T1", "f") // disabled due to SD-86: m1a calls the mixin-method g1a, which calls super[T1].g1a. we inline the mixin-method and end up with the super call.
+// assertNoInvoke(getSingleMethod(ca, "m2a")) // no invoke, see comment on def g2a // SD-86
assertNoInvoke(getSingleMethod(ca, "m3a"))
assertInvoke(getSingleMethod(ca, "m4a"), "T1", "f")
assertNoInvoke(getSingleMethod(ca, "m5a"))
- assertInvoke(getSingleMethod(cb, "m1b"), "T1", "f")
- assertInvoke(getSingleMethod(cb, "m2b"), "T1", "f") // invoke, see comment on def g2b
+// assertInvoke(getSingleMethod(cb, "m1b"), "T1", "f") // SD-86
+// assertInvoke(getSingleMethod(cb, "m2b"), "T1", "f") // invoke, see comment on def g2b // SD-86
assertNoInvoke(getSingleMethod(cb, "m3b"))
assertInvoke(getSingleMethod(cb, "m4b"), "T1", "f")
assertNoInvoke(getSingleMethod(cb, "m5b"))
@@ -695,14 +702,13 @@ class InlinerTest extends ClearAfterClass {
val code =
"""class C {
| trait T { @inline final def f = 1 }
- | class D extends T{
+ | class D extends T {
| def m(t: T) = t.f
| }
- |
| def m(d: D) = d.f
|}
""".stripMargin
- val List(c, d, t, tC) = compile(code)
+ val List(c, d, t) = compile(code)
assertNoInvoke(getSingleMethod(d, "m"))
assertNoInvoke(getSingleMethod(c, "m"))
}
@@ -717,9 +723,9 @@ class InlinerTest extends ClearAfterClass {
| def t2(t: T) = t.f(2)
|}
""".stripMargin
- val List(c, t, tc) = compile(code)
- val t1 = getSingleMethod(tc, "t1")
- val t2 = getSingleMethod(tc, "t2")
+ val List(c, t) = compile(code)
+ val t1 = getSingleMethod(t, "t1")
+ val t2 = getSingleMethod(t, "t2")
val cast = TypeOp(CHECKCAST, "C")
Set(t1, t2).foreach(m => assert(m.instructions.contains(cast), m.instructions))
}
@@ -798,7 +804,7 @@ class InlinerTest extends ClearAfterClass {
|}
""".stripMargin
- val List(c, t, tClass, u, uClass) = compile(code, allowMessage = _.msg contains "i()I is annotated @inline but cannot be inlined")
+ val List(c, t, u) = compile(code, allowMessage = _.msg contains "i()I is annotated @inline but cannot be inlined")
val m1 = getSingleMethod(c, "m1")
assertInvoke(m1, "T", "a")
assertInvoke(m1, "T", "b")
@@ -807,8 +813,8 @@ class InlinerTest extends ClearAfterClass {
assertNoInvoke(getSingleMethod(c, "m2"))
val m3 = getSingleMethod(c, "m3")
- assertInvoke(m3, "T$class", "f")
- assertInvoke(m3, "T$class", "g")
+ assertInvoke(m3, "T", "f")
+ assertInvoke(m3, "T", "g")
assertInvoke(m3, "T", "h")
assertInvoke(m3, "T", "i")
@@ -821,7 +827,7 @@ class InlinerTest extends ClearAfterClass {
val m6 = getSingleMethod(c, "m6")
assertInvoke(m6, "U", "f")
- assertInvoke(m6, "U$class", "g")
+ assertInvoke(m6, "U", "g")
assertInvoke(m6, "U", "h")
assertInvoke(m6, "U", "i")
}
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala
index d141c48811..0ba0ecca4c 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/ScalaInlineInfoTest.scala
@@ -63,28 +63,35 @@ class ScalaInlineInfoTest extends ClearAfterClass {
|}
""".stripMargin
- val cs @ List(t, tl, to, tCls) = compileClasses(compiler)(code)
+ val cs @ List(t, tl, to) = compileClasses(compiler)(code)
val info = inlineInfo(t)
val expect = InlineInfo (
None, // self type
false, // final class
None, // not a sam
Map(
- ("O()LT$O$;", MethodInlineInfo(true, false,false,false)),
- ("T$$super$toString()Ljava/lang/String;",MethodInlineInfo(false,false,false,false)),
- ("T$_setter_$x1_$eq(I)V", MethodInlineInfo(false,false,false,false)),
- ("f1()I", MethodInlineInfo(false,true, false,false)),
- ("f3()I", MethodInlineInfo(false,true, false,false)),
- ("f4()Ljava/lang/String;", MethodInlineInfo(false,true, true, false)),
- ("f5()I", MethodInlineInfo(false,true, false,false)),
- ("f6()I", MethodInlineInfo(false,false,false,true )),
- ("x1()I", MethodInlineInfo(false,false,false,false)),
- ("x3()I", MethodInlineInfo(false,false,false,false)),
- ("x3_$eq(I)V", MethodInlineInfo(false,false,false,false)),
- ("x4()I", MethodInlineInfo(false,false,false,false)),
- ("x5()I", MethodInlineInfo(true, false,false,false)),
- ("y2()I", MethodInlineInfo(false,false,false,false)),
- ("y2_$eq(I)V", MethodInlineInfo(false,false,false,false))),
+ // TODO SD-86: the module accessor used to be `effectivelyFinal` before nuke-impl-classes
+ ("O()LT$O$;", MethodInlineInfo(false,false,false,false)),
+ ("T$$super$toString()Ljava/lang/String;", MethodInlineInfo(false,false,false,false)),
+ ("T$_setter_$x1_$eq(I)V", MethodInlineInfo(false,false,false,false)),
+ ("f1()I", MethodInlineInfo(false,false,false,false)),
+ ("f3()I", MethodInlineInfo(false,false,false,false)),
+ ("f4()Ljava/lang/String;", MethodInlineInfo(false,false,true, false)),
+ ("f5()I", MethodInlineInfo(false,false,false,false)),
+ ("f6()I", MethodInlineInfo(false,false,false,true )),
+ ("x1()I", MethodInlineInfo(false,false,false,false)),
+ ("x3()I", MethodInlineInfo(false,false,false,false)),
+ ("x3_$eq(I)V", MethodInlineInfo(false,false,false,false)),
+ ("x4()I", MethodInlineInfo(false,false,false,false)),
+ ("x5()I", MethodInlineInfo(true, false,false,false)),
+ ("y2()I", MethodInlineInfo(false,false,false,false)),
+ ("y2_$eq(I)V", MethodInlineInfo(false,false,false,false)),
+ ("f2()I", MethodInlineInfo(true, false,false,false)),
+ ("L$lzycompute$1(Lscala/runtime/VolatileObjectRef;)LT$L$2$;",MethodInlineInfo(true, false,false,false)),
+ // TODO SD-86: should probably be effectivelyFinal
+ ("L$1(Lscala/runtime/VolatileObjectRef;)LT$L$2$;", MethodInlineInfo(false,false,false,false)),
+ ("nest$1()I", MethodInlineInfo(true, false,false,false)),
+ ("$init$()V", MethodInlineInfo(false,false,false,false))),
None // warning
)
assert(info == expect, info)
@@ -124,8 +131,7 @@ class ScalaInlineInfoTest extends ClearAfterClass {
("E",Some("h(Ljava/lang/String;)I")),
("F",None),
("T",Some("h(Ljava/lang/String;)I")),
- ("U",None),
- ("U$class",None)))
+ ("U",None)))
}
}
diff --git a/test/junit/scala/tools/nsc/symtab/FlagsTest.scala b/test/junit/scala/tools/nsc/symtab/FlagsTest.scala
index 08a37fcb3c..96eae38011 100644
--- a/test/junit/scala/tools/nsc/symtab/FlagsTest.scala
+++ b/test/junit/scala/tools/nsc/symtab/FlagsTest.scala
@@ -33,7 +33,6 @@ class FlagsTest {
def testTimedFlags(): Unit = {
testLate(lateDEFERRED, _.isDeferred)
testLate(lateFINAL, _.isFinal)
- testLate(lateINTERFACE, _.isInterface)
testLate(lateMETHOD, _.isMethod)
testLate(lateMODULE, _.isModule)
testNot(PROTECTED | notPROTECTED, _.isProtected)