# UNDF: UNDF-2026-000000270 diff --git a/src/compiler/scala/tools/nsc/typechecker/Checkable.scala b/src/compiler/scala/tools/nsc/typechecker/Checkable.scala index abcdef00..cwe407fix 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Checkable.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Checkable.scala @@ -98,7 +98,11 @@ trait Checkable { def propagateKnownTypes(from: Type, to: Symbol): Type = { def tparams = to.typeParams val tvars = tparams map (p => TypeVar(p)) val tvarType = appliedType(to, tvars) + // CWE-407 fix: convert to.baseClasses to a Set before the outer foreach. + // Previously: from.baseClasses foreach { bc => if (to.baseClasses.contains(bc)) + // was O(M×N) where M=|from.baseClasses|, N=|to.baseClasses| — both are List[Symbol]. + // Symbol equality is reference identity so Set[Symbol] is O(1) contains. + val toBaseSet = to.baseClasses.toSet - from.baseClasses foreach { bc => if (to.baseClasses.contains(bc)){ + from.baseClasses foreach { bc => if (toBaseSet.contains(bc)){ val tps1 = (from baseType bc).typeArgs val tps2 = (tvarType baseType bc).typeArgs