aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliu fengyun <liu@fengy.me>2016-10-14 12:01:13 +0200
committerliu fengyun <liu@fengy.me>2016-10-14 17:11:42 +0200
commitcbe2ab26d3b507a33f1b910a803878d78f751f74 (patch)
tree350e2fa199ebda8c2b94a22ec2b9d20aa9704c91
parent8bfaadaae141e83db7f515b042fcee26ed0e54fd (diff)
downloaddotty-cbe2ab26d3b507a33f1b910a803878d78f751f74.tar.gz
dotty-cbe2ab26d3b507a33f1b910a803878d78f751f74.tar.bz2
dotty-cbe2ab26d3b507a33f1b910a803878d78f751f74.zip
fix #1540: overloaded get and isDefined in option-less patmat
-rw-r--r--src/dotty/tools/dotc/transform/PatternMatcher.scala22
-rw-r--r--tests/pos/i1540.scala14
2 files changed, 27 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/transform/PatternMatcher.scala b/src/dotty/tools/dotc/transform/PatternMatcher.scala
index 49c0eabec..9e6c6412a 100644
--- a/src/dotty/tools/dotc/transform/PatternMatcher.scala
+++ b/src/dotty/tools/dotc/transform/PatternMatcher.scala
@@ -240,17 +240,21 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {
val isDefined = extractorMemberType(prev.tpe, nme.isDefined)
if ((isDefined isRef defn.BooleanClass) && getTp.exists) {
- val tmpSym = freshSym(prev.pos, prev.tpe, "o")
- val prevValue = ref(tmpSym).select("get".toTermName).ensureApplied
+ // isDefined and get maybe overloaded
+ val getDenot = prev.tpe.member(nme.get).suchThat(_.info.isParameterless)
+ val isDefinedDenot = prev.tpe.member(nme.isDefined).suchThat(_.info.isParameterless)
- Block(
- List(ValDef(tmpSym, prev)),
- // must be isEmpty and get as we don't control the target of the call (prev is an extractor call)
- ifThenElseZero(
- ref(tmpSym).select(nme.isDefined),
- Block(List(ValDef(b.asTerm, prevValue)), next)
- )
+ val tmpSym = freshSym(prev.pos, prev.tpe, "o")
+ val prevValue = ref(tmpSym).select(getDenot.symbol).ensureApplied
+
+ Block(
+ List(ValDef(tmpSym, prev)),
+ // must be isEmpty and get as we don't control the target of the call (prev is an extractor call)
+ ifThenElseZero(
+ ref(tmpSym).select(isDefinedDenot.symbol),
+ Block(List(ValDef(b.asTerm, prevValue)), next)
)
+ )
} else {
assert(defn.isProductSubType(prev.tpe))
val nullCheck: Tree = prev.select(defn.Object_ne).appliedTo(Literal(Constant(null)))
diff --git a/tests/pos/i1540.scala b/tests/pos/i1540.scala
new file mode 100644
index 000000000..7aa24f459
--- /dev/null
+++ b/tests/pos/i1540.scala
@@ -0,0 +1,14 @@
+class Casey1(val a: Int) {
+ def isDefined: Boolean = true
+ def isDefined(x: Int): Boolean = ???
+ def get: Int = a
+ def get(x: Int): String = ???
+}
+object Casey1 { def unapply(a: Casey1) = a }
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ val c @ Casey1(x) = new Casey1(0)
+ assert(x == c.get)
+ }
+}