Open
Description
With Scalac 2.10, the use of any objects, class or method annotaded with the com.unboundid.util.ThreadSafetyLevel leads to java.lang.AssertionError.
For example, the following file Test.scala:
import com.unboundid.ldap.sdk.Entry
object Test extends App {
val foo = new Entry("plop")
}
Leads to :
% scalac -classpath ./lib/unboundid-ldapsdk-2.3.1.jar src/Test.scala
warning: Caught: java.lang.AssertionError: assertion failed:
while compiling: src/Test.scala
during phase: global=typer, atPhase=parser
library version: version 2.10.0
compiler version: version 2.10.0
reconstructed args: -classpath ./lib/unboundid-ldapsdk-2.3.1.jar
last tree to typer: Ident(Entry)
symbol: <none> (flags: )
symbol definition: <none>
symbol owners:
context owners: value foo -> object Test -> package <empty>
== Enclosing template or block ==
Template( // val <local Test>: <notype> in object Test
"App" // parents
ValDef(
private
"_"
<tpt>
<empty>
)
// 2 statements
DefDef( // def <init>: <?> in object Test
<method>
"<init>"
[]
List(Nil)
<tpt>
Block(
Apply(
super."<init>"
Nil
)
()
)
)
ValDef( // private[this] val foo: <?> in object Test
private <local> <locked>
"foo"
<tpt>
Apply(
new Entry."<init>"
"plop"
)
)
)
com.unboundid.util.ThreadSafetyLevel while parsing annotations in ./lib/unboundid-ldapsdk-2.3.1.jar(com/unboundid/util/ThreadSafetyLevel.class)
one warning found
ThreadSafety.java source here: http://ldap-sdk.svn.sourceforge.net/viewvc/ldap-sdk/trunk/src/com/unboundid/util/ThreadSafety.java?revision=410&view=markup
Link to unboundid-ldapsdk-2.3.1.jar: https://www.unboundid.com/products/ldap-sdk/files/unboundid-ldapsdk-2.3.1-se.zip
That seems to be linked to the following comment: https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala#L1033
// We want to be robust when annotations are unavailable, so the very least
// we can do is warn the user about the exception
// There was a reference to ticket 1135, but that is outdated: a reference to a class not on
// the classpath would *not* end up here. A class not found is signaled
// with a `FatalError` exception, handled above. Here you'd end up after a NPE (for example),
// and that should never be swallowed silently.