From 7ddabed25a5e559d660a9de53ddf2a3ddabf209c Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 18 Dec 2009 15:22:11 +0000 Subject: Closed #2801. --- src/actors/scala/actors/ReactorTask.scala | 2 +- src/compiler/scala/tools/nsc/symtab/Types.scala | 2 +- src/swing/scala/swing/UIElement.scala | 2 +- test/files/neg/t2801.check | 6 ++++++ test/files/neg/t2801.scala | 3 +++ test/files/pos/t2794.scala | 2 +- 6 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 test/files/neg/t2801.check create mode 100644 test/files/neg/t2801.scala diff --git a/src/actors/scala/actors/ReactorTask.scala b/src/actors/scala/actors/ReactorTask.scala index 8fde0e4aea..28e93bbbff 100644 --- a/src/actors/scala/actors/ReactorTask.scala +++ b/src/actors/scala/actors/ReactorTask.scala @@ -20,7 +20,7 @@ import java.util.concurrent.Callable * * @author Philipp Haller */ -private[actors] class ReactorTask[T <: Reactor](var reactor: T, var fun: () => Unit) +private[actors] class ReactorTask[T >: Null <: Reactor](var reactor: T, var fun: () => Unit) extends Callable[Unit] with Runnable { def run() { diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 24abef8944..513ed34ff9 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -4188,7 +4188,7 @@ A type's typeSymbol should never be inspected directly. } else if (sym1 == NullClass) { tp2 match { case TypeRef(_, sym2, _) => - (sym2 isNonBottomSubClass ObjectClass) && + sym2.isClass && (sym2 isNonBottomSubClass ObjectClass) && !(tp2.normalize.typeSymbol isNonBottomSubClass NotNullClass) case _ => isSingleType(tp2) && tp1 <:< tp2.widen diff --git a/src/swing/scala/swing/UIElement.scala b/src/swing/scala/swing/UIElement.scala index bff294d641..8a661626f4 100644 --- a/src/swing/scala/swing/UIElement.scala +++ b/src/swing/scala/swing/UIElement.scala @@ -32,7 +32,7 @@ object UIElement { * it will return that wrapper. Otherwise it returns `null`. This * method never throws an exception. */ - private[swing] def cachedWrapper[C<:UIElement](c: java.awt.Component): C = { + private[swing] def cachedWrapper[C>:Null<:UIElement](c: java.awt.Component): C = { val w = c match { case c: javax.swing.JComponent => c.getClientProperty(ClientKey) case _ => wrapperCache.get(c) diff --git a/test/files/neg/t2801.check b/test/files/neg/t2801.check new file mode 100644 index 0000000000..25320de5bc --- /dev/null +++ b/test/files/neg/t2801.check @@ -0,0 +1,6 @@ +t2801.scala:2: error: type mismatch; + found : Null(null) + required: A + def f[A <: AnyRef] = { val a: A = null ; a } + ^ +one error found diff --git a/test/files/neg/t2801.scala b/test/files/neg/t2801.scala new file mode 100644 index 0000000000..d425f58b56 --- /dev/null +++ b/test/files/neg/t2801.scala @@ -0,0 +1,3 @@ +object Test { + def f[A <: AnyRef] = { val a: A = null ; a } +} diff --git a/test/files/pos/t2794.scala b/test/files/pos/t2794.scala index caefea4fbb..a17edf8cb3 100644 --- a/test/files/pos/t2794.scala +++ b/test/files/pos/t2794.scala @@ -4,6 +4,6 @@ class Entry[T](val k: Key[T], val v: T) object Entry { - def makeDefault[T <: AnyRef] = new Entry[T](new Key[T], null: T) + def makeDefault[T >: Null <: AnyRef] = new Entry[T](new Key[T], null: T) } -- cgit v1.2.3