aboutsummaryrefslogtreecommitdiff
path: root/tests/run/t7214.scala
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2015-08-04 11:18:41 -0700
committerodersky <odersky@gmail.com>2015-08-04 11:18:41 -0700
commit07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b (patch)
treecc81897dd66a0353587ff83e297bfff3bac7c7d5 /tests/run/t7214.scala
parent056e1246c9dc365bd37627923b999a80a57ca0f9 (diff)
parentd5280358d12c43c3268653c95c7edf3dcc7d60bf (diff)
downloaddotty-07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b.tar.gz
dotty-07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b.tar.bz2
dotty-07e24e8640acf19a6bcedd1b68acbd7c8d8bf29b.zip
Merge pull request #735 from dotty-staging/ycheck-methods
Ycheck that methods defined in ClassInfo exist in tree.
Diffstat (limited to 'tests/run/t7214.scala')
-rw-r--r--tests/run/t7214.scala57
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/run/t7214.scala b/tests/run/t7214.scala
new file mode 100644
index 000000000..d73fe6dd5
--- /dev/null
+++ b/tests/run/t7214.scala
@@ -0,0 +1,57 @@
+// pattern matcher crashes here trying to synthesize an uneeded outer test.
+// no-symbol does not have an owner
+// at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:49)
+// at scala.tools.nsc.Global.abort(Global.scala:253)
+// at scala.reflect.internal.Symbols$NoSymbol.owner(Symbols.scala:3248)
+// at scala.reflect.internal.Symbols$Symbol.effectiveOwner(Symbols.scala:678)
+// at scala.reflect.internal.Symbols$Symbol.isDefinedInPackage(Symbols.scala:664)
+// at scala.reflect.internal.TreeGen.mkAttributedSelect(TreeGen.scala:188)
+// at scala.reflect.internal.TreeGen.mkAttributedRef(TreeGen.scala:124)
+// at scala.tools.nsc.ast.TreeDSL$CODE$.REF(TreeDSL.scala:308)
+// at scala.tools.nsc.typechecker.PatternMatching$TreeMakers$TypeTestTreeMaker$treeCondStrategy$.outerTest(PatternMatching.scala:1209)
+class Crash {
+ type Alias = C#T
+
+ val c = new C
+ val t = new c.T
+
+ // Crash via a Typed Pattern...
+ (t: Any) match {
+ case e: Alias =>
+ }
+
+ // ... or via a Typed Extractor Pattern.
+ object Extractor {
+ def unapply(a: Alias): Option[Any] = None
+ }
+ (t: Any) match {
+ case Extractor(_) =>
+ case _ =>
+ }
+
+ // checking that correct outer tests are applied when
+ // aliases for path dependent types are involved.
+ val c2 = new C
+ type CdotT = c.T
+ type C2dotT = c2.T
+
+ val outerField = t.getClass.getDeclaredFields.find(_.getName contains ("outer")).get
+ outerField.setAccessible(true)
+
+ (t: Any) match {
+ case _: C2dotT =>
+ println(s"!!! wrong match. t.outer=${outerField.get(t)} / c2 = $c2") // this matches on 2.10.0
+ case _: CdotT =>
+ case _ =>
+ println(s"!!! wrong match. t.outer=${outerField.get(t)} / c = $c")
+ }
+}
+
+class C {
+ class T
+}
+
+object Test extends dotty.runtime.LegacyApp {
+ new Crash
+}
+