diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2016-11-25 10:04:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-25 10:04:12 +0100 |
commit | eb7d907f6283f897f6b248bae170bade57969519 (patch) | |
tree | 52a4db097a27a496845e56c4a86f605a1d21e127 | |
parent | d5f21af9f41d8f4bd22ee6126e1476b4a76c51c2 (diff) | |
parent | 824103644337758f2a6a70ea69a33a9671e1e69c (diff) | |
download | scala-eb7d907f6283f897f6b248bae170bade57969519.tar.gz scala-eb7d907f6283f897f6b248bae170bade57969519.tar.bz2 scala-eb7d907f6283f897f6b248bae170bade57969519.zip |
Merge pull request #5540 from retronym/ticket/9814
SI-9814 Fix synchronized in specialized overrides
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala | 3 | ||||
-rw-r--r-- | test/files/run/t9814.scala | 28 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index c171050bbd..84f47c1caa 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -1049,7 +1049,8 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { } } debuglog(s"specialized overload $om for ${overriding.name.decode} in ${pp(env)}: ${om.info}") - if (overriding.isAbstractOverride) om.setFlag(ABSOVERRIDE) + om.setFlag(overriding.flags & (ABSOVERRIDE | SYNCHRONIZED)) + om.withAnnotations(overriding.annotations.filter(_.symbol == ScalaStrictFPAttr)) typeEnv(om) = env addConcreteSpecMethod(overriding) if (overriding.isDeferred) { // abstract override diff --git a/test/files/run/t9814.scala b/test/files/run/t9814.scala new file mode 100644 index 0000000000..3aef3928f6 --- /dev/null +++ b/test/files/run/t9814.scala @@ -0,0 +1,28 @@ +import java.lang.reflect.Modifier + +import scala.annotation.strictfp + +class Foo extends (() => Unit) { + def apply(): Unit = synchronized { + // we're in a specialized subclass + assert(Thread.currentThread.getStackTrace.apply(1).getMethodName == "apply$mcV$sp") + assert(Thread.holdsLock(this)) + } +} + +class Bar extends (() => Unit) { + @strictfp def apply(): Unit = synchronized { + // we're in a specialized subclass + assert(Thread.currentThread.getStackTrace.apply(1).getMethodName == "apply$mcV$sp") + assert(Thread.holdsLock(this)) + } +} + +object Test { + def main(args: Array[String]): Unit = { + new Foo().apply() + + val m = classOf[Bar].getDeclaredMethod("apply$mcV$sp") + assert(Modifier.isStrict(m.getModifiers)) + } +} |