diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-09-10 00:49:49 -0700 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-09-10 00:49:49 -0700 |
commit | 1015d129a5ce69aad8c273734b23e35c7648b686 (patch) | |
tree | 4c2f72c2844c5cc5f5dfe305392b6692363484a9 | |
parent | 7ecffb0c6719a15c46a1bce5ec8545fb9a1cb24f (diff) | |
parent | cb028ba477f37778bccfc23e597acc0284259681 (diff) | |
download | scala-1015d129a5ce69aad8c273734b23e35c7648b686.tar.gz scala-1015d129a5ce69aad8c273734b23e35c7648b686.tar.bz2 scala-1015d129a5ce69aad8c273734b23e35c7648b686.zip |
Merge pull request #2916 from retronym/ticket/7818
SI-7818 Cast our way out of extended existential angst
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala | 7 | ||||
-rw-r--r-- | test/files/pos/t7818.scala | 10 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala b/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala index bc54054028..e0c0cd0fdb 100644 --- a/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala +++ b/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala @@ -231,9 +231,14 @@ abstract class ExtensionMethods extends Transform with TypingTransformers { .substituteThis(origThis, extensionThis) .changeOwner(origMeth -> extensionMeth) ) + val castBody = + if (extensionBody.tpe <:< extensionMono.finalResultType) + extensionBody + else + gen.mkCastPreservingAnnotations(extensionBody, extensionMono.finalResultType) // SI-7818 e.g. mismatched existential skolems // Record the extension method ( FIXME: because... ? ) - extensionDefs(companion) += atPos(tree.pos)(DefDef(extensionMeth, extensionBody)) + extensionDefs(companion) += atPos(tree.pos)(DefDef(extensionMeth, castBody)) // These three lines are assembling Foo.bar$extension[T1, T2, ...]($this) // which leaves the actual argument application for extensionCall. diff --git a/test/files/pos/t7818.scala b/test/files/pos/t7818.scala new file mode 100644 index 0000000000..77b99e7d5d --- /dev/null +++ b/test/files/pos/t7818.scala @@ -0,0 +1,10 @@ +class Observable1[+T](val asJava: JObservable[_ <: T]) extends AnyVal { + private def foo[X](a: JObservable[X]): JObservable[X] = ??? + // was generating a type error as the type of the RHS included an existential + // skolem based on the class type parameter `T`, which did not conform + // to the typer parameter of the extension method into which the RHS is + // transplanted. + def synchronize: Observable1[T] = new Observable1(foo(asJava)) +} + +class JObservable[T] |