From 7023c8d727d5147ebed9c276069e58470e0bbe41 Mon Sep 17 00:00:00 2001 From: Antonio Cunei Date: Wed, 16 Jun 2010 09:03:58 +0000 Subject: Propagation of r22303 for #3568 --- .../scala/tools/nsc/settings/ScalaSettings.scala | 1 + src/compiler/scala/tools/nsc/symtab/Types.scala | 7 +++- test/files/pos/bug3568.scala | 46 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 test/files/pos/bug3568.scala diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala index 51b47f87d6..2454d233f4 100644 --- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala +++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala @@ -138,6 +138,7 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings { val Ycompletion = BooleanSetting ("-Ycompletion-debug", "Trace all tab completion activity.") val Ypmatnaive = BooleanSetting ("-Ypmat-naive", "Desugar matches as naively as possible..") val Yjenkins = BooleanSetting ("-Yjenkins-hashCodes", "Use jenkins hash algorithm for case class generated hashCodes.") + val Ynotnull = BooleanSetting ("-Ynotnull", "Enable the experimental and incomplete scala.NotNull") // Warnings val Ywarndeadcode = BooleanSetting ("-Ywarn-dead-code", "Emit warnings for dead code") diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index c291a391ca..2eca101aab 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -385,9 +385,12 @@ trait Types extends reflect.generic.Types { self: SymbolTable => * the empty list for all other types */ def boundSyms: List[Symbol] = List() - /** Mixin a NotNull trait unless type already has one */ + /** Mixin a NotNull trait unless type already has one + * ...if the option is given, since it is causing typing bugs. + */ def notNull: Type = - if (isNotNull || phase.erasedTypes) this else NotNullType(this) + if (!settings.Ynotnull.value || isNotNull || phase.erasedTypes) this + else NotNullType(this) /** Replace formal type parameter symbols with actual type arguments. * diff --git a/test/files/pos/bug3568.scala b/test/files/pos/bug3568.scala new file mode 100644 index 0000000000..7cfb927138 --- /dev/null +++ b/test/files/pos/bug3568.scala @@ -0,0 +1,46 @@ +import scala.annotation._ +import scala.annotation.unchecked._ +import scala.collection._ + + +package object buffer { + val broken = new ArrayVec2() // commenting out this line causes the file to compile. + + val works = Class.forName("buffer.ArrayVec2").newInstance().asInstanceOf[ArrayVec2] +} + +package buffer { + object Main { + // ArrayVec2 can be compiled, instantiated and used. + def main(args: Array[String]) { println(works) } + } + + trait ElemType { type Element; type Component <: ElemType } + trait Float1 extends ElemType { type Element = Float; type Component = Float1} + class Vec2 extends ElemType { type Element = Vec2; type Component = Float1 } + + abstract class BaseSeq[T <: ElemType, E] + extends IndexedSeq[E] with IndexedSeqOptimized[E, IndexedSeq[E]] { + def length = 1 + def apply(i: Int) :E + } + + abstract class GenericSeq[T <: ElemType] extends BaseSeq[T, T#Element] + trait DataArray[T <: ElemType] extends BaseSeq[T, T#Element] + trait DataView[T <: ElemType] extends BaseSeq[T, T#Element] + abstract class BaseFloat1 extends BaseSeq[Float1, Float] + + class ArrayFloat1 extends BaseFloat1 with DataArray[Float1] { + def apply(i: Int) :Float = 0f + } + + class ViewFloat1 extends BaseFloat1 with DataView[Float1] { + def apply(i: Int) :Float = 0f + } + + class ArrayVec2(val backingSeq: ArrayFloat1) + extends GenericSeq[Vec2] with DataArray[Vec2] { + def this() = this(new ArrayFloat1) + def apply(i: Int) :Vec2 = null + } +} \ No newline at end of file -- cgit v1.2.3