summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-05-23 07:58:54 -0700
committerPaul Phillips <paulp@improving.org>2012-05-23 08:43:13 -0700
commitf026bbb2ee1d1f9bed8c3a401833bb535b856f6b (patch)
treeefcd99b61928bb97ece5bfde1be32526cca1940d /src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
parentc691104b9ee896b96fc161e78d84ec9db2eef215 (diff)
downloadscala-f026bbb2ee1d1f9bed8c3a401833bb535b856f6b.tar.gz
scala-f026bbb2ee1d1f9bed8c3a401833bb535b856f6b.tar.bz2
scala-f026bbb2ee1d1f9bed8c3a401833bb535b856f6b.zip
Widen types in names/defaults transformations.
We were getting away with this somehow, but the types are wrong after typer and that sort of thing is noticed by more people now. I took the opportunity to add our first -Ycheck:all test, which is at least as much about helping -Ycheck:all remain in good working order as it is about this test.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
index d1f319311e..932e4548ef 100644
--- a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
@@ -260,19 +260,18 @@ trait NamesDefaults { self: Analyzer =>
def argValDefs(args: List[Tree], paramTypes: List[Type], blockTyper: Typer): List[ValDef] = {
val context = blockTyper.context
val symPs = map2(args, paramTypes)((arg, tpe) => {
- val byName = isByNameParamType(tpe)
- val (argTpe, repeated) =
- if (isScalaRepeatedParamType(tpe)) arg match {
- case Typed(expr, Ident(tpnme.WILDCARD_STAR)) =>
- (expr.tpe, true)
- case _ =>
- (seqType(arg.tpe), true)
- } else (arg.tpe, false)
- val s = context.owner.newValue(unit.freshTermName("x$"), arg.pos)
- val valType = if (byName) functionType(List(), argTpe)
- else if (repeated) argTpe
- else argTpe
- s.setInfo(valType)
+ val byName = isByNameParamType(tpe)
+ val repeated = isScalaRepeatedParamType(tpe)
+ val argTpe = (
+ if (repeated) arg match {
+ case Typed(expr, Ident(tpnme.WILDCARD_STAR)) => expr.tpe
+ case _ => seqType(arg.tpe)
+ }
+ else arg.tpe
+ ).widen // have to widen or types inferred from literal defaults will be singletons
+ val s = context.owner.newValue(unit.freshTermName("x$"), arg.pos) setInfo (
+ if (byName) functionType(Nil, argTpe) else argTpe
+ )
(context.scope.enter(s), byName, repeated)
})
map2(symPs, args) {