From cd5bf8386749d2a7c9aaaad97c3ffd9e4fc8f74f Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 3 Mar 2020 17:27:26 +0100 Subject: [PATCH] Fix #8427: Disallow SerialVersionUID on a trait serialVersionUID fields are only meaningful on a class, not an interface, see https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/io/Serializable.html --- .../tools/backend/jvm/DottyBackendInterface.scala | 15 ++++++++++----- tests/neg/i8427.scala | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 tests/neg/i8427.scala diff --git a/compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala b/compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala index 1cfe4de9497e..feae0bf68469 100644 --- a/compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala +++ b/compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala @@ -796,11 +796,16 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma for (f <- toDenot(sym).info.decls.toList if f.isMethod && f.isTerm && !f.isModule) yield f def serialVUID: Option[Long] = sym.getAnnotation(defn.SerialVersionUIDAnnot).flatMap { annot => - val vuid = annot.argumentConstant(0).map(_.longValue) - if (vuid.isEmpty) - ctx.error("The argument passed to @SerialVersionUID must be a constant", - annot.argument(0).getOrElse(annot.tree).sourcePos) - vuid + if (sym.is(Flags.Trait)) { + ctx.error("@SerialVersionUID does nothing on a trait", annot.tree.sourcePos) + None + } else { + val vuid = annot.argumentConstant(0).map(_.longValue) + if (vuid.isEmpty) + ctx.error("The argument passed to @SerialVersionUID must be a constant", + annot.argument(0).getOrElse(annot.tree).sourcePos) + vuid + } } def freshLocal(cunit: CompilationUnit, name: String, tpe: Type, pos: Position, flags: Flags): Symbol = { diff --git a/tests/neg/i8427.scala b/tests/neg/i8427.scala new file mode 100644 index 000000000000..314c6664fe87 --- /dev/null +++ b/tests/neg/i8427.scala @@ -0,0 +1,7 @@ +@SerialVersionUID(1L) // error +trait T + +object Test { + var t: T = _ + def main(args: Array[String]) = println("hi") +}