diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala | 4 | ||||
-rw-r--r-- | test/files/run/spec-ame.check | 2 | ||||
-rw-r--r-- | test/files/run/spec-ame.scala | 17 |
3 files changed, 23 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index b282f8fbd3..60634c467f 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -570,6 +570,10 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { normalizeMember(m.owner, m, outerEnv) flatMap { normalizedMember => val ms = specializeMember(m.owner, normalizedMember, outerEnv, clazz.info.typeParams) // atPhase(currentRun.typerPhase)(println("normalizedMember.info: " + normalizedMember.info)) // bring the info to the typer phase + // interface traits have concrete members now + if (ms.nonEmpty && clazz.isTrait && clazz.isInterface) + clazz.resetFlag(INTERFACE) + if (normalizedMember.isMethod) { val newTpe = subst(outerEnv, normalizedMember.info) if (newTpe != normalizedMember.info) // only do it when necessary, otherwise the method type might be at a later phase already diff --git a/test/files/run/spec-ame.check b/test/files/run/spec-ame.check new file mode 100644 index 0000000000..afa12db4df --- /dev/null +++ b/test/files/run/spec-ame.check @@ -0,0 +1,2 @@ +abc +10 diff --git a/test/files/run/spec-ame.scala b/test/files/run/spec-ame.scala new file mode 100644 index 0000000000..86c47077f0 --- /dev/null +++ b/test/files/run/spec-ame.scala @@ -0,0 +1,17 @@ +// ticket #3432 +object Test { + trait B[@specialized(Int) T] { + def value: T + } + + class A[@specialized(Int) T](x: T) { + def foo: B[T] = new B[T] { + def value = x + } + } + + def main(args: Array[String]) { + println((new A("abc")).foo.value) + println((new A(10)).foo.value) + } +} |