@@ -93,15 +93,21 @@ trait CaptureRef extends TypeProxy, ValueType:
9393 final def invalidateCaches () =
9494 myCaptureSetRunId = NoRunId
9595
96- /** x subsumes x
97- * this subsumes this.f
96+ /** x subsumes x
97+ * x subsumes x.f
98+ * x =:= y ==> x subsumes y
9899 * x subsumes y ==> x* subsumes y, x subsumes y?
99100 * x subsumes y ==> x* subsumes y*, x? subsumes y?
100101 * x: x1.type /\ x1 subsumes y ==> x subsumes y
101- * TODO: Document path cases
102+ * X = CapSet^cx, exists rx in cx, rx subsumes y ==> X subsumes y
103+ * Y = CapSet^cy, forall ry in cy, x subsumes ry ==> x subsumes Y
104+ * X: CapSet^c1...CapSet^c2, (CapSet^c1) subsumes y ==> X subsumes y
105+ * Y: CapSet^c1...CapSet^c2, x subsumes (CapSet^c2) ==> x subsumes Y
106+ * Contains[X, y] ==> X subsumes y
107+ *
108+ * TODO: Document cases with more comments.
102109 */
103- // import reporting.trace
104- final def subsumes (y : CaptureRef )(using Context ): Boolean = // trace.force(i"subsumes $this, $y"):
110+ final def subsumes (y : CaptureRef )(using Context ): Boolean =
105111
106112 def subsumingRefs (x : Type , y : Type ): Boolean = x match
107113 case x : CaptureRef => y match
@@ -136,11 +142,13 @@ trait CaptureRef extends TypeProxy, ValueType:
136142 case _ => false
137143 || viaInfo(y.info)(subsumingRefs(this , _))
138144 case MaybeCapability (y1) => this .stripMaybe.subsumes(y1)
139- case y : TypeRef if y.symbol.info. derivesFrom(defn.Caps_CapSet ) =>
145+ case y : TypeRef if y.derivesFrom(defn.Caps_CapSet ) =>
140146 y.info match
141- case _ : TypeAlias => y.captureSetOfInfo.elems.forall(this .subsumes)
142147 case TypeBounds (_, hi : CaptureRef ) => this .subsumes(hi)
143148 case _ => y.captureSetOfInfo.elems.forall(this .subsumes)
149+ case AnnotatedType (parent, ann)
150+ if ann.symbol.isRetains && parent.derivesFrom(defn.Caps_CapSet ) =>
151+ ann.tree.toCaptureSet.elems.forall(this .subsumes)
144152 case _ => false
145153 || this .match
146154 case ReachCapability (x1) => x1.subsumes(y.stripReach)
@@ -149,8 +157,6 @@ trait CaptureRef extends TypeProxy, ValueType:
149157 case x : TypeRef if assumedContainsOf(x).contains(y) => true
150158 case x : TypeRef if x.derivesFrom(defn.Caps_CapSet ) =>
151159 x.info match
152- case _ : TypeAlias =>
153- x.captureSetOfInfo.elems.exists(_.subsumes(y))
154160 case TypeBounds (lo : CaptureRef , _) =>
155161 lo.subsumes(y)
156162 case _ =>
0 commit comments