diff --git a/bin/unit-tests.hs b/bin/unit-tests.hs
--- a/bin/unit-tests.hs
+++ b/bin/unit-tests.hs
@@ -19,7 +19,6 @@
 {-# LANGUAGE Safe #-}
 
 import Base.CompileError
-import Compilation.CompileInfo
 import Test.Common
 import qualified Test.DefinedCategory as DefinedCategoryTest
 import qualified Test.IntegrationTest as IntegrationTestTest
diff --git a/lib/file/.zeolite-module b/lib/file/.zeolite-module
--- a/lib/file/.zeolite-module
+++ b/lib/file/.zeolite-module
@@ -1,1 +1,1 @@
-RecompileMetadata {rmRoot = "..", rmPath = "file", rmPublicDeps = ["../util"], rmPrivateDeps = [], rmExtraFiles = ["file/Category_RawFileReader.cpp","file/Category_RawFileWriter.cpp"], rmExtraPaths = [], rmExtraRequires = [], rmMode = CompileUnspecified, rmOutputName = ""}
+RecompileMetadata {rmRoot = "..", rmPath = "file", rmPublicDeps = ["../util"], rmPrivateDeps = [], rmExtraFiles = ["file/Category_RawFileReader.cpp","file/Category_RawFileWriter.cpp"], rmExtraPaths = [], rmExtraRequires = [], rmMode = CompileIncremental, rmOutputName = ""}
diff --git a/src/Parser/Procedure.hs b/src/Parser/Procedure.hs
--- a/src/Parser/Procedure.hs
+++ b/src/Parser/Procedure.hs
@@ -236,7 +236,9 @@
       p <- between (sepAfter $ string "{") (sepAfter $ string "}") sourceParser
       cl <- fmap Just parseCleanup <|> return Nothing
       kwIn
-      s <- unconditional <|> sourceParser
+      -- TODO: If there's a parse error in an otherwise-valid {} then the actual
+      -- error might look like a multi-assignment issue.
+      s <- try unconditional <|> sourceParser
       return $ ScopedBlock [c] p cl s
     justCleanup = do
       c <- getPosition
diff --git a/src/Test/Common.hs b/src/Test/Common.hs
--- a/src/Test/Common.hs
+++ b/src/Test/Common.hs
@@ -39,8 +39,10 @@
   showParams,
 ) where
 
+import Control.Monad (when)
 import Data.Either
 import Data.List
+import System.Exit
 import System.FilePath
 import System.IO
 import Text.Parsec
@@ -63,6 +65,7 @@
   mapM_ (\(n,e) -> hPutStr stderr ("Test " ++ show n ++ ": " ++ show e ++ "\n")) es
   hPutStr stderr $ show (length ps) ++ " tests passed + " ++
                    show (length es) ++ " tests failed\n"
+  when (not $ null es) exitFailure
 
 numberError :: a -> CompileInfo b -> Either (a,CompileMessage) b
 numberError n c
diff --git a/zeolite-lang.cabal b/zeolite-lang.cabal
--- a/zeolite-lang.cabal
+++ b/zeolite-lang.cabal
@@ -1,5 +1,5 @@
 name:                zeolite-lang
-version:             0.1.2.1
+version:             0.1.2.2
 synopsis:            Zeolite is a statically-typed, general-purpose programming language.
 
 description:
