summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2013-11-25 14:43:17 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2013-11-25 14:43:17 -0800
commit84c096762b0cd24184bea1567a033f07909f5cff (patch)
tree2575ef38a22ea129814f5514edce4708aa8ad2ad /src
parentd19954eb94afb27ca90b3bbcfb9eecec5e85428a (diff)
parent518635385ac1ba14aa230de3e431793331300546 (diff)
downloadscala-84c096762b0cd24184bea1567a033f07909f5cff.tar.gz
scala-84c096762b0cd24184bea1567a033f07909f5cff.tar.bz2
scala-84c096762b0cd24184bea1567a033f07909f5cff.zip
Merge pull request #3178 from retronym/ticket/7872
SI-7872 Plug a variance exploit in refinement types
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala2
-rw-r--r--src/reflect/scala/reflect/internal/Variances.scala10
2 files changed, 12 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index 84531608e0..38065d5ea8 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -1762,6 +1762,8 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
| TypeDef(_, _, _, _) =>
if (result.symbol.isLocal || result.symbol.isTopLevel)
varianceValidator.traverse(result)
+ case tt @ TypeTree() if tt.original != null =>
+ varianceValidator.traverse(tt.original) // See SI-7872
case _ =>
}
result
diff --git a/src/reflect/scala/reflect/internal/Variances.scala b/src/reflect/scala/reflect/internal/Variances.scala
index 5280467055..cd09e83cd3 100644
--- a/src/reflect/scala/reflect/internal/Variances.scala
+++ b/src/reflect/scala/reflect/internal/Variances.scala
@@ -162,6 +162,16 @@ trait Variances {
traverseTreess(vparamss)
case Template(_, _, _) =>
super.traverse(tree)
+ case CompoundTypeTree(templ) =>
+ super.traverse(tree)
+
+ // SI-7872 These two cases make sure we don't miss variance exploits
+ // in originals, e.g. in `foo[({type l[+a] = List[a]})#l]`
+ case tt @ TypeTree() if tt.original != null =>
+ super.traverse(tt.original)
+ case tt : TypTree =>
+ super.traverse(tt)
+
case _ =>
}
}