diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index ebfbf5926851..bacbd92477b6 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -1010,7 +1010,7 @@ class Definitions { val any = enterCompleteClassSymbol(cls, tpnme.Any, Protected | Final | NoInitsTrait, Nil) val nothing = enterCompleteClassSymbol(cls, tpnme.Nothing, Protected | Final | NoInitsTrait, List(any.typeRef)) - enterMethod(cls, nme.assume_, MethodType(Nil, nothing.typeRef), Protected | Final | Method) + enterMethod(cls, nme.assume_, ExprType(nothing.typeRef), Protected | Final | Method) cls } diff --git a/compiler/src/dotty/tools/dotc/transform/Erasure.scala b/compiler/src/dotty/tools/dotc/transform/Erasure.scala index 52b9a90ca938..417a94722c3a 100644 --- a/compiler/src/dotty/tools/dotc/transform/Erasure.scala +++ b/compiler/src/dotty/tools/dotc/transform/Erasure.scala @@ -411,9 +411,14 @@ object Erasure extends TypeTestsCasts{ } } - recur(typed(tree.qualifier, AnySelectionProto)) + if (tree.symbol eq defn.Phantom_assume) PhantomErasure.erasedAssume + else recur(typed(tree.qualifier, AnySelectionProto)) } + override def typedIdent(tree: untpd.Ident, pt: Type)(implicit ctx: Context): tpd.Tree = + if (tree.symbol eq defn.Phantom_assume) PhantomErasure.erasedAssume + else super.typedIdent(tree, pt) + override def typedThis(tree: untpd.This)(implicit ctx: Context): Tree = if (tree.symbol == ctx.owner.lexicallyEnclosingClass || tree.symbol.isStaticOwner) promote(tree) else { @@ -456,8 +461,6 @@ object Erasure extends TypeTestsCasts{ val Apply(fun, args) = tree if (fun.symbol == defn.cbnArg) typedUnadapted(args.head, pt) - else if (fun.symbol eq defn.Phantom_assume) - PhantomErasure.erasedAssume else typedExpr(fun, FunProto(args, pt, this)) match { case fun1: Apply => // arguments passed in prototype were already passed fun1 diff --git a/tests/neg/phantom-assume-1.scala b/tests/neg/phantom-assume-1.scala new file mode 100644 index 000000000000..53a1d1fdf786 --- /dev/null +++ b/tests/neg/phantom-assume-1.scala @@ -0,0 +1,4 @@ +object Boo extends Phantom { + type BooAny = this.Any + def assume1: BooAny = assume() // error: method assume in trait Phantom does not take parameters +} diff --git a/tests/run/phantom-assume-1.check b/tests/run/phantom-assume-1.check new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/run/phantom-assume-1.scala b/tests/run/phantom-assume-1.scala new file mode 100644 index 000000000000..bf7efe9d4546 --- /dev/null +++ b/tests/run/phantom-assume-1.scala @@ -0,0 +1,17 @@ + +object Test { + import Boo._ + + def main(args: Array[String]): Unit = { + Boo.assume1 + Boo.assume2 + Boo.assume3 + } +} + +object Boo extends Phantom { + type BooAny = this.Any + def assume1: BooAny = assume + def assume2: BooAny = this.assume + def assume3: BooAny = Boo.assume +}