@@ -2020,12 +2020,10 @@ class Namer { typer: Typer =>
20202020 lazy val isRefInSignatures =
20212021 psym.maybeOwner.isPrimaryConstructor
20222022 && isReferencedInPublicSignatures(psym)
2023+ lazy val needsTrackedSimp = needsTrackedSimple(psym, param, owningSym)
20232024 ! psym.is(Tracked )
20242025 && psym.isTerm
2025- && (
2026- abstractContextBound
2027- || isRefInSignatures
2028- )
2026+ && needsTrackedSimp
20292027
20302028 /** Under x.modularity, we add `tracked` to context bound witnesses and
20312029 * explicit evidence parameters that have abstract type members
@@ -2036,6 +2034,13 @@ class Namer { typer: Typer =>
20362034 && (param.hasAttachment(ContextBoundParam ) || (psym.isOneOf(GivenOrImplicit ) && ! accessorSyms.forall(_.isOneOf(PrivateLocal ))))
20372035 && psym.info.memberNames(abstractTypeNameFilter).nonEmpty
20382036
2037+ private def needsTrackedSimple (psym : Symbol , param : ValDef , owningSym : Symbol )(using Context ): Boolean =
2038+ val accessorSyms = maybeParamAccessors(owningSym, psym)
2039+ (owningSym.isClass || owningSym.isAllOf(Given | Method ))
2040+ && ! accessorSyms.exists(_.is(Mutable ))
2041+ && (param.hasAttachment(ContextBoundParam ) || ! accessorSyms.forall(_.isOneOf(PrivateLocal )))
2042+ && psym.info.memberNames(abstractTypeNameFilter).nonEmpty
2043+
20392044 extension (sym : Symbol )
20402045 private def infoWithForceNonInferingCompleter (using Context ): Type = sym.infoOrCompleter match
20412046 case tpe : LazyType if tpe.isExplicit => sym.info
@@ -2083,8 +2088,7 @@ class Namer { typer: Typer =>
20832088 def setTrackedConstrParam (param : ValDef )(using Context ): Unit =
20842089 val sym = symbolOfTree(param)
20852090 sym.maybeOwner.maybeOwner.infoOrCompleter match
2086- case info : ClassInfo
2087- if ! sym.is(Tracked ) && isContextBoundWitnessWithAbstractMembers(sym, param, sym.maybeOwner.maybeOwner) =>
2091+ case info : ClassInfo if needsTracked(sym, param, sym.maybeOwner.maybeOwner) =>
20882092 typr.println(i " set tracked $param, $sym: ${sym.info} containing ${sym.info.memberNames(abstractTypeNameFilter).toList}" )
20892093 setParamTrackedWithAccessors(sym, info)
20902094 case _ =>
0 commit comments