Skip to content

Commit 9ff1af7

Browse files
committed
Also infer a precise type when tracked is not inherited
1 parent 4133b83 commit 9ff1af7

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,6 +2016,11 @@ class Namer { typer: Typer =>
20162016
paramFn: Type => Type,
20172017
fallbackProto: Type
20182018
)(using Context): Type =
2019+
/** Is this member tracked? This is true if it is marked as `tracked` or if
2020+
* it overrides a `tracked` member. To account for the later, `isTracked`
2021+
* is overriden to `true` as a side-effect of computing `inherited`.
2022+
*/
2023+
var isTracked: Boolean = sym.is(Tracked)
20192024

20202025
/** A type for this definition that might be inherited from elsewhere:
20212026
* If this is a setter parameter, the corresponding getter type.
@@ -2053,15 +2058,12 @@ class Namer { typer: Typer =>
20532058

20542059
val iDenot = cls.info.nonPrivateDecl(sym.name).matchingDenotation(site, schema, sym.targetName)
20552060
val iSym = iDenot.symbol
2061+
if iSym.is(Tracked) then isTracked = true
20562062
val iRawInfo = iDenot.info
20572063
val iResType = instantiatedResType(iRawInfo, paramss).asSeenFrom(site, cls)
2058-
if iSym.is(Tracked) && !mdef.rhs.isEmpty then
2059-
// When inherting a tracked member, we infer a precise type from the rhs
2060-
tp & typedAheadExpr(mdef.rhs, iResType).tpe
2061-
else
2062-
if (iResType.exists)
2063-
typr.println(i"using inherited type for ${mdef.name}; raw: $iRawInfo, inherited: $iResType")
2064-
tp & iResType
2064+
if (iResType.exists)
2065+
typr.println(i"using inherited type for ${mdef.name}; raw: $iRawInfo, inherited: $iResType")
2066+
tp & iResType
20652067
}
20662068
end inherited
20672069

@@ -2146,6 +2148,7 @@ class Namer { typer: Typer =>
21462148
if defaultTp.exists then TypeOps.SimplifyKeepUnchecked() else null)
21472149
match
21482150
case ctp: ConstantType if sym.isInlineVal => ctp
2151+
case tp if isTracked => tp
21492152
case tp => TypeComparer.widenInferred(tp, pt, Widen.Unions)
21502153

21512154
// Replace aliases to Unit by Unit itself. If we leave the alias in
@@ -2156,7 +2159,7 @@ class Namer { typer: Typer =>
21562159
def lhsType = fullyDefinedType(cookedRhsType, "right-hand side", mdef.srcPos)
21572160
//if (sym.name.toString == "y") println(i"rhs = $rhsType, cooked = $cookedRhsType")
21582161
if (inherited.exists)
2159-
if sym.isInlineVal then lhsType else inherited
2162+
if sym.isInlineVal || isTracked then lhsType else inherited
21602163
else {
21612164
if (sym.is(Implicit))
21622165
mdef match {

0 commit comments

Comments
 (0)