Skip to content

Commit

Permalink
Disallow polymorphic refinements in stuctural types.
Browse files Browse the repository at this point in the history
We can't handle them with the proposed scheme. I made a note in scala#1886.
  • Loading branch information
odersky committed Jan 28, 2017
1 parent 2bbf9ca commit 678e8e4
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
4 changes: 3 additions & 1 deletion compiler/src/dotty/tools/dotc/typer/Typer.scala
Expand Up @@ -1039,7 +1039,9 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
for (refinement <- refinements1) { // TODO: get clarity whether we want to enforce these conditions
typr.println(s"adding refinement $refinement")
checkRefinementNonCyclic(refinement, refineCls, seen)
}
val rsym = refinement.symbol
if (rsym.info.isInstanceOf[PolyType] && rsym.allOverriddenSymbols.isEmpty)
ctx.error(i"polymorphic refinement $rsym without matching type in parent $tpt1 is no longer allowed", refinement.pos) }
assignType(cpy.RefinedTypeTree(tree)(tpt1, refinements1), tpt1, refinements1, refineCls)
}

Expand Down
11 changes: 11 additions & 0 deletions tests/neg/structural.scala
@@ -0,0 +1,11 @@
object Test3 {
import scala.reflect.Selectable.reflectiveSelectable
def g(x: { type T ; def t: T ; def f(a: T): Boolean }) = x.f(x.t) // error: no ClassTag for x.T
g(new { type T = Int; def t = 4; def f(a:T) = true })
g(new { type T = Any; def t = 4; def f(a:T) = true })
val y: { type T = Int; def t = 4; def f(a:T) = true }
= new { type T = Int; def t = 4; def f(a:T) = true }

def h(x: { def f[T](a: T): Int }) = x.f[Int](4) // error: polymorphic refinement method ... no longer allowed

}

0 comments on commit 678e8e4

Please sign in to comment.