Skip to content

Commit 5699738

Browse files
authored
Merge pull request #7430 from dotty-staging/fix-#7425
Fix #7425: Handle nullary/parameterless conflicts in infoMeet
2 parents 0bf296e + 2e76778 commit 5699738

File tree

3 files changed

+81
-7
lines changed

3 files changed

+81
-7
lines changed

compiler/src/dotty/tools/dotc/core/Denotations.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -653,15 +653,18 @@ object Denotations {
653653
case ExprType(rtp1) =>
654654
tp2 match {
655655
case ExprType(rtp2) => ExprType(rtp1 & rtp2)
656-
case _ => rtp1 & tp2
656+
case _ => infoMeet(rtp1, tp2, sym1, sym2, safeIntersection)
657657
}
658658
case _ =>
659-
try tp1 & tp2.widenExpr
660-
catch {
661-
case ex: Throwable =>
662-
println(i"error for meet: $tp1 &&& $tp2, ${tp1.getClass}, ${tp2.getClass}")
663-
throw ex
664-
}
659+
tp2 match
660+
case _: MethodType | _: PolyType =>
661+
mergeConflict(sym1, sym2, tp1, tp2)
662+
case _ =>
663+
try tp1 & tp2.widenExpr
664+
catch
665+
case ex: Throwable =>
666+
println(i"error for meet: $tp1 &&& $tp2, ${tp1.getClass}, ${tp2.getClass}")
667+
throw ex
665668
}
666669

667670
/** Normally, `tp1 | tp2`.

tests/neg/i7425.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class C { def f: Int = 0 }
2+
3+
trait D { def f(): Int = 0 }
4+
5+
def foo1(x: C & D) = x.f // error: method f must be called with () argument
6+
def foo2(x: C | D) = x.f // error: value f is not a member of C | D
7+
def foo3(x: D & C) = x.f // ok
8+
def foo4(x: D | C) = x.f // error: value f is not a member of D | C
9+
def foo5(x: C & D) = x.f() // ok
10+
def foo6(x: C | D) = x.f() // error: value f is not a member of C | D
11+
def foo7(x: D & C) = x.f() // error: method f in class C does not take parameters
12+
def foo8(x: D | C) = x.f() // error: value f is not a member of D | C

tests/pos/i7175.scala

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
object foo {
2+
def main(args: Array[String]): Unit = println("Dotty")
3+
4+
import java.net.URL
5+
import java.util.List
6+
7+
trait ConfigOrigin {
8+
def description: String
9+
def filename: String
10+
def url: URL
11+
def resource: String
12+
def lineNumber: Int
13+
def comments: List[String]
14+
def withComments(comments: List[String]): ConfigOrigin
15+
def withLineNumber(lineNumber: Int): ConfigOrigin
16+
}
17+
18+
19+
trait ConfigValue extends ConfigMergeable {
20+
def origin: ConfigOrigin
21+
//def valueType: ConfigValueType
22+
def unwrapped: AnyRef
23+
def render: String
24+
//def render(options: ConfigRenderOptions): String
25+
override def withFallback(other: ConfigMergeable): ConfigValue
26+
//def atPath(path: String): Config
27+
//def atKey(key: String): Config
28+
def withOrigin(origin: ConfigOrigin): ConfigValue
29+
}
30+
31+
32+
trait ConfigMergeable {
33+
def withFallback(other: ConfigMergeable): ConfigMergeable
34+
}
35+
36+
trait MergeableValue extends ConfigMergeable {
37+
def toFallbackValue(): ConfigValue
38+
}
39+
40+
// no impl
41+
final class SimpleConfigOrigin extends ConfigOrigin {
42+
def comments: java.util.List[String] = ???
43+
def description: String = ???
44+
def filename: String = ???
45+
def lineNumber: Int = ???
46+
def resource: String = ???
47+
def url: java.net.URL = ???
48+
def withComments(comments: java.util.List[String]): foo.ConfigOrigin = ???
49+
def withLineNumber(lineNumber: Int): foo.ConfigOrigin = ???
50+
}
51+
52+
abstract class AbstractConfigValue (val _origin: ConfigOrigin)
53+
extends ConfigValue
54+
with MergeableValue {
55+
56+
override def origin: SimpleConfigOrigin =
57+
this._origin.asInstanceOf[SimpleConfigOrigin]
58+
}
59+
}

0 commit comments

Comments
 (0)