summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2006-11-13 12:13:39 +0000
committerBurak Emir <emir@epfl.ch>2006-11-13 12:13:39 +0000
commitac255eaf858397ee14b8ffafd8066b100d5e6be4 (patch)
treea7370d3284ae182989f5ac2cd6e54a0473e1a340 /src/compiler/scala/tools
parent6889ff9726f70bd9a0c87bf745b412bda5d379f2 (diff)
downloadscala-ac255eaf858397ee14b8ffafd8066b100d5e6be4.tar.gz
scala-ac255eaf858397ee14b8ffafd8066b100d5e6be4.tar.bz2
scala-ac255eaf858397ee14b8ffafd8066b100d5e6be4.zip
issue #806, #811
Diffstat (limited to 'src/compiler/scala/tools')
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternMatchers.scala23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
index fc344b24ca..77f68e7153 100644
--- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
+++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala
@@ -376,17 +376,18 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
//Console.println("tree.getClass() "+tree.getClass());
val t = tree match {
case Bind(name, Typed(Ident( nme.WILDCARD ), tpe)) => // x@_:Type
- if (isSubType(header.getTpe(),tpe.tpe)) {
- val node = pDefaultPat(tree.pos, tpe.tpe)
- env.newBoundVar(tree.symbol, tree.tpe, header.selector)
+ val tpe2test = tree.symbol.tpe // safest! typer does not always use tpe.tpe!
+
+ // @todo: this optimization probably not allowed, because of null -- but can rework it
+ //if (isSubType(header.getTpe(), tpe2test)) {
+ // val node = pDefaultPat(tree.pos, tpe2test)
+ // env.newBoundVar(tree.symbol, tree.tpe, header.selector)
+ // node
+ //} else {
+ val node = pConstrPat(tree.pos, tpe2test)
+ env.newBoundVar( tree.symbol, tpe2test, typed(Ident( node.casted )));
node
- } else {
- val node = pConstrPat(tree.pos, tpe.tpe)
- env.newBoundVar( tree.symbol,
- tpe.tpe, /*scalac: tree.tpe */
- typed(Ident( node.casted )));
- node
- }
+ //}
case Bind(name, Ident(nme.WILDCARD)) => // x @ _
val node = pDefaultPat(tree.pos, header.getTpe())
@@ -394,7 +395,7 @@ trait PatternMatchers requires (transform.ExplicitOuter with PatternNodes) {
env.newBoundVar( tree.symbol, tree.tpe, header.selector);
node
- case Bind(name, pat) =>
+ case Bind(name, pat) => // x @ p
val node = patternNode(pat, header, env)
if ((env != null) && (tree.symbol != defs.PatternWildcard)) {
val theValue = node.symbol match {