From e28c3edda4dd405ed382227d2a688b799bf33c72 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Sat, 11 May 2013 16:27:03 -0700 Subject: SI-1786 incorporate defined bounds in inference Also fixes SI-5459. Look, you don't have to redeclare the bounds, isn't it exciting? For instance, there are eight places in JavaMirrors with this: jTypeVariable[_ <: GenericDeclaration] After this code is in starr, those can look like this: jTypeVariable[_] Since TypeVariable's definition looks like this: interface TypeVariable We already know that! --- test/files/pos/t1786.scala | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 test/files/pos/t1786.scala (limited to 'test/files/pos/t1786.scala') diff --git a/test/files/pos/t1786.scala b/test/files/pos/t1786.scala new file mode 100644 index 0000000000..22bd659609 --- /dev/null +++ b/test/files/pos/t1786.scala @@ -0,0 +1,19 @@ +class SomeClass(val intValue:Int) +class MyClass[T <: SomeClass](val myValue:T) +class Flooz[A >: Null <: SomeClass, T >: Null <: A](var value: T) + +class A { + def f1(i:MyClass[_]) = i.myValue.intValue + def f2(i:MyClass[_ <: SomeClass]) = i.myValue.intValue + def f3[T](i: MyClass[T]) = i.myValue.intValue + def f4[T <: SomeClass](i: MyClass[T]) = i.myValue.intValue + def f5[T >: Null](i: MyClass[T]) = i.myValue.intValue + def f6[T >: Null <: String](i: MyClass[T]) = i.myValue.intValue + i.myValue.charAt(0) + + def g1[A, T](x: Flooz[A, T]) = { x.value = null ; x.value.intValue } + def g2(x: Flooz[_, _]) = { x.value = null ; x.value.intValue } + + class MyClass2(x: MyClass[_]) { val p = x.myValue.intValue } + class MyClass3[T <: String](x: MyClass[T]) { val p = x.myValue.intValue + x.myValue.length } + class MyClass4[T >: Null](x: MyClass[T]) { val p = x.myValue.intValue } +} -- cgit v1.2.3 From b4751a679a1e01d1d8826c4c2d68af269a1c0443 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 14 May 2013 16:18:15 -0700 Subject: No bounds-driven inference for the named. This is a variation on the previous commit which excludes named type parameters, so this works def f(x: Class[_]) = x.foo.bar But this does not: def f[T](x: Class[T]) = x.foo.bar This seems undesirable to me, but I offer it in case it makes the patch more attractive to others. --- src/compiler/scala/tools/nsc/typechecker/Typers.scala | 1 + test/files/neg/t5687.check | 7 +++++-- test/files/pos/t1786.scala | 12 ++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'test/files/pos/t1786.scala') diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index b41df05c3d..491634cf3b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -4914,6 +4914,7 @@ trait Typers extends Adaptations with Tags { && !tparam.isFBounded /* SI-2251 */ && !tparam.isHigherOrderTypeParameter && !(abounds.hi <:< tbounds.hi) + && asym.isSynthetic /* this limits us to placeholder tparams, excluding named ones */ ) arg match { case Bind(_, _) => enhanceBounds() diff --git a/test/files/neg/t5687.check b/test/files/neg/t5687.check index f8d02fdcc3..5096077ee5 100644 --- a/test/files/neg/t5687.check +++ b/test/files/neg/t5687.check @@ -1,5 +1,8 @@ -t5687.scala:20: error: overriding type Repr in class Template with bounds[T <: AnyRef] <: Template[T]; +t5687.scala:4: error: type arguments [T] do not conform to class Template's type parameter bounds [T <: AnyRef] + type Repr[T]<:Template[T] + ^ +t5687.scala:20: error: overriding type Repr in class Template with bounds[T] <: Template[T]; type Repr has incompatible type type Repr = CurveTemplate[T] ^ -one error found +two errors found diff --git a/test/files/pos/t1786.scala b/test/files/pos/t1786.scala index 22bd659609..32d6c06f6e 100644 --- a/test/files/pos/t1786.scala +++ b/test/files/pos/t1786.scala @@ -5,15 +5,15 @@ class Flooz[A >: Null <: SomeClass, T >: Null <: A](var value: T) class A { def f1(i:MyClass[_]) = i.myValue.intValue def f2(i:MyClass[_ <: SomeClass]) = i.myValue.intValue - def f3[T](i: MyClass[T]) = i.myValue.intValue + // def f3[T](i: MyClass[T]) = i.myValue.intValue def f4[T <: SomeClass](i: MyClass[T]) = i.myValue.intValue - def f5[T >: Null](i: MyClass[T]) = i.myValue.intValue - def f6[T >: Null <: String](i: MyClass[T]) = i.myValue.intValue + i.myValue.charAt(0) + // def f5[T >: Null](i: MyClass[T]) = i.myValue.intValue + // def f6[T >: Null <: String](i: MyClass[T]) = i.myValue.intValue + i.myValue.charAt(0) - def g1[A, T](x: Flooz[A, T]) = { x.value = null ; x.value.intValue } + // def g1[A, T](x: Flooz[A, T]) = { x.value = null ; x.value.intValue } def g2(x: Flooz[_, _]) = { x.value = null ; x.value.intValue } class MyClass2(x: MyClass[_]) { val p = x.myValue.intValue } - class MyClass3[T <: String](x: MyClass[T]) { val p = x.myValue.intValue + x.myValue.length } - class MyClass4[T >: Null](x: MyClass[T]) { val p = x.myValue.intValue } + // class MyClass3[T <: String](x: MyClass[T]) { val p = x.myValue.intValue + x.myValue.length } + // class MyClass4[T >: Null](x: MyClass[T]) { val p = x.myValue.intValue } } -- cgit v1.2.3