diff options
author | Martin Odersky <odersky@gmail.com> | 2014-01-20 10:51:56 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-01-20 10:52:01 +0100 |
commit | 0a8c17efca37e14b8467d7da9ffd6c48c8cd1c0f (patch) | |
tree | 6d4f0d3f781870d3e346dc7d7a4fad42d80ce9c5 | |
parent | ecac7b30412b587a7a65e31bbbe3107ed66fd1a9 (diff) | |
download | dotty-0a8c17efca37e14b8467d7da9ffd6c48c8cd1c0f.tar.gz dotty-0a8c17efca37e14b8467d7da9ffd6c48c8cd1c0f.tar.bz2 dotty-0a8c17efca37e14b8467d7da9ffd6c48c8cd1c0f.zip |
Avoid eager forcing in enterArgBinding
Caused a cyclic reference error when compiling the three files in test "testNonCyclic".
-rw-r--r-- | src/dotty/tools/dotc/config/Printers.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/SymDenotations.scala | 7 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/TypeOps.scala | 9 | ||||
-rw-r--r-- | test/dotc/tests.scala | 8 |
4 files changed, 19 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/config/Printers.scala b/src/dotty/tools/dotc/config/Printers.scala index 19e7e1891..00e8b21c6 100644 --- a/src/dotty/tools/dotc/config/Printers.scala +++ b/src/dotty/tools/dotc/config/Printers.scala @@ -15,7 +15,7 @@ object Printers { val typr: Printer = new Printer val constr: Printer = noPrinter val overload: Printer = noPrinter - val implicits: Printer = new Printer + val implicits: Printer = noPrinter val unapp: Printer = noPrinter val completions = noPrinter val gadts = noPrinter diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index 40f155ed9..e1dd64ab5 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -128,10 +128,9 @@ object SymDenotations { if (myFlags is Touched) throw new CyclicReference(this) myFlags |= Touched - Context.theBase.initialCtx.traceIndented(s"completing ${this.debugString}", completions) { - // println("completing " + debugString) - completer.complete(this) - } + completions.println(s"completing ${this.debugString}") + completer.complete(this) + completions.println(s"completed ${this.debugString}") } protected[dotc] final def info_=(tp: Type) = { diff --git a/src/dotty/tools/dotc/core/TypeOps.scala b/src/dotty/tools/dotc/core/TypeOps.scala index 0411cc613..f3ddf3cc1 100644 --- a/src/dotty/tools/dotc/core/TypeOps.scala +++ b/src/dotty/tools/dotc/core/TypeOps.scala @@ -2,6 +2,7 @@ package dotty.tools.dotc package core import Contexts._, Types._, Symbols._, Names._, Flags._, Scopes._ +import SymDenotations._ import util.SimpleMap trait TypeOps { this: Context => @@ -86,8 +87,14 @@ trait TypeOps { this: Context => } private def enterArgBinding(formal: Symbol, info: Type, cls: ClassSymbol, decls: Scope) = { + val lazyInfo = new LazyType { // needed so we do not force `formal`. + def complete(denot: SymDenotation): Unit = { + denot setFlag formal.flags & RetainedTypeArgFlags + denot.info = info + } + } val typeArgFlag = if (formal is Local) TypeArgument else EmptyFlags - val sym = ctx.newSymbol(cls, formal.name, formal.flags & RetainedTypeArgFlags | typeArgFlag, info) + val sym = ctx.newSymbol(cls, formal.name, formal.flagsUNSAFE & RetainedTypeArgFlags | typeArgFlag, lazyInfo) cls.enter(sym, decls) } diff --git a/test/dotc/tests.scala b/test/dotc/tests.scala index fe31f1e53..97d15d2d1 100644 --- a/test/dotc/tests.scala +++ b/test/dotc/tests.scala @@ -57,6 +57,12 @@ class tests extends CompilerTest { @Test def tools_io = compileDir(dotcDir + "tools/io") @Test def tools = compileDir(dotcDir + "tools") - @Test def dotc_compilercommand = compileFile(dotcDir + "tools/dotc/config/", "CompilerCommand") + @Test def testNonCyclic = compileArgs(Array( + dotcDir + "tools/dotc/CompilationUnit.scala", + dotcDir + "tools/dotc/core/Types.scala", + dotcDir + "tools/dotc/ast/Trees.scala", + "-Ylog:frontend", + "-Xprompt")) + //@Test def dotc_compilercommand = compileFile(dotcDir + "tools/dotc/config/", "CompilerCommand") }
\ No newline at end of file |