diff options
author | Paul Phillips <paulp@improving.org> | 2012-05-23 07:58:54 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-05-23 08:43:13 -0700 |
commit | f026bbb2ee1d1f9bed8c3a401833bb535b856f6b (patch) | |
tree | efcd99b61928bb97ece5bfde1be32526cca1940d | |
parent | c691104b9ee896b96fc161e78d84ec9db2eef215 (diff) | |
download | scala-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.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala | 25 | ||||
-rw-r--r-- | test/files/pos/z1730.flags | 1 | ||||
-rw-r--r-- | test/files/pos/z1730.scala | 13 |
3 files changed, 26 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) { diff --git a/test/files/pos/z1730.flags b/test/files/pos/z1730.flags new file mode 100644 index 0000000000..5319681590 --- /dev/null +++ b/test/files/pos/z1730.flags @@ -0,0 +1 @@ +-Ycheck:all
\ No newline at end of file diff --git a/test/files/pos/z1730.scala b/test/files/pos/z1730.scala new file mode 100644 index 0000000000..0c5875a818 --- /dev/null +++ b/test/files/pos/z1730.scala @@ -0,0 +1,13 @@ +// /scala/trac/z1730/a.scala +// Wed May 23 07:41:25 PDT 2012 + +class X[R] { + def xx(value: => R, addTweak: Boolean = true) = 0 +} + +class Boo { + implicit def toX[R](v: R) : X[R] = null + def goo2 { + 3.xx(34) + } +} |