aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-01-20 10:51:56 +0100
committerMartin Odersky <odersky@gmail.com>2014-01-20 10:52:01 +0100
commit0a8c17efca37e14b8467d7da9ffd6c48c8cd1c0f (patch)
tree6d4f0d3f781870d3e346dc7d7a4fad42d80ce9c5
parentecac7b30412b587a7a65e31bbbe3107ed66fd1a9 (diff)
downloaddotty-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.scala2
-rw-r--r--src/dotty/tools/dotc/core/SymDenotations.scala7
-rw-r--r--src/dotty/tools/dotc/core/TypeOps.scala9
-rw-r--r--test/dotc/tests.scala8
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