Skip to content

Commit cbf9e3d

Browse files
committed
Emit an error instead of crashing on incorrect Java annotation
This is similar to the error that scalac emits, though it emits at typer instead of backend.
1 parent 1fe9555 commit cbf9e3d

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
240240
private def emitArgument(av: AnnotationVisitor,
241241
name: String,
242242
arg: Tree, bcodeStore: BCodeHelpers)(innerClasesStore: bcodeStore.BCInnerClassGen): Unit = {
243-
(normalizeArgument(arg): @unchecked) match {
243+
normalizeArgument(arg) match {
244244
case Literal(const @ Constant(_)) =>
245245
const.tag match {
246246
case BooleanTag | ByteTag | ShortTag | CharTag | IntTag | LongTag | FloatTag | DoubleTag => av.visit(name, const.value)
@@ -257,10 +257,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
257257
av.visit(name, t.args.head.tpe.classSymbol.denot.info.toTypeKind(bcodeStore)(innerClasesStore).toASMType)
258258
case Ident(nme.WILDCARD) =>
259259
// An underscore argument indicates that we want to use the default value for this parameter, so do not emit anything
260-
case t: tpd.RefTree =>
261-
assert(t.symbol.denot.owner.isAllOf(Flags.JavaEnumTrait),
262-
i"not an enum: $t / ${t.symbol} / ${t.symbol.denot.owner} / ${t.symbol.denot.owner.isTerm} / ${t.symbol.denot.owner.flagsString}")
263-
260+
case t: tpd.RefTree if t.symbol.denot.owner.isAllOf(Flags.JavaEnumTrait)=>
264261
val edesc = innerClasesStore.typeDescriptor(t.tpe.asInstanceOf[bcodeStore.int.Type]) // the class descriptor of the enumeration class.
265262
val evalue = t.symbol.name.mangledString // value the actual enumeration value.
266263
av.visitEnum(name, edesc, evalue)
@@ -306,6 +303,9 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
306303
val desc = innerClasesStore.typeDescriptor(typ.asInstanceOf[bcodeStore.int.Type]) // the class descriptor of the nested annotation class
307304
val nestedVisitor = av.visitAnnotation(name, desc)
308305
emitAssocs(nestedVisitor, assocs, bcodeStore)(innerClasesStore)
306+
307+
case t =>
308+
ctx.error(ex"Annotation argument is not a constant", t.sourcePos)
309309
}
310310
}
311311

tests/neg/java-annot/J.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import java.lang.annotation.*;
2+
3+
@Retention(RetentionPolicy.RUNTIME)
4+
public @interface J {
5+
String value();
6+
}

tests/neg/java-annot/S.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
object C {
2+
val cs: String = "cs"
3+
}
4+
5+
object S {
6+
@J(C.cs) // error: Annotation argument is not a constant
7+
def f(): Int = 1
8+
}

0 commit comments

Comments
 (0)