diff options
author | Burak Emir <emir@epfl.ch> | 2006-11-13 12:13:39 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2006-11-13 12:13:39 +0000 |
commit | ac255eaf858397ee14b8ffafd8066b100d5e6be4 (patch) | |
tree | a7370d3284ae182989f5ac2cd6e54a0473e1a340 /src | |
parent | 6889ff9726f70bd9a0c87bf745b412bda5d379f2 (diff) | |
download | scala-ac255eaf858397ee14b8ffafd8066b100d5e6be4.tar.gz scala-ac255eaf858397ee14b8ffafd8066b100d5e6be4.tar.bz2 scala-ac255eaf858397ee14b8ffafd8066b100d5e6be4.zip |
issue #806, #811
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/PatternMatchers.scala | 23 |
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 { |