diff options
author | Martin Odersky <odersky@gmail.com> | 2007-03-23 18:11:12 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-03-23 18:11:12 +0000 |
commit | 98f2f761c7ab896c4ac682f35116b0a88408e45a (patch) | |
tree | 899551f0ed7e03a45c4da3701dffe3ab58c871a6 | |
parent | b7cd34eda4a72102e119a373e3efa54c07d8b489 (diff) | |
download | scala-98f2f761c7ab896c4ac682f35116b0a88408e45a.tar.gz scala-98f2f761c7ab896c4ac682f35116b0a88408e45a.tar.bz2 scala-98f2f761c7ab896c4ac682f35116b0a88408e45a.zip |
fixed bug1014
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 19 | ||||
-rw-r--r-- | test/files/neg/bug1011.check | 4 | ||||
-rw-r--r-- | test/files/neg/bug1011.scala | 127 | ||||
-rw-r--r-- | test/files/pos/bug1014.scala | 13 |
5 files changed, 153 insertions, 12 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index e265d2e9c5..f4e99e0007 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -521,7 +521,7 @@ trait Namers requires Analyzer { thisMethodType( if (tpt.isEmpty) { val pt = resultPt.substSym(tparamSyms, tparams map (.symbol)) - tpt.tpe = deconstIfNotFinal(meth, typer.computeType(rhs, WildcardType/*pt*/)) + tpt.tpe = deconstIfNotFinal(meth, typer.computeType(rhs, pt)) tpt.tpe } else typer.typedType(tpt).tpe) } diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 7e8f49ad2f..df3ede8eca 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -305,7 +305,7 @@ trait Typers requires Analyzer { * @return ... */ def privates[T <: Tree](owner: Symbol, tree: T): T = - check(owner, EmptyScope, tree) + check(owner, EmptyScope, WildcardType, tree) /** Check that type <code>tree</code> does not refer to entities * defined in scope <code>scope</code>. @@ -316,16 +316,18 @@ trait Typers requires Analyzer { * @return ... */ def locals[T <: Tree](scope: Scope, pt: Type, tree: T): T = - if (isFullyDefined(pt)) tree setType pt else check(NoSymbol, scope, tree) + check(NoSymbol, scope, pt, tree) - def check[T <: Tree](owner: Symbol, scope: Scope, tree: T): T = { + def check[T <: Tree](owner: Symbol, scope: Scope, pt: Type, tree: T): T = { this.owner = owner this.scope = scope badSymbol = NoSymbol - assert(tree.tpe ne null, tree)//debug apply(tree.tpe) if (badSymbol == NoSymbol) tree else if (badSymbol.isErroneous) setError(tree) + else if (isFullyDefined(pt)) tree setType pt + else if (tree.tpe.symbol.isAnonymousClass) + check(owner, scope, pt, tree setType anonymousClassRefinement(tree.tpe.symbol)) else { val tp1 = try { heal(tree.tpe) @@ -341,7 +343,7 @@ trait Typers requires Analyzer { " escapes its defining scope as part of type "+tree.tpe) setError(tree) } else - check(owner, scope, tree setType tp1) + check(owner, scope, pt, tree setType tp1) } } @@ -1196,12 +1198,7 @@ trait Typers requires Analyzer { val expr1 = typed(block.expr, mode & ~(FUNmode | QUALmode), pt) val block1 = copy.Block(block, stats1, expr1) .setType(if (treeInfo.isPureExpr(block)) expr1.tpe else expr1.tpe.deconst) - if (isFullyDefined(pt)) block1 - else { - if (block1.tpe.symbol.isAnonymousClass) - block1 setType anonymousClassRefinement(block1.tpe.symbol) - checkNoEscaping.locals(context.scope, pt, block1) - } + checkNoEscaping.locals(context.scope, pt, block1) } /** diff --git a/test/files/neg/bug1011.check b/test/files/neg/bug1011.check new file mode 100644 index 0000000000..7de677639a --- /dev/null +++ b/test/files/neg/bug1011.check @@ -0,0 +1,4 @@ +bug1011.scala:8: error: not found: value entity + <dl><code>{Text(entity)}</code> + ^ +one error found diff --git a/test/files/neg/bug1011.scala b/test/files/neg/bug1011.scala new file mode 100644 index 0000000000..7dc3f49469 --- /dev/null +++ b/test/files/neg/bug1011.scala @@ -0,0 +1,127 @@ +package test; +import scala.xml._; + +abstract class Test { + //val entity : String; + def primitiveHeader : NodeSeq = + Group({ + <dl><code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code> + <code>{Text(entity)}</code></dl> + } ++ // 3 seconds + {}++ // 5 seconds + {}++ // 10 seconds + {}++ // 20 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 5 seconds + {}++ // 10 seconds + {}++ // 20 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 5 seconds + {}++ // 10 seconds + {}++ // 20 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + {}++ // 40 seconds + <hr/>); +} diff --git a/test/files/pos/bug1014.scala b/test/files/pos/bug1014.scala new file mode 100644 index 0000000000..fdabc8b67c --- /dev/null +++ b/test/files/pos/bug1014.scala @@ -0,0 +1,13 @@ +import scala.xml.{NodeSeq, Elem} + +class EO extends Application with Moo{ + def cat = <cat>dog</cat> + + implicit def nodeSeqToFlog(in: Elem): Flog = new Flog(in) +} + +trait Moo { + def cat: Flog +} + +class Flog(val in: NodeSeq) |