summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala19
-rw-r--r--test/files/neg/bug1011.check4
-rw-r--r--test/files/neg/bug1011.scala127
-rw-r--r--test/files/pos/bug1014.scala13
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)