From 942c41b1bdc6db60d530eee70d9dba68acfb54e6 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sat, 16 May 2015 21:06:05 +0200 Subject: [PATCH 1/3] Disable the use of VC*Companion super classes for now They declare final methods which are overriden in SyntheticMethods, which means that all value classes fail at runtime. Disabling them makes it possible to add run tests for value classes which will make it easier to experiment with changes to value classes. --- src/dotty/tools/dotc/transform/ExtensionMethods.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dotty/tools/dotc/transform/ExtensionMethods.scala b/src/dotty/tools/dotc/transform/ExtensionMethods.scala index 9c7b7ebda5cc..ef0faae809d4 100644 --- a/src/dotty/tools/dotc/transform/ExtensionMethods.scala +++ b/src/dotty/tools/dotc/transform/ExtensionMethods.scala @@ -88,11 +88,11 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful decls1.enter(evt2uSym) } - // add a VCXXXCompanion superclass - + // Add the extension methods, the cast methods u2evt$ and evt2u$, and a VC*Companion superclass moduleClassSym.copySymDenotation(info = cinfo.derivedClassInfo( - classParents = ctx.normalizeToClassRefs(List(newSuperClass), moduleSym, decls1), + // FIXME: use of VC*Companion superclasses is disabled until the conflicts with SyntheticMethods are solved. + //classParents = ctx.normalizeToClassRefs(List(newSuperClass), moduleSym, decls1), decls = decls1)) case _ => moduleClassSym From e61e59f739d889549993afdd743cbaf71a95c45e Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sat, 23 May 2015 16:48:15 +0200 Subject: [PATCH 2/3] Add some run tests related to value classes --- tests/pending/run/t6260-delambdafy.check | 4 ---- tests/pending/run/t6260-delambdafy.flags | 1 - tests/{pending => }/run/genericValueClass.check | 0 tests/{pending => }/run/genericValueClass.scala | 0 tests/{pending => }/run/t5608.check | 0 tests/{pending => }/run/t5608.scala | 0 tests/{pending => }/run/t5866.check | 0 tests/{pending => }/run/t5866.scala | 0 tests/run/t6260-delambdafy.check | 4 ++++ tests/{pending => }/run/t6260-delambdafy.scala | 0 tests/{pending => }/run/t6260.check | 0 tests/{pending => }/run/t6260.scala | 0 tests/{pending => }/run/t6534.scala | 0 tests/{pending => }/run/t6574b.check | 0 tests/{pending => }/run/t6574b.scala | 0 tests/{pending => }/run/t7019.scala | 0 tests/{pending => }/run/value-class-extractor-2.check | 0 tests/{pending => }/run/value-class-extractor-2.scala | 1 + tests/{pending => }/run/value-class-extractor.check | 0 tests/{pending => }/run/value-class-extractor.scala | 3 ++- tests/{pending => }/run/valueclasses-constr.check | 0 tests/{pending => }/run/valueclasses-constr.scala | 0 22 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 tests/pending/run/t6260-delambdafy.check delete mode 100644 tests/pending/run/t6260-delambdafy.flags rename tests/{pending => }/run/genericValueClass.check (100%) rename tests/{pending => }/run/genericValueClass.scala (100%) rename tests/{pending => }/run/t5608.check (100%) rename tests/{pending => }/run/t5608.scala (100%) rename tests/{pending => }/run/t5866.check (100%) rename tests/{pending => }/run/t5866.scala (100%) create mode 100644 tests/run/t6260-delambdafy.check rename tests/{pending => }/run/t6260-delambdafy.scala (100%) rename tests/{pending => }/run/t6260.check (100%) rename tests/{pending => }/run/t6260.scala (100%) rename tests/{pending => }/run/t6534.scala (100%) rename tests/{pending => }/run/t6574b.check (100%) rename tests/{pending => }/run/t6574b.scala (100%) rename tests/{pending => }/run/t7019.scala (100%) rename tests/{pending => }/run/value-class-extractor-2.check (100%) rename tests/{pending => }/run/value-class-extractor-2.scala (99%) rename tests/{pending => }/run/value-class-extractor.check (100%) rename tests/{pending => }/run/value-class-extractor.scala (96%) rename tests/{pending => }/run/valueclasses-constr.check (100%) rename tests/{pending => }/run/valueclasses-constr.scala (100%) diff --git a/tests/pending/run/t6260-delambdafy.check b/tests/pending/run/t6260-delambdafy.check deleted file mode 100644 index b2a7bed98890..000000000000 --- a/tests/pending/run/t6260-delambdafy.check +++ /dev/null @@ -1,4 +0,0 @@ -f(C@2e) - -Test$lambda$1$$apply -apply diff --git a/tests/pending/run/t6260-delambdafy.flags b/tests/pending/run/t6260-delambdafy.flags deleted file mode 100644 index 48b438ddf86a..000000000000 --- a/tests/pending/run/t6260-delambdafy.flags +++ /dev/null @@ -1 +0,0 @@ --Ydelambdafy:method diff --git a/tests/pending/run/genericValueClass.check b/tests/run/genericValueClass.check similarity index 100% rename from tests/pending/run/genericValueClass.check rename to tests/run/genericValueClass.check diff --git a/tests/pending/run/genericValueClass.scala b/tests/run/genericValueClass.scala similarity index 100% rename from tests/pending/run/genericValueClass.scala rename to tests/run/genericValueClass.scala diff --git a/tests/pending/run/t5608.check b/tests/run/t5608.check similarity index 100% rename from tests/pending/run/t5608.check rename to tests/run/t5608.check diff --git a/tests/pending/run/t5608.scala b/tests/run/t5608.scala similarity index 100% rename from tests/pending/run/t5608.scala rename to tests/run/t5608.scala diff --git a/tests/pending/run/t5866.check b/tests/run/t5866.check similarity index 100% rename from tests/pending/run/t5866.check rename to tests/run/t5866.check diff --git a/tests/pending/run/t5866.scala b/tests/run/t5866.scala similarity index 100% rename from tests/pending/run/t5866.scala rename to tests/run/t5866.scala diff --git a/tests/run/t6260-delambdafy.check b/tests/run/t6260-delambdafy.check new file mode 100644 index 000000000000..b3ec1b3cc667 --- /dev/null +++ b/tests/run/t6260-delambdafy.check @@ -0,0 +1,4 @@ +f(C@2e) + +apply +get$Lambda diff --git a/tests/pending/run/t6260-delambdafy.scala b/tests/run/t6260-delambdafy.scala similarity index 100% rename from tests/pending/run/t6260-delambdafy.scala rename to tests/run/t6260-delambdafy.scala diff --git a/tests/pending/run/t6260.check b/tests/run/t6260.check similarity index 100% rename from tests/pending/run/t6260.check rename to tests/run/t6260.check diff --git a/tests/pending/run/t6260.scala b/tests/run/t6260.scala similarity index 100% rename from tests/pending/run/t6260.scala rename to tests/run/t6260.scala diff --git a/tests/pending/run/t6534.scala b/tests/run/t6534.scala similarity index 100% rename from tests/pending/run/t6534.scala rename to tests/run/t6534.scala diff --git a/tests/pending/run/t6574b.check b/tests/run/t6574b.check similarity index 100% rename from tests/pending/run/t6574b.check rename to tests/run/t6574b.check diff --git a/tests/pending/run/t6574b.scala b/tests/run/t6574b.scala similarity index 100% rename from tests/pending/run/t6574b.scala rename to tests/run/t6574b.scala diff --git a/tests/pending/run/t7019.scala b/tests/run/t7019.scala similarity index 100% rename from tests/pending/run/t7019.scala rename to tests/run/t7019.scala diff --git a/tests/pending/run/value-class-extractor-2.check b/tests/run/value-class-extractor-2.check similarity index 100% rename from tests/pending/run/value-class-extractor-2.check rename to tests/run/value-class-extractor-2.check diff --git a/tests/pending/run/value-class-extractor-2.scala b/tests/run/value-class-extractor-2.scala similarity index 99% rename from tests/pending/run/value-class-extractor-2.scala rename to tests/run/value-class-extractor-2.scala index d776c35edacc..5850d42f037e 100644 --- a/tests/pending/run/value-class-extractor-2.scala +++ b/tests/run/value-class-extractor-2.scala @@ -1,6 +1,7 @@ final class Opt[+A >: Null](val value: A) extends AnyVal { def get: A = value def isEmpty = value == null + def isDefined = !isEmpty } object Opt { final val None = new Opt[Null](null) diff --git a/tests/pending/run/value-class-extractor.check b/tests/run/value-class-extractor.check similarity index 100% rename from tests/pending/run/value-class-extractor.check rename to tests/run/value-class-extractor.check diff --git a/tests/pending/run/value-class-extractor.scala b/tests/run/value-class-extractor.scala similarity index 96% rename from tests/pending/run/value-class-extractor.scala rename to tests/run/value-class-extractor.scala index 3eaffa0c2397..5628fea47350 100644 --- a/tests/pending/run/value-class-extractor.scala +++ b/tests/run/value-class-extractor.scala @@ -6,12 +6,13 @@ object NonNullChar { @inline final val None = new NonNullChar(0.toChar) } -final class SomeProduct extends Product3[String, Int, List[String]] { +final class SomeProduct /*extends Product3[String, Int, List[String]]*/ { def canEqual(x: Any) = x.isInstanceOf[SomeProduct] def _1 = "abc" def _2 = 5 def _3 = List("bippy") def isEmpty = false + def isDefined = !isEmpty def get = this } object SomeProduct { diff --git a/tests/pending/run/valueclasses-constr.check b/tests/run/valueclasses-constr.check similarity index 100% rename from tests/pending/run/valueclasses-constr.check rename to tests/run/valueclasses-constr.check diff --git a/tests/pending/run/valueclasses-constr.scala b/tests/run/valueclasses-constr.scala similarity index 100% rename from tests/pending/run/valueclasses-constr.scala rename to tests/run/valueclasses-constr.scala From 3fa6782bbe54afeebb7fca229cebff271421f73a Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sat, 23 May 2015 17:58:16 +0200 Subject: [PATCH 3/3] Fix bridge creation for value classes As the comment in the code says: "In general, a bridge is needed when the signature of the closure method after Erasure contains an ErasedValueType but the corresponding type in the functional interface is not an ErasedValueType." So we need to check if _at least one_ of the type needs to be adapted, not if _all of them_ need to, the use of "forall" was an error. --- src/dotty/tools/dotc/transform/Erasure.scala | 2 +- tests/pending/run/t8017.flags | 1 - tests/{pending => }/run/t8017/value-class-lambda.scala | 0 tests/{pending => }/run/t8017/value-class.scala | 0 4 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 tests/pending/run/t8017.flags rename tests/{pending => }/run/t8017/value-class-lambda.scala (100%) rename tests/{pending => }/run/t8017/value-class.scala (100%) diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala index 749bbed9386e..1664db456124 100644 --- a/src/dotty/tools/dotc/transform/Erasure.scala +++ b/src/dotty/tools/dotc/transform/Erasure.scala @@ -523,7 +523,7 @@ object Erasure extends TypeTestsCasts{ // Erasure contains an ErasedValueType but the corresponding type in the functional // interface is not an ErasedValueType. val bridgeNeeded = - (implResultType :: implParamTypes, samResultType :: samParamTypes).zipped.forall( + (implResultType :: implParamTypes, samResultType :: samParamTypes).zipped.exists( (implType, samType) => implType.isErasedValueType && !samType.isErasedValueType ) diff --git a/tests/pending/run/t8017.flags b/tests/pending/run/t8017.flags deleted file mode 100644 index 48b438ddf86a..000000000000 --- a/tests/pending/run/t8017.flags +++ /dev/null @@ -1 +0,0 @@ --Ydelambdafy:method diff --git a/tests/pending/run/t8017/value-class-lambda.scala b/tests/run/t8017/value-class-lambda.scala similarity index 100% rename from tests/pending/run/t8017/value-class-lambda.scala rename to tests/run/t8017/value-class-lambda.scala diff --git a/tests/pending/run/t8017/value-class.scala b/tests/run/t8017/value-class.scala similarity index 100% rename from tests/pending/run/t8017/value-class.scala rename to tests/run/t8017/value-class.scala