Skip to content

Commit

Permalink
Merge pull request #558 from lrytz/wip/t5259
Browse files Browse the repository at this point in the history
Fix SI-5259
  • Loading branch information
jsuereth committed May 16, 2012
2 parents 8a42d53 + 7d79c44 commit 9fe251e
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
Original file line number Diff line number Diff line change
Expand Up @@ -158,20 +158,20 @@ trait NamesDefaults { self: Analyzer =>
// it stays in Vegas: SI-5720, SI-5727
qual changeOwner (blockTyper.context.owner -> sym)

val newQual = atPos(qual.pos.focus)(blockTyper.typedQualifier(Ident(sym.name)))
var baseFunTransformed = atPos(baseFun.pos.makeTransparent) {
// don't use treeCopy: it would assign opaque position.
val f = Select(gen.mkAttributedRef(sym), selected)
.setType(baseFun1.tpe).setSymbol(baseFun1.symbol)
// setSymbol below is important because the 'selected' function might be overloaded. by
// assigning the correct method symbol, typedSelect will just assign the type. the reason
// to still call 'typed' is to correctly infer singleton types, SI-5259.
val f = blockTyper.typedOperator(Select(newQual, selected).setSymbol(baseFun1.symbol))
if (funTargs.isEmpty) f
else TypeApply(f, funTargs).setType(baseFun.tpe)
}

val b = Block(List(vd), baseFunTransformed)
.setType(baseFunTransformed.tpe).setPos(baseFun.pos)

val defaultQual = Some(atPos(qual.pos.focus)(gen.mkAttributedRef(sym)))
context.namedApplyBlockInfo =
Some((b, NamedApplyInfo(defaultQual, defaultTargs, Nil, blockTyper)))
Some((b, NamedApplyInfo(Some(newQual), defaultTargs, Nil, blockTyper)))
b
}

Expand Down
21 changes: 21 additions & 0 deletions test/files/pos/t5259.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
class A[T]
class B {
def m(a: A[this.type] = new A[this.type]) { }
}

class C {
def foo(a: Int, b: Int = 0) = 0
def foo() = 0
}

object Test {
def newB = new B
newB.m()

val stableB = new B
stableB.m()

def f {
println((new C).foo(0))
}
}

0 comments on commit 9fe251e

Please sign in to comment.