summaryrefslogtreecommitdiff
path: root/test/files/pos/t6231.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-27 15:13:50 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-12-19 15:27:06 +0100
commitcca4d51dbf3f8478cb338e6d53e34003e9a3fa45 (patch)
tree047ae290cd9490c8494085f94dd07986ee801ec8 /test/files/pos/t6231.scala
parentd99a4919e0fa4894829c752a8f881d7b103d8cda (diff)
downloadscala-cca4d51dbf3f8478cb338e6d53e34003e9a3fa45.tar.gz
scala-cca4d51dbf3f8478cb338e6d53e34003e9a3fa45.tar.bz2
scala-cca4d51dbf3f8478cb338e6d53e34003e9a3fa45.zip
SI-5508 Fix crasher with private[this] in nested traits
Currently, accessors for private local trait fields are added very late in the game when the `Mixin` tree transformer treats the trait. By contrast, fields with weaker access have accessors created eagerly in `Namers`. // Mixin#addLateInterfaceMembers val getter = member.getter(clazz) if (getter == NoSymbol) addMember(clazz, newGetter(member)) `addMember` mutates the type of the interface to add the getter. (This seems like a pretty poor design: usually if a phase changes types, it should do in an `InfoTransformer`.) However, if an inner class or anonymous function of the trait has been flattened to a spot where it precedes the trait in the enclosing packages info, this code hasn't had a chance to run, and the lookup of the getter crashes as mixins `postTransform` runs over a selection of the not-yet-materialized getter. // Mixin#postTransform case Select(qual, name) if sym.owner.isImplClass && !isStaticOnly(sym) => val iface = toInterface(sym.owner.tpe).typeSymbol val ifaceGetter = sym getter iface This commit ensures that `Flatten` lifts inner classes to a position *after* the enclosing class in the stats of the enclosing package. Bonus fix: SI-7012 (the followup ticket to SI-6231 / SI-2897)
Diffstat (limited to 'test/files/pos/t6231.scala')
-rw-r--r--test/files/pos/t6231.scala15
1 files changed, 15 insertions, 0 deletions
diff --git a/test/files/pos/t6231.scala b/test/files/pos/t6231.scala
new file mode 100644
index 0000000000..1e5b4e0e1a
--- /dev/null
+++ b/test/files/pos/t6231.scala
@@ -0,0 +1,15 @@
+object Bug {
+ def bar(ev: Any) = {
+ trait X {
+ def qux = { () => ev }
+ }
+ new X {}.qux()
+
+ // workaround
+ trait Y {
+ val ev2 = ev // manually capture `ev` so that `ev2` is added to the trait interface.
+ def qux = { () => ev2 }
+ }
+ }
+}
+