diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-11-25 14:43:17 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-11-25 14:43:17 -0800 |
commit | 84c096762b0cd24184bea1567a033f07909f5cff (patch) | |
tree | 2575ef38a22ea129814f5514edce4708aa8ad2ad /src | |
parent | d19954eb94afb27ca90b3bbcfb9eecec5e85428a (diff) | |
parent | 518635385ac1ba14aa230de3e431793331300546 (diff) | |
download | scala-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.scala | 2 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Variances.scala | 10 |
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 _ => } } |