Skip to content

Commit e42acaa

Browse files
committed
Fix pure interface prediction for methods with default arguments
Methods with default arguments in traits generate defender methods, so the trait cannot be a pure interface. Checking def kinds earlier in Namer rather than Typer exhibited that special case.
1 parent 462c388 commit e42acaa

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,13 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
243243
/** The largest subset of {NoInits, PureInterface} that a
244244
* trait enclosing this statement can have as flags.
245245
*/
246-
def defKind(tree: Tree): FlagSet = unsplice(tree) match {
246+
def defKind(tree: Tree)(implicit ctx: Context): FlagSet = unsplice(tree) match {
247247
case EmptyTree | _: Import => NoInitsInterface
248248
case tree: TypeDef => if (tree.isClassDef) NoInits else NoInitsInterface
249-
case tree: DefDef => if (tree.unforcedRhs == EmptyTree) NoInitsInterface else NoInits
249+
case tree: DefDef =>
250+
if (tree.unforcedRhs == EmptyTree &&
251+
tree.vparamss.forall(_.forall(_.rhs.isEmpty))) NoInitsInterface
252+
else NoInits
250253
case tree: ValDef => if (tree.unforcedRhs == EmptyTree) NoInitsInterface else EmptyFlags
251254
case _ => EmptyFlags
252255
}
@@ -416,7 +419,8 @@ trait TypedTreeInfo extends TreeInfo[Type] { self: Trees.Instance[Type] =>
416419
*/
417420
def refPurity(tree: Tree)(implicit ctx: Context): PurityLevel = {
418421
val sym = tree.symbol
419-
if (!tree.tpe.widen.isParameterless || sym.is(Erased)) SimplyPure
422+
if (!tree.hasType) Impure
423+
else if (!tree.tpe.widen.isParameterless || sym.is(Erased)) SimplyPure
420424
else if (!sym.isStable) Impure
421425
else if (sym.is(Module))
422426
if (sym.moduleClass.isNoInitsClass) Pure else Idempotent

0 commit comments

Comments
 (0)