summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/Variances.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-08-29 13:55:10 +1000
committerJason Zaugg <jzaugg@gmail.com>2016-08-29 13:57:25 +1000
commit8ef3e6e47098786f9522ebcaffaa261d8f240308 (patch)
tree49e7c35a223b7ffad64fbc684daffcac7303d14b /src/reflect/scala/reflect/internal/Variances.scala
parent036a9bbd0be2b71fc9d60954fd0b1b64c9a181af (diff)
downloadscala-8ef3e6e47098786f9522ebcaffaa261d8f240308.tar.gz
scala-8ef3e6e47098786f9522ebcaffaa261d8f240308.tar.bz2
scala-8ef3e6e47098786f9522ebcaffaa261d8f240308.zip
Address review feedback: comments, renames and extra test
Diffstat (limited to 'src/reflect/scala/reflect/internal/Variances.scala')
-rw-r--r--src/reflect/scala/reflect/internal/Variances.scala12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/reflect/scala/reflect/internal/Variances.scala b/src/reflect/scala/reflect/internal/Variances.scala
index 0b964e81d5..24a2f46b75 100644
--- a/src/reflect/scala/reflect/internal/Variances.scala
+++ b/src/reflect/scala/reflect/internal/Variances.scala
@@ -50,9 +50,8 @@ trait Variances {
sym.isParameter
&& !(tvar.isTypeParameterOrSkolem && sym.isTypeParameterOrSkolem && tvar.owner == sym.owner)
)
- // return Bivariant if `sym` is local to a term
- // or is private[this] or protected[this]
- def isLocalOnly(sym: Symbol) = !sym.owner.isClass || (
+ // Is `sym` is local to a term or is private[this] or protected[this]?
+ def isExemptFromVariance(sym: Symbol): Boolean = !sym.owner.isClass || (
(sym.isLocalToThis || sym.isSuperAccessor) // super accessors are implicitly local #4345
&& !escapedLocals(sym)
)
@@ -73,7 +72,7 @@ trait Variances {
def relativeVariance(tvar: Symbol): Variance = {
def nextVariance(sym: Symbol, v: Variance): Variance = (
if (shouldFlip(sym, tvar)) v.flip
- else if (isLocalOnly(sym)) Bivariant
+ else if (isExemptFromVariance(sym)) Bivariant
else if (sym.isAliasType) (
// Unsound pre-2.11 behavior preserved under -Xsource:2.10
if (settings.isScala211 || sym.isOverridingSymbol) Invariant
@@ -138,7 +137,10 @@ trait Variances {
tp
}
private def shouldDealias(sym: Symbol): Boolean = {
- sym.isAliasType && isLocalOnly(sym)
+ // The RHS of (private|protected)[this] type aliases are excluded from variance checks. This is
+ // implemented in relativeVariance.
+ // As such, we need to expand references to them to retain soundness. Example: neg/t8079a.scala
+ sym.isAliasType && isExemptFromVariance(sym)
}
def validateDefinition(base: Symbol) {
val saved = this.base