summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-02-22 12:21:11 +0100
committerJason Zaugg <jzaugg@gmail.com>2014-02-22 12:21:11 +0100
commit63d4dfaf7cf25f2cf5c00c97986d3d060733268f (patch)
tree17c4b8a833e6945a13cb1bf158319d5c7cd2d6a2
parent00624a39ed84c3fd245dd9df7454d4cec4399e13 (diff)
parent64ed64ed5c2f64ee83a7963273bedf490926050e (diff)
downloadscala-63d4dfaf7cf25f2cf5c00c97986d3d060733268f.tar.gz
scala-63d4dfaf7cf25f2cf5c00c97986d3d060733268f.tar.bz2
scala-63d4dfaf7cf25f2cf5c00c97986d3d060733268f.zip
Merge pull request #3567 from retronym/ticket/8315
SI-8315 Fix crash in dead code elimination
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala4
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala2
-rw-r--r--test/files/pos/t8315.flags1
-rw-r--r--test/files/pos/t8315.scala12
-rw-r--r--test/files/pos/t8315b.flags1
-rw-r--r--test/files/pos/t8315b.scala11
6 files changed, 28 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 03b76ed99e..6b14461cac 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -1798,10 +1798,8 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
private def writeICode() {
val printer = new icodes.TextPrinter(null, icodes.linearizer)
icodes.classes.values.foreach((cls) => {
- val suffix = if (cls.symbol.hasModuleFlag) "$.icode" else ".icode"
+ val suffix = s"${if (cls.symbol.hasModuleFlag) "$" else ""}_${phase}.icode"
val file = getFile(cls.symbol, suffix)
-// if (file.exists())
-// file = new File(file.getParentFile(), file.getName() + "1")
try {
val stream = new FileOutputStream(file)
printer.setWriter(new PrintWriter(stream, true))
diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
index 0f317422ac..b39fee65bb 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
@@ -95,8 +95,10 @@ abstract class DeadCodeElimination extends SubComponent {
localStores.clear()
clobbers.clear()
m.code.blocks.clear()
+ m.code.touched = true
accessedLocals = m.params.reverse
m.code.blocks ++= linearizer.linearize(m)
+ m.code.touched = true
collectRDef(m)
mark()
sweep(m)
diff --git a/test/files/pos/t8315.flags b/test/files/pos/t8315.flags
new file mode 100644
index 0000000000..c926ad6493
--- /dev/null
+++ b/test/files/pos/t8315.flags
@@ -0,0 +1 @@
+-Yinline -Ydead-code
diff --git a/test/files/pos/t8315.scala b/test/files/pos/t8315.scala
new file mode 100644
index 0000000000..2f7742ed67
--- /dev/null
+++ b/test/files/pos/t8315.scala
@@ -0,0 +1,12 @@
+object Test {
+ def crash(as: Listt): Unit = {
+ map(as, (_: Any) => return)
+ }
+
+ final def map(x: Listt, f: Any => Any): Any = {
+ if (x eq Nill) "" else f("")
+ }
+}
+
+object Nill extends Listt
+class Listt
diff --git a/test/files/pos/t8315b.flags b/test/files/pos/t8315b.flags
new file mode 100644
index 0000000000..c926ad6493
--- /dev/null
+++ b/test/files/pos/t8315b.flags
@@ -0,0 +1 @@
+-Yinline -Ydead-code
diff --git a/test/files/pos/t8315b.scala b/test/files/pos/t8315b.scala
new file mode 100644
index 0000000000..d7a2bf565f
--- /dev/null
+++ b/test/files/pos/t8315b.scala
@@ -0,0 +1,11 @@
+object Test extends Object {
+ def crash: Unit = {
+ val key = ""
+ try map(new F(key))
+ catch { case _: Throwable => }
+ };
+ final def map(f: F): Any = f.apply("");
+};
+final class F(key: String) {
+ final def apply(a: Any): Any = throw new RuntimeException(key);
+}