Skip to content

Commit 5bd21c7

Browse files
committed
Fix joinClassifiers
1 parent 2c0d755 commit 5bd21c7

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -781,13 +781,16 @@ object Capabilities:
781781

782782
def joinClassifiers(cs1: Classifiers, cs2: Classifiers)(using Context): Classifiers =
783783
// Drop classes that subclass classes of the other set
784-
def filterSub(cs1: List[ClassSymbol], cs2: List[ClassSymbol]) =
785-
cs1.filter(cls1 => !cs2.exists(cls2 => cls1.isSubClass(cls2)))
784+
// @param proper If true, only drop proper subclasses of a class of the other set
785+
def filterSub(cs1: List[ClassSymbol], cs2: List[ClassSymbol], proper: Boolean) =
786+
cs1.filter: cls1 =>
787+
!cs2.exists: cls2 =>
788+
cls1.isSubClass(cls2) && (!proper || cls1 != cls2)
786789
(cs1, cs2) match
787790
case (Unclassified, _) | (_, Unclassified) => Unclassified
788791
case (UnknownClassifier, _) | (_, UnknownClassifier) => UnknownClassifier
789792
case (ClassifiedAs(cs1), ClassifiedAs(cs2)) =>
790-
ClassifiedAs(filterSub(cs1, cs2) ++ filterSub(cs2, cs1))
793+
ClassifiedAs(filterSub(cs1, cs2, proper = true) ++ filterSub(cs2, cs1, proper = false))
791794

792795
/** The place of - and cause for - creating a fresh capability. Used for
793796
* error diagnostics
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import caps.{cap, Classifier, Capability}
2+
3+
trait Read extends Capability, Classifier
4+
trait Write extends Capability, Classifier
5+
6+
trait A extends Read
7+
trait B extends Write
8+
9+
def weird(f: () ->{cap.only[Read]} Unit) = ???
10+
11+
def test(x: A^, y: B^) =
12+
val g = () => println(x)
13+
weird(g) // ok
14+
val h = () => println(y)
15+
weird(h) // error
16+
val k = () => { println(x); println(y) }
17+
weird(k) // error

0 commit comments

Comments
 (0)