Skip to content

stack overflow compiling single-arg implicit constructor with empty auxiliary ctor #1639

Closed
@ljdelight

Description

@ljdelight

Dotty encounters a stack overflow when compiling this invalid code:
class Foo(implicit val bar: String) { def this() = this("baz") }

Here's the full trace, and a snippet below from using dotc.

Exception in thread "main" java.lang.StackOverflowError
    at dotty.tools.dotc.core.OrderingConstraint$ConstraintLens.update(OrderingConstraint.scala:51)
    at dotty.tools.dotc.core.OrderingConstraint$ConstraintLens.update(OrderingConstraint.scala:72)
    at dotty.tools.dotc.core.OrderingConstraint.updateEntry(OrderingConstraint.scala:337)
    at dotty.tools.dotc.core.OrderingConstraint.init(OrderingConstraint.scala:305)
    at dotty.tools.dotc.core.OrderingConstraint.add(OrderingConstraint.scala:289)
    at dotty.tools.dotc.core.OrderingConstraint.add(OrderingConstraint.scala:128)
    at dotty.tools.dotc.core.ConstraintHandling$class.addToConstraint(ConstraintHandling.scala:297)
    at dotty.tools.dotc.core.TypeComparer.addToConstraint(TypeComparer.scala:18)
    at dotty.tools.dotc.typer.ProtoTypes$.constrained(ProtoTypes.scala:369)
    at dotty.tools.dotc.typer.ProtoTypes$.constrained(ProtoTypes.scala:374)
    at dotty.tools.dotc.typer.ProtoTypes$$anonfun$normalize$1.apply(ProtoTypes.scala:393)
    at dotty.tools.dotc.typer.ProtoTypes$$anonfun$normalize$1.apply(ProtoTypes.scala:392)
    at dotty.tools.dotc.util.Stats$.track(Stats.scala:35)
    at dotty.tools.dotc.typer.ProtoTypes$.normalize(ProtoTypes.scala:391)
    at dotty.tools.dotc.typer.Implicits$ImplicitRefs$$anonfun$filterMatching$1.dotty$tools$dotc$typer$Implicits$ImplicitRefs$$anonfun$$refMatches$1(Implicits.scala:95)
    at dotty.tools.dotc.typer.Implicits$ImplicitRefs$$anonfun$filterMatching$1$$anonfun$apply$1.apply(Implicits.scala:100)
    at dotty.tools.dotc.typer.Implicits$ImplicitRefs$$anonfun$filterMatching$1$$anonfun$apply$1.apply(Implicits.scala:100)
    at scala.collection.TraversableLike$$anonfun$filterImpl$1.apply(TraversableLike.scala:259)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:258)
    at scala.collection.TraversableLike$class.filter(TraversableLike.scala:270)
    at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
    at dotty.tools.dotc.typer.Implicits$ImplicitRefs$$anonfun$filterMatching$1.apply(Implicits.scala:100)
    at dotty.tools.dotc.typer.Implicits$ImplicitRefs$$anonfun$filterMatching$1.apply(Implicits.scala:48)
    at dotty.tools.dotc.util.Stats$.track(Stats.scala:35)
...

And compiling with scalac:

./tests/neg/mytest.scala:3: error: overloaded method constructor Foo with alternatives:
  ()Foo <and>
  ()(implicit bar: String)Foo
 cannot be applied to (String)
class Foo(implicit val bar: String) { def this() = this("baz") }
                                                   ^
one error found

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions