Skip to content

Commit 9d86052

Browse files
committed
Don't re-infer types of overriding definitions
1 parent 7e9ab8d commit 9d86052

File tree

2 files changed

+53
-12
lines changed

2 files changed

+53
-12
lines changed

compiler/src/dotty/tools/dotc/cc/Setup.scala

+27-12
Original file line numberDiff line numberDiff line change
@@ -331,11 +331,12 @@ extends tpd.TreeTraverser:
331331
else expandAbbreviations(tp1)
332332

333333
/** Transform type of type tree, and remember the transformed type as the type the tree */
334-
private def transformTT(tree: TypeTree, boxed: Boolean)(using Context): Unit =
335-
tree.rememberType(
336-
if tree.isInstanceOf[InferredTypeTree]
337-
then transformInferredType(tree.tpe, boxed)
338-
else transformExplicitType(tree.tpe, boxed))
334+
private def transformTT(tree: TypeTree, boxed: Boolean, exact: Boolean)(using Context): Unit =
335+
if !tree.hasRememberedType then
336+
tree.rememberType(
337+
if tree.isInstanceOf[InferredTypeTree] && !exact
338+
then transformInferredType(tree.tpe, boxed)
339+
else transformExplicitType(tree.tpe, boxed))
339340

340341
/** Substitute parameter symbols in `from` to paramRefs in corresponding
341342
* method or poly types `to`. We use a single BiTypeMap to do everything.
@@ -376,20 +377,34 @@ extends tpd.TreeTraverser:
376377

377378
def traverse(tree: Tree)(using Context): Unit =
378379
tree match
379-
case tree: DefDef if isExcluded(tree.symbol) =>
380-
return
381-
case tree @ ValDef(_, tpt: TypeTree, _) if tree.symbol.is(Mutable) =>
382-
transformTT(tpt, boxed = true) // types of mutable variables are boxed
383-
traverse(tree.rhs)
380+
case tree: DefDef =>
381+
if isExcluded(tree.symbol) then
382+
return
383+
tree.tpt match
384+
case tpt: TypeTree if tree.symbol.allOverriddenSymbols.hasNext =>
385+
transformTT(tpt, boxed = false, exact = true)
386+
//println(i"TYPE of ${tree.symbol.showLocated} = ${tpt.knownType}")
387+
case _ =>
388+
traverseChildren(tree)
389+
case tree @ ValDef(_, tpt: TypeTree, _) =>
390+
val isVar = tree.symbol.is(Mutable)
391+
val overrides = tree.symbol.allOverriddenSymbols.hasNext
392+
//if overrides then println(i"transforming overriding ${tree.symbol}")
393+
if isVar || overrides then
394+
transformTT(tpt,
395+
boxed = isVar, // types of mutable variables are boxed
396+
exact = overrides // types of symbols that override a parent don't get a capture set
397+
)
398+
traverseChildren(tree)
384399
case tree @ TypeApply(fn, args) =>
385400
traverse(fn)
386401
for case arg: TypeTree <- args do
387-
transformTT(arg, boxed = true) // type arguments in type applications are boxed
402+
transformTT(arg, boxed = true, exact = false) // type arguments in type applications are boxed
388403
case _ =>
389404
traverseChildren(tree)
390405
tree match
391406
case tree: TypeTree =>
392-
transformTT(tree, boxed = false) // other types are not boxed
407+
transformTT(tree, boxed = false, exact = false) // other types are not boxed
393408
case tree: ValOrDefDef =>
394409
val sym = tree.symbol
395410

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import caps.*
2+
3+
abstract class Foo:
4+
def foo: () => Unit = () => ()
5+
def bar: String = ""
6+
7+
class Bar extends Foo:
8+
override def foo = () => println("bar")
9+
override def bar = "bar"
10+
override def toString = bar
11+
12+
class Baz extends Bar:
13+
override def foo = () => println("baz")
14+
override def bar = "baz"
15+
//override def toString = bar
16+
17+
abstract class Message:
18+
protected def msg: String
19+
override def toString = msg
20+
21+
abstract class SyntaxMsg extends Message
22+
23+
class CyclicInheritance extends SyntaxMsg:
24+
def msg = "cyclic"
25+
26+

0 commit comments

Comments
 (0)