diff options
author | Paul Phillips <paulp@improving.org> | 2011-05-26 04:43:01 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-05-26 04:43:01 +0000 |
commit | 3f192157811eb268d46f3a71011a5b2b966faa14 (patch) | |
tree | 58259d2ca3e449288368fe24a8ebc5305cb345b2 | |
parent | d3ff7ee9fcac1d10c145bbd1f37a69b989a73cdf (diff) | |
download | scala-3f192157811eb268d46f3a71011a5b2b966faa14.tar.gz scala-3f192157811eb268d46f3a71011a5b2b966faa14.tar.bz2 scala-3f192157811eb268d46f3a71011a5b2b966faa14.zip |
Finished reverting the misbegotten r23262, no r...
Finished reverting the misbegotten r23262, no review.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 12 | ||||
-rw-r--r-- | test/files/pos/widen-existential.scala | 4 | ||||
-rw-r--r-- | test/files/run/constrained-types.check | 2 | ||||
-rw-r--r-- | test/pending/pos/no-widen-locals.scala (renamed from test/files/pos/no-widen-locals.scala) | 2 |
4 files changed, 15 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index bc6a468538..c5f32a344f 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -614,7 +614,6 @@ trait Namers { self: Analyzer => * modifier is the present means of signaling that a constant * value should not be widened, so it has a use even in situations * whether it is otherwise redundant (such as in a singleton.) - * Method-defined locals are also excluded from widening. */ private def widenIfNecessary(sym: Symbol, tpe: Type, pt: Type): Type = { val getter = @@ -633,11 +632,16 @@ trait Namers { self: Analyzer => } val tpe1 = tpe.deconst val tpe2 = tpe1.widen - if ((sym.isVariable || sym.isMethod && !sym.hasAccessorFlag)) + if (sym.isVariable || sym.isMethod && !sym.hasAccessorFlag) if (tpe2 <:< pt) tpe2 else tpe1 else if (isHidden(tpe)) tpe2 - else if (sym.isFinal || sym.owner.isMethod) tpe - else tpe1 + // In an attempt to make pattern matches involving method local vals + // compilable into switches, for a time I had a more generous condition: + // `if (sym.isFinal || sym.isLocal) tpe else tpe1` + // This led to issues with expressions like classOf[List[_]] which apparently + // depend on being deconst-ed here, so this is again the original: + else if (!sym.isFinal) tpe1 + else tpe } // sets each ValDef's symbol diff --git a/test/files/pos/widen-existential.scala b/test/files/pos/widen-existential.scala index 90a62e461b..d7fa3cc1d8 100644 --- a/test/files/pos/widen-existential.scala +++ b/test/files/pos/widen-existential.scala @@ -1,3 +1,7 @@ class A { { val x = classOf[List[_]] } + def f = { + val g = classOf[List[_]] + List(g, g) + } }
\ No newline at end of file diff --git a/test/files/run/constrained-types.check b/test/files/run/constrained-types.check index 6919eca9bc..66580f063a 100644 --- a/test/files/run/constrained-types.check +++ b/test/files/run/constrained-types.check @@ -100,7 +100,7 @@ scala> def m = { val y : String @Annot(x) = x y } // x should not escape the local scope with a narrow type -m: String @Annot("three") +m: java.lang.String @Annot(x) forSome { val x: java.lang.String } scala> diff --git a/test/files/pos/no-widen-locals.scala b/test/pending/pos/no-widen-locals.scala index 32579404b2..ba568f64eb 100644 --- a/test/files/pos/no-widen-locals.scala +++ b/test/pending/pos/no-widen-locals.scala @@ -1,3 +1,5 @@ +// Worked from r23262 until that was reverted somewhere +// around r25016. import annotation.switch object Test { |