Skip to content

Commit a33975e

Browse files
committed
Make sure the span of EmptyTree and EmptyValDef are never set
It is important not to set the span as if the sources differ the tree will be cloned and the EmptyTree will have multiple instances which are not comparable.
1 parent 1300311 commit a33975e

File tree

2 files changed

+5
-3
lines changed

2 files changed

+5
-3
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,13 +819,15 @@ object Trees {
819819

820820
class EmptyTree[T >: Untyped] extends Thicket(Nil)(NoSource) {
821821
// assert(uniqueId != 1492)
822+
override def withSpan(span: Span) = throw new AssertionError("Cannot change span of EmptyTree")
822823
}
823824

824825
class EmptyValDef[T >: Untyped] extends ValDef[T](
825826
nme.WILDCARD, genericEmptyTree[T], genericEmptyTree[T])(NoSource) with WithoutTypeOrPos[T] {
826827
myTpe = NoType.asInstanceOf[T]
827-
override def isEmpty: Boolean = true
828828
setMods(untpd.Modifiers(PrivateLocal))
829+
override def isEmpty: Boolean = true
830+
override def withSpan(span: Span) = throw new AssertionError("Cannot change span of EmptyValDef")
829831
}
830832

831833
@sharable val theEmptyTree: EmptyTree[Type] = new EmptyTree[Type]

compiler/src/dotty/tools/dotc/transform/Staging.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,8 @@ class Staging extends MacroTransformWithImplicits {
448448
else if (enclosingInlineds.nonEmpty) { // level 0 in an inlined call
449449
val spliceCtx = ctx.outer // drop the last `inlineContext`
450450
val pos: SourcePosition = spliceCtx.source.atSpan(enclosingInlineds.head.span)
451-
val evaluatedSplice = Splicer.splice(splice.qualifier, pos, macroClassLoader)(spliceCtx).withSpan(splice.span)
452-
if (ctx.reporter.hasErrors) splice else transform(evaluatedSplice)
451+
val evaluatedSplice = Splicer.splice(splice.qualifier, pos, macroClassLoader)(spliceCtx)
452+
if (ctx.reporter.hasErrors) splice else transform(evaluatedSplice.withSpan(splice.span))
453453
}
454454
else if (!ctx.owner.isInlineMethod) { // level 0 outside an inline method
455455
ctx.error(i"splice outside quotes or inline method", splice.sourcePos)

0 commit comments

Comments
 (0)