From 5087792ddace9cc76d063d6cc9327eb41c73b52d Mon Sep 17 00:00:00 2001 From: Iulian Dragos Date: Tue, 9 Feb 2010 19:21:34 +0000 Subject: Fixed partially specialized classes. --- .../scala/tools/nsc/transform/SpecializeTypes.scala | 16 ++++++++++++---- test/files/pos/spec-partially.flags | 1 + test/files/pos/spec-partially.scala | 5 +++++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 test/files/pos/spec-partially.flags create mode 100644 test/files/pos/spec-partially.scala diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index 77e3757092..5792b5432b 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -372,16 +372,24 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { typeEnv(cls) = env this.specializedClass((clazz, env)) = cls + // declarations of the newly specialized class 'cls' val decls1 = new Scope + // original unspecialized type parameters + var oldClassTParams: List[Symbol] = Nil + + // unspecialized type parameters of 'cls' (cloned) + var newClassTParams: List[Symbol] = Nil + val specializedInfoType: Type = { val (_, unspecParams) = splitParams(clazz.info.typeParams) - val tparams1 = cloneSymbols(unspecParams, cls) - var parents = List(subst(env, clazz.tpe).subst(unspecParams, tparams1 map (_.tpe))) + oldClassTParams = unspecParams + newClassTParams = cloneSymbols(unspecParams, cls) + var parents = List(subst(env, clazz.tpe).subst(unspecParams, newClassTParams map (_.tpe))) if (parents.head.typeSymbol.isTrait) parents = parents.head.parents.head :: parents val infoType = ClassInfoType(parents, decls1, cls) - if (tparams1.isEmpty) infoType else PolyType(tparams1, infoType) + if (newClassTParams.isEmpty) infoType else PolyType(newClassTParams, infoType) } atPhase(phase.next)(cls.setInfo(specializedInfoType)) @@ -395,7 +403,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { */ def enterMember(sym: Symbol): Symbol = { typeEnv(sym) = fullEnv ++ typeEnv(sym) // append the full environment - sym.setInfo(sym.info.substThis(clazz, ThisType(cls))) + sym.setInfo(sym.info.substThis(clazz, ThisType(cls)).subst(oldClassTParams, newClassTParams map (_.tpe))) decls1.enter(subst(fullEnv)(sym)) } diff --git a/test/files/pos/spec-partially.flags b/test/files/pos/spec-partially.flags new file mode 100644 index 0000000000..a5f3e74f73 --- /dev/null +++ b/test/files/pos/spec-partially.flags @@ -0,0 +1 @@ +-Yspecialized diff --git a/test/files/pos/spec-partially.scala b/test/files/pos/spec-partially.scala new file mode 100644 index 0000000000..90778e42a8 --- /dev/null +++ b/test/files/pos/spec-partially.scala @@ -0,0 +1,5 @@ +/** Test case for partially specialized classes. see #2880. */ + +class Arc[State, @specialized T](label: T, to: State) + + -- cgit v1.2.3