summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala3
-rw-r--r--test/files/jvm/t1116.check0
-rw-r--r--test/files/jvm/t1116.scala27
-rw-r--r--test/files/jvm/t1143.check0
-rw-r--r--test/files/jvm/t1143.scala68
5 files changed, 97 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
index a647f8c989..d766db7146 100644
--- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala
+++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
@@ -577,7 +577,8 @@ abstract class CleanUp extends Transform {
// Value types are assumed to be serializable,
// reference types must be marked as such.
isValueType(typeSym) ||
- typeSym.hasAttribute(SerializableAttr)
+ typeSym.hasAttribute(SerializableAttr) ||
+ (m.info.baseClasses exists { bc => bc hasAttribute SerializableAttr })
}
}
diff --git a/test/files/jvm/t1116.check b/test/files/jvm/t1116.check
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/test/files/jvm/t1116.check
diff --git a/test/files/jvm/t1116.scala b/test/files/jvm/t1116.scala
new file mode 100644
index 0000000000..023e5b3a02
--- /dev/null
+++ b/test/files/jvm/t1116.scala
@@ -0,0 +1,27 @@
+object Serialize {
+ @throws(classOf[java.io.IOException])
+ def write[A](o: A): Array[Byte] = {
+ val ba = new java.io.ByteArrayOutputStream(512)
+ val out = new java.io.ObjectOutputStream(ba)
+ out.writeObject(o)
+ out.close()
+ ba.toByteArray()
+ }
+ @throws(classOf[java.io.IOException])
+ @throws(classOf[ClassNotFoundException])
+ def read[A](buffer: Array[Byte]): A = {
+ val in =
+ new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(buffer))
+ in.readObject().asInstanceOf[A]
+ }
+}
+
+object Foo {
+ def obj_foo(x: Int) = { () => x }
+}
+
+object Test {
+ def main(args: Array[String]) {
+ Serialize.write(Foo.obj_foo(3))
+ }
+}
diff --git a/test/files/jvm/t1143.check b/test/files/jvm/t1143.check
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/test/files/jvm/t1143.check
diff --git a/test/files/jvm/t1143.scala b/test/files/jvm/t1143.scala
new file mode 100644
index 0000000000..4f4557a2d6
--- /dev/null
+++ b/test/files/jvm/t1143.scala
@@ -0,0 +1,68 @@
+object Serialize {
+ @throws(classOf[java.io.IOException])
+ def write[A](o: A): Array[Byte] = {
+ val ba = new java.io.ByteArrayOutputStream(512)
+ val out = new java.io.ObjectOutputStream(ba)
+ out.writeObject(o)
+ out.close()
+ ba.toByteArray()
+ }
+ @throws(classOf[java.io.IOException])
+ @throws(classOf[ClassNotFoundException])
+ def read[A](buffer: Array[Byte]): A = {
+ val in =
+ new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(buffer))
+ in.readObject().asInstanceOf[A]
+ }
+}
+
+@serializable
+@SerialVersionUID(1L)
+class VarModel[T](getter: => T, setter: T => Unit) {
+ Serialize.write(getter)
+ Serialize.write(setter)
+
+ def this(getter: => T) = this(getter, null)
+
+ def getObject: AnyRef = getter.asInstanceOf[AnyRef]
+
+ def setObject(v: AnyRef) = {
+ if (setter == null)
+ throw new RuntimeException("Tried to set readonly model!")
+ setter(v.asInstanceOf[T])
+ }
+
+ def detach = ()
+}
+
+@serializable
+@SerialVersionUID(1L)
+class Printer(p: VarModel[String]) {
+ def print = println(p.getObject)
+}
+
+@serializable
+@SerialVersionUID(1L)
+class Component {
+}
+
+class Form extends Component {
+}
+
+@serializable
+@SerialVersionUID(1L)
+class Main {
+ var pass = "pass"
+ def main(args: Array[String]) {
+ val f = new Form {
+ val p = new Printer(new VarModel(pass, pass=_))
+ }
+ ()
+ }
+}
+
+object Test {
+ def main(args: Array[String]) {
+ (new Main).main(Array[String]())
+ }
+}