aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Constants.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-07-08 15:28:37 +0200
committerMartin Odersky <odersky@gmail.com>2016-07-08 15:32:29 +0200
commitbcf6354220dd4f4700dc7aec47b54ab0bc9d1798 (patch)
tree427cfd01f2f00ea566c3c6941d21b10471fc6f82 /src/dotty/tools/dotc/core/Constants.scala
parent07fd8a357ed660ef15163efb2788928fec290fdd (diff)
downloaddotty-bcf6354220dd4f4700dc7aec47b54ab0bc9d1798.tar.gz
dotty-bcf6354220dd4f4700dc7aec47b54ab0bc9d1798.tar.bz2
dotty-bcf6354220dd4f4700dc7aec47b54ab0bc9d1798.zip
Fix: #1366, constant adaptation
Fix: #1366. Constant adaptation did not work if the expected type was an as yet uninstantiated type variable.
Diffstat (limited to 'src/dotty/tools/dotc/core/Constants.scala')
-rw-r--r--src/dotty/tools/dotc/core/Constants.scala15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/core/Constants.scala b/src/dotty/tools/dotc/core/Constants.scala
index e13e07f58..0f8c68bad 100644
--- a/src/dotty/tools/dotc/core/Constants.scala
+++ b/src/dotty/tools/dotc/core/Constants.scala
@@ -167,12 +167,19 @@ object Constants {
/** Convert constant value to conform to given type.
*/
def convertTo(pt: Type)(implicit ctx: Context): Constant = {
- def lowerBound(pt: Type): Type = pt.dealias.stripTypeVar match {
- case tref: TypeRef if !tref.symbol.isClass => lowerBound(tref.info.bounds.lo)
- case param: PolyParam => lowerBound(ctx.typerState.constraint.nonParamBounds(param).lo)
+ def classBound(pt: Type): Type = pt.dealias.stripTypeVar match {
+ case tref: TypeRef if !tref.symbol.isClass => classBound(tref.info.bounds.lo)
+ case param: PolyParam =>
+ ctx.typerState.constraint.entry(param) match {
+ case TypeBounds(lo, hi) =>
+ if (hi.classSymbol.isPrimitiveValueClass) hi //constrain further with high bound
+ else lo
+ case NoType => param.binder.paramBounds(param.paramNum).lo
+ case inst => classBound(inst)
+ }
case pt => pt
}
- val target = lowerBound(pt).typeSymbol
+ val target = classBound(pt).typeSymbol
if (target == tpe.typeSymbol)
this
else if ((target == defn.ByteClass) && isByteRange)