summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Suereth <Joshua.Suereth@gmail.com>2012-10-23 09:40:18 -0700
committerJosh Suereth <Joshua.Suereth@gmail.com>2012-10-23 09:40:18 -0700
commit5b98644ff9bca3b853464f6555ed7ea9af716adf (patch)
tree5a94b89ecbe13088be860393f2a3b4034371cda0
parent6daf9c642578c0af178075f5cc10e2a19c35e12a (diff)
parentc130e19c1cb4f4a1126d543f29a6f0408f25763f (diff)
downloadscala-5b98644ff9bca3b853464f6555ed7ea9af716adf.tar.gz
scala-5b98644ff9bca3b853464f6555ed7ea9af716adf.tar.bz2
scala-5b98644ff9bca3b853464f6555ed7ea9af716adf.zip
Merge pull request #1515 from paulp/issue/6552
Fix SI-6552, regression with self types.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala1
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala8
-rw-r--r--test/files/pos/t6552.scala8
3 files changed, 14 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index 211da044e6..b9b17c0277 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -558,6 +558,7 @@ trait Contexts { self: Analyzer =>
( (ab.isTerm || ab == rootMirror.RootClass)
|| (accessWithin(ab) || accessWithinLinked(ab)) &&
( !sym.hasLocalFlag
+ || sym.owner.isImplClass // allow private local accesses to impl classes
|| sym.isProtected && isSubThisType(pre, sym.owner)
|| pre =:= sym.owner.thisType
)
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index ab33c29153..403bf7d492 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -1409,9 +1409,11 @@ trait Types extends api.Types { self: SymbolTable =>
final class UniqueThisType(sym: Symbol) extends ThisType(sym) { }
object ThisType extends ThisTypeExtractor {
- def apply(sym: Symbol): Type =
- if (phase.erasedTypes) sym.tpe
- else unique(new UniqueThisType(sym))
+ def apply(sym: Symbol): Type = (
+ if (!phase.erasedTypes) unique(new UniqueThisType(sym))
+ else if (sym.isImplClass) sym.typeOfThis
+ else sym.tpe
+ )
}
/** A class for singleton types of the form `<prefix>.<sym.name>.type`.
diff --git a/test/files/pos/t6552.scala b/test/files/pos/t6552.scala
new file mode 100644
index 0000000000..98e686a1ae
--- /dev/null
+++ b/test/files/pos/t6552.scala
@@ -0,0 +1,8 @@
+object Repros {
+ class Bar {}
+ class Baz(val myFoo: Foo) { }
+ trait Foo {
+ this: Bar =>
+ val thing = new Baz(this)
+ }
+}