diff options
author | Paul Phillips <paulp@improving.org> | 2013-05-14 16:18:15 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2013-05-14 16:20:57 -0700 |
commit | b4751a679a1e01d1d8826c4c2d68af269a1c0443 (patch) | |
tree | 87e63fcb70eb2b88e54166374c4280ba0ccb7354 | |
parent | e28c3edda4dd405ed382227d2a688b799bf33c72 (diff) | |
download | scala-b4751a679a1e01d1d8826c4c2d68af269a1c0443.tar.gz scala-b4751a679a1e01d1d8826c4c2d68af269a1c0443.tar.bz2 scala-b4751a679a1e01d1d8826c4c2d68af269a1c0443.zip |
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.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 1 | ||||
-rw-r--r-- | test/files/neg/t5687.check | 7 | ||||
-rw-r--r-- | test/files/pos/t1786.scala | 12 |
3 files changed, 12 insertions, 8 deletions
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 } } |