diff options
author | Martin Odersky <odersky@gmail.com> | 2017-04-09 17:01:15 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-04-09 17:01:28 +0200 |
commit | e2639e08b097aa9e5cb1f9a38ef37c6caec05874 (patch) | |
tree | c7211ccb47be4fd4d945769d2cdad3ba909cb907 | |
parent | b8bb34dd0ea68cfed09ed54604f659a787037d2d (diff) | |
download | dotty-e2639e08b097aa9e5cb1f9a38ef37c6caec05874.tar.gz dotty-e2639e08b097aa9e5cb1f9a38ef37c6caec05874.tar.bz2 dotty-e2639e08b097aa9e5cb1f9a38ef37c6caec05874.zip |
Fix #2198: Don't widen module singletons
Since module classes are a compiler-generated construct that's not directly
visible to programmers, it seems better not to automatically widen a module
singleton to its underlying class.
Fixes #2198.
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/Namer.scala | 6 | ||||
-rw-r--r-- | tests/pos/i2198.scala | 6 |
2 files changed, 10 insertions, 2 deletions
diff --git a/compiler/src/dotty/tools/dotc/typer/Namer.scala b/compiler/src/dotty/tools/dotc/typer/Namer.scala index ce2030c01..b436b36b0 100644 --- a/compiler/src/dotty/tools/dotc/typer/Namer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Namer.scala @@ -1043,9 +1043,11 @@ class Namer { typer: Typer => def isInline = sym.is(FinalOrInline, butNot = Method | Mutable) // Widen rhs type and approximate `|' but keep ConstantTypes if - // definition is inline (i.e. final in Scala2). + // definition is inline (i.e. final in Scala2) and keep module singleton types + // instead of widening to the underlying module class types. def widenRhs(tp: Type): Type = tp.widenTermRefExpr match { - case tp: ConstantType if isInline => tp + case ctp: ConstantType if isInline => ctp + case ref: TypeRef if ref.symbol.is(ModuleClass) => tp case _ => ctx.harmonizeUnion(tp.widen) } diff --git a/tests/pos/i2198.scala b/tests/pos/i2198.scala new file mode 100644 index 000000000..62ae7e8b5 --- /dev/null +++ b/tests/pos/i2198.scala @@ -0,0 +1,6 @@ +object Test { + val nil = scala.collection.immutable.Nil + def f(x: nil.type): Int = 3 + + f(scala.collection.immutable.Nil) +} |