diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-02-25 15:42:55 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-02-25 15:42:55 +1000 |
commit | 8a332d9e66ac2aa517b4eda33ff3a39159110fa0 (patch) | |
tree | f18e6282d58e85e503a06c4660f92168ab425d0f | |
parent | dff479907919f59f35c4efa75e46950d8a239b5b (diff) | |
download | scala-8a332d9e66ac2aa517b4eda33ff3a39159110fa0.tar.gz scala-8a332d9e66ac2aa517b4eda33ff3a39159110fa0.tar.bz2 scala-8a332d9e66ac2aa517b4eda33ff3a39159110fa0.zip |
SI-9170 Fix resident compilation / specialization NPE
The resident compiler does its best to clean the decks at
the conclusion of a compilation batch.
One part of this is as follows: if the run was erroneous,
reset the info of top level symbols defined in this run
to the initial state, that is, to a `SourceFileLoader`.
However, if the errors came late in the compilation pipeline,
the map from symbols to the source files includes the results
of the specialization transformation, which ends up with
mappings like `Function1$sp... -> null`.
This results in a `NullPointerException` on subsequent runs.
This commits filters out null source files during the reset
process.
-rw-r--r-- | src/compiler/scala/tools/nsc/Global.scala | 3 | ||||
-rw-r--r-- | test/files/res/t9170.check | 7 | ||||
-rw-r--r-- | test/files/res/t9170.res | 2 | ||||
-rw-r--r-- | test/files/res/t9170/A.scala | 4 |
4 files changed, 15 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index 1c9dbad4dd..b233acf271 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -1551,7 +1551,8 @@ class Global(var currentSettings: Settings, var reporter: Reporter) if (reporter.hasErrors) { for ((sym, file) <- symSource.iterator) { - sym.reset(new loaders.SourcefileLoader(file)) + if (file != null) + sym.reset(new loaders.SourcefileLoader(file)) if (sym.isTerm) sym.moduleClass reset loaders.moduleClassLoader } diff --git a/test/files/res/t9170.check b/test/files/res/t9170.check new file mode 100644 index 0000000000..6d40b6ba8d --- /dev/null +++ b/test/files/res/t9170.check @@ -0,0 +1,7 @@ + +nsc> t9170/A.scala:3: error: double definition: +def f[A](a: => A): Int at line 2 and +def f[A](a: => Either[Exception,A]): Int at line 3 +have same type after erasure: (a: Function0)Int + def f[A](a: => Either[Exception, A]) = 2 + ^ diff --git a/test/files/res/t9170.res b/test/files/res/t9170.res new file mode 100644 index 0000000000..c2aec2f8dd --- /dev/null +++ b/test/files/res/t9170.res @@ -0,0 +1,2 @@ +t9170/A.scala +t9170/A.scala diff --git a/test/files/res/t9170/A.scala b/test/files/res/t9170/A.scala new file mode 100644 index 0000000000..239df89679 --- /dev/null +++ b/test/files/res/t9170/A.scala @@ -0,0 +1,4 @@ +object Y { + def f[A](a: => A) = 1 + def f[A](a: => Either[Exception, A]) = 2 +} |