Skip to content

Commit

Permalink
Merge pull request #1087 from hubertp/2.10.x-issue/5687
Browse files Browse the repository at this point in the history
Fixes SI-5687.
  • Loading branch information
adriaanm committed Aug 8, 2012
2 parents ca9831e + 95b3648 commit 7d3b2de
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/reflect/scala/reflect/internal/Types.scala
Expand Up @@ -2202,7 +2202,15 @@ trait Types extends api.Types { self: SymbolTable =>
override protected def normalizeImpl =
if (typeParamsMatchArgs) betaReduce.normalize
else if (isHigherKinded) super.normalizeImpl
else ErrorType
else {
// if we are overriding a type alias in an erroneous way, don't just
// return an ErrorType since that will result in useless error msg.
// Instead let's try to recover from it and rely on refcheck reporting the correct error,
// if that fails fallback to the old behaviour.
val overriddenSym = sym.nextOverriddenSymbol
if (overriddenSym != NoSymbol) pre.memberType(overriddenSym).normalize
else ErrorType
}

// isHKSubType0 introduces synthetic type params so that
// betaReduce can first apply sym.info to typeArgs before calling
Expand Down
8 changes: 8 additions & 0 deletions test/files/neg/t5687.check
@@ -0,0 +1,8 @@
t5687.scala:4: error: type arguments [T] do not conform to class Template's type parameter bounds [T <: AnyRef]
type Repr[T]<:Template[T]
^
t5687.scala:20: error: overriding type Repr in class Template with bounds[T] <: Template[T];
type Repr has incompatible type
type Repr = CurveTemplate[T]
^
two errors found
55 changes: 55 additions & 0 deletions test/files/neg/t5687.scala
@@ -0,0 +1,55 @@
abstract class Template[T <: AnyRef](private val t: T) {

// type Repr[A<:AnyRef]<:Template[T]
type Repr[T]<:Template[T]

def access1(timeout: Int): Repr[T] = this.asInstanceOf[Repr[T]]
def access2: Repr[T] = this.asInstanceOf[Repr[T]]
val access3: Repr[T] = this.asInstanceOf[Repr[T]]
def access4(v: Repr[T]): Repr[T] = this.asInstanceOf[Repr[T]]
def access5(x: X): Repr[T] = this.asInstanceOf[Repr[T]]
def access5(x: Y): Repr[T] = this.asInstanceOf[Repr[T]]

def withReadModifiers(readModifiers:Int): Repr[T] = this.asInstanceOf[Repr[T]]
}

class Curve

class CurveTemplate [T <: Curve](t: T) extends Template(t) {
// type Repr[A<: AnyRef] = CurveTemplate[T]
type Repr = CurveTemplate[T]
}

class Base
class X extends Base
class Y extends Base


object Example {
def test1() {
new CurveTemplate(new Curve).access1(10)

new CurveTemplate(new Curve).access2

new CurveTemplate(new Curve).access3

new CurveTemplate(new Curve).access4(null)

new CurveTemplate(new Curve).access5(new X)

()

}

def test2() {
new CurveTemplate(new Curve).access1(10).withReadModifiers(1)

new CurveTemplate(new Curve).access2.withReadModifiers(1)

new CurveTemplate(new Curve).access3.withReadModifiers(1)

new CurveTemplate(new Curve).access4(null).withReadModifiers(1)

new CurveTemplate(new Curve).access5(new X).withReadModifiers(1)
}
}

0 comments on commit 7d3b2de

Please sign in to comment.