Skip to content

Dotty compiler crashes with StackOverflowError on symbol literal #2960

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Glavo opened this issue Aug 5, 2017 · 5 comments · Fixed by #2962
Closed

Dotty compiler crashes with StackOverflowError on symbol literal #2960

Glavo opened this issue Aug 5, 2017 · 5 comments · Fixed by #2962

Comments

@Glavo
Copy link
Contributor

Glavo commented Aug 5, 2017

package org.glavo.dotty

import scala.collection.mutable

sealed trait Node {
    def mkString(n: Int): String
}

class Tag(val name: String, 
          val attributes: mutable.LinkedHashMap[Symbol, String] = mutable.LinkedHashMap(), 
          val children: mutable.Buffer[Node] = mutable.Buffer()) extends Node {
    
    override def mkString(n: Int): String = {        
        Tag.spaces(n) + s"<$name ${attributes.map(_.name + "=" + Tag.unescape(_)).mkString(" ")}>" +
            (if(children.isEmpty) "\n" 
                else children.map(_.mkString(n + 4)).mkString("\n", "\n", "\n")) + 
        Tag.spaces(n) + s"</$name>"
    }

    def apply(attrs: (Symbol, String)*): this.type = {
        attributes ++= attrs
        this
    }

    def apply[U](f: implicit Tag => U)(implicit t: Tag = null): this.type = {
        if(t != null) t.children += this
        f(this)
        this
    }
}

object Tag {
    def spaces(n: Int = 0): String = {
        if(n == 0) ""
        else {
            val cs = new Array[Char](n)
            for (i <- 0 until n) 
                cs(i) = 0

            new String(cs)
        }
    }

    def unescape(str: String): String = {
        "\"" + str + "\""
    }

    implicit def symbolToTag(symbol: Symbol): Tag = 
        new Tag(symbol.name)

    implicit class PairMaker(val tag: Symbol) extends AnyVal {
        def :=(value: String): (Symbol, String) = (tag, value)
    }
}

class Text(val value: String) extends Node {
    override def mkString(n: Int): String = {
        Tag.spaces(n) + value
    }
}

I compiled with sbt, and run sbt task 'console':

scala> import org.glavo.dotty._ 
import org.glavo.dotty._
scala> import org.glavo.dotty.Tag._ 
import org.glavo.dotty.Tag._
scala> 'html{}[error] (run-main-1) java.lang.StackOverflowError
java.lang.StackOverflowError
	at dotty.tools.dotc.core.TypeComparer.op$16(TypeComparer.scala:128)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:108)
	at dotty.tools.dotc.core.TypeComparer.topLevelSubType(TypeComparer.scala:102)
	at dotty.tools.dotc.core.Types$Type.op$36(Types.scala:746)
	at dotty.tools.dotc.core.Types$Type.$less$colon$less(Types.scala:745)
	at dotty.tools.dotc.core.Types$Type.relaxed_$less$colon$less(Types.scala:775)
	at dotty.tools.dotc.typer.ProtoTypes$Compatibility.isCompatible(ProtoTypes.scala:39)
	at dotty.tools.dotc.typer.Applications$TestApplication.argOK(Applications.scala:488)
	at dotty.tools.dotc.typer.Applications$TestApplication.addArg(Applications.scala:495)
	at dotty.tools.dotc.typer.Applications$Application.matchArgs$$anonfun$1(Applications.scala:447)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:18)
	at scala.compat.java8.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:392)
	at dotty.tools.dotc.typer.Applications$Application.matchArgs(Applications.scala:447)
	at dotty.tools.dotc.typer.Applications$Application.init(Applications.scala:227)
	at dotty.tools.dotc.typer.Applications$TestApplication.<init>(Applications.scala:503)
	at dotty.tools.dotc.typer.Applications$ApplicableToTypes.<init>(Applications.scala:527)
	at dotty.tools.dotc.typer.Applications.isApplicable(Applications.scala:1002)
	at dotty.tools.dotc.typer.Applications.op$62(Applications.scala:1074)
	at dotty.tools.dotc.typer.Applications.isAsSpecific$1(Applications.scala:1069)
	at dotty.tools.dotc.typer.Applications.op$62(Applications.scala:1078)
	at dotty.tools.dotc.typer.Applications.isAsSpecific$1(Applications.scala:1069)
	at dotty.tools.dotc.typer.Applications.winsType2$1(Applications.scala:1156)
	at dotty.tools.dotc.typer.Applications.op$61(Applications.scala:1172)
	at dotty.tools.dotc.typer.Applications.op$60(Applications.scala:1042)
	at dotty.tools.dotc.typer.Applications.isAsGood(Applications.scala:1042)
	at dotty.tools.dotc.typer.Applications.winner$1(Applications.scala:1184)
	at dotty.tools.dotc.typer.Applications.op$63(Applications.scala:1188)
	at dotty.tools.dotc.typer.Applications.narrowMostSpecific(Applications.scala:1177)
	at dotty.tools.dotc.typer.Applications.op$65(Applications.scala:1364)
	at dotty.tools.dotc.typer.Applications.resolveOverloaded(Applications.scala:1267)
	at dotty.tools.dotc.typer.Applications.op$64(Applications.scala:1253)
	at dotty.tools.dotc.typer.Applications.resolveOverloaded(Applications.scala:1206)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1920)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.op$122(Typer.scala:1709)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:1707)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:1766)
	at dotty.tools.dotc.typer.Typer.typeSelectOnTerm$1(Typer.scala:413)
	at dotty.tools.dotc.typer.Typer.op$84(Typer.scala:447)
	at dotty.tools.dotc.typer.Typer.typedSelect(Typer.scala:411)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1822)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:1857)
	at dotty.tools.dotc.typer.Typer.tryApply$1(Typer.scala:1823)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit$$anonfun$1(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:1774)
	at dotty.tools.dotc.typer.Typer.tryInsertApplyOrImplicit(Typer.scala:1836)
	at dotty.tools.dotc.typer.Typer.adaptOverloaded$1(Typer.scala:1931)
	at dotty.tools.dotc.typer.Typer.adaptInterpolated(Typer.scala:2254)
	at dotty.tools.dotc.typer.Typer.op$125(Typer.scala:1862)
	at dotty.tools.dotc.typer.Typer.op$124(Typer.scala:1858)
java.lang.RuntimeException: Nonzero exit code: 1
	at scala.sys.package$.error(package.scala:27)
	at sbt.Defaults$$anonfun$consoleTask$1$$anonfun$apply$54.apply(Defaults.scala:850)
	at sbt.Defaults$$anonfun$consoleTask$1$$anonfun$apply$54.apply(Defaults.scala:850)
	at scala.Option.foreach(Option.scala:236)
	at sbt.Defaults$$anonfun$consoleTask$1.apply(Defaults.scala:850)
	at sbt.Defaults$$anonfun$consoleTask$1.apply(Defaults.scala:845)
	at scala.Function8$$anonfun$tupled$1.apply(Function8.scala:35)
	at scala.Function8$$anonfun$tupled$1.apply(Function8.scala:34)
	at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
	at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
	at sbt.std.Transform$$anon$4.work(System.scala:63)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
	at sbt.Execute.work(Execute.scala:237)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
[error] (compile:console) Nonzero exit code: 1
[error] Total time: 108 s, completed 2017-8-5 17:53:53
@Glavo Glavo changed the title REPL because StackOverflowError crashes Dotty REPL crashes with StackOverflowError Aug 5, 2017
@felixmulder
Copy link
Contributor

Does it crash using dotc?

If so, this is not a REPL issue, which would be greeeeeeeeeeeat, because we're throwing the current REPL out next week.

@Glavo Glavo changed the title Dotty REPL crashes with StackOverflowError Dotty compiler crashes with StackOverflowError Aug 5, 2017
@Glavo
Copy link
Contributor Author

Glavo commented Aug 5, 2017

@felixmulder Oh,you right. I try to add main method to the project:

import org.glavo.dotty._
import org.glavo.dotty.Tag._

object Main {
  def main(args: Array[String]): Unit = {
    'html {}
  }
}
> compile
[info] Compiling 2 Scala sources to /home/glavo/Dotty/dsl/target/scala-0.3/classes...
[trace] Stack trace suppressed: run last compile:compileIncremental for the full output.
[error] (compile:compileIncremental) java.lang.StackOverflowError
[error] Total time: 5 s, completed 2017-8-5 18:48:48

@felixmulder
Copy link
Contributor

"yay"! :)

@felixmulder felixmulder changed the title Dotty compiler crashes with StackOverflowError Dotty compiler crashes with StackOverflowError on symbol literal Aug 5, 2017
@nicolasstucki
Copy link
Contributor

Here is a minimised version of the code:

object Main {
  implicit def symbolToTag(symbol: Symbol): Tag = new Tag

  def main(args: Array[String]): Unit = {
    'html {}
  }
}

class Tag {
  def apply(attrs: (String, String)*): this.type = this
  def apply(f: implicit Tag => Int)(implicit t: Tag = null): this.type = this
}

@nicolasstucki
Copy link
Contributor

Here is a simpler one, but the stack trace is different:

object Main {
  implicit def symbolToTag(symbol: Symbol): Tag = new Tag

  def main(args: Array[String]): Unit = {
    'html {}
  }
}

class Tag {
  def apply(attrs: (String, String)*): this.type = this
  def apply(implicit t: Tag = null): this.type = this
}

Maybe not the same issue?

odersky added a commit to dotty-staging/dotty that referenced this issue Aug 8, 2017
This fix prevents infinite chains of inserted apply's. Fixes scala#2960.
smarter added a commit that referenced this issue Aug 16, 2017
Fix #2960: Only allow one inserted apply per tree
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants