From 2aa685bcbf38b69ff52cf915a013f3f200a8fa7c Mon Sep 17 00:00:00 2001 From: Aleksandar Prokopec Date: Fri, 18 May 2012 13:46:30 +0200 Subject: Fixes SI-4717. A lazy val declared inside an anonymous class inside a specialized context no longer crashes Duplicators. Previously, a duplicated lazy val was assigned to the wrong owner in Duplicators: def x[B >: A]: Unit = new Bounds[B] { lazy val it = ??? // def or val okay } Above, the `it` in `$anon` in `x$mcZ$sp` had its owner set to `x$mcZ$sp` instead of `$anon`. This crashed the typer when it had to retype its lazy accessor, because there was no `lazy var it` in `$anon$`. Furthermore, the duplicated symbol wasn't being added to the list of declarations of `$anon`. Changes: 1) `invalidate` in Duplicators takes an additional parameter which is the new owner of the new symbol that has to be duplicated. If this parameter is set to `NoSymbol`, then the new owner is `context.owner`, as before. 2) the newly created lazy val symbol is being added to the list of declarations of its new owner. Removes debugging output from the previous commit. Review by dragos. @mention dragos --- test/files/pos/t4717.scala | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'test/files') diff --git a/test/files/pos/t4717.scala b/test/files/pos/t4717.scala index 8144c0c48b..4acfe489cc 100644 --- a/test/files/pos/t4717.scala +++ b/test/files/pos/t4717.scala @@ -4,7 +4,7 @@ -/* + trait Bug1[@specialized(Boolean) A] extends TraversableOnce[A] { def ++[B >: A](that: TraversableOnce[B]): Iterator[B] = new Iterator[B] { @@ -14,25 +14,21 @@ trait Bug1[@specialized(Boolean) A] extends TraversableOnce[A] { } } -*/ -/* + trait WorksFine[@specialized(Boolean) A] { class SubBounds[B >: A] extends Bounds[B] { lazy val it = ??? - it } def x[B >: A]: Unit = new SubBounds[B] } -*/ trait Bounds[@specialized(Boolean) A] { // okay without `>: A` def x[B >: A]: Unit = new Bounds[B] { lazy val it = ??? // def or val okay - it } } -- cgit v1.2.3