about summary refs log tree commit diff
path: root/src/libsyntax_pos
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2019-11-14 14:01:03 -0500
committerMark Rousskov <mark.simulacrum@gmail.com>2019-11-15 08:21:23 -0500
commite1a87ca17a60aadae36b6785b7204610e02ee994 (patch)
tree6331018f4507c9ba07abb79251aeeb40e6171f56 /src/libsyntax_pos
parent82cf3a4486bc882207a09bf0d9e2dea4632781aa (diff)
downloadrust-e1a87ca17a60aadae36b6785b7204610e02ee994.tar.gz
rust-e1a87ca17a60aadae36b6785b7204610e02ee994.zip
Move FatalError to syntax_pos
This is a bit unfortunate, but code needs to be able to fatally error
early on (in particular, syntax_pos after we move SourceMap there). It's
also a tiny bit of code, which means it's ultimately not that bad.
Diffstat (limited to 'src/libsyntax_pos')
-rw-r--r--src/libsyntax_pos/fatal_error.rs30
-rw-r--r--src/libsyntax_pos/lib.rs1
2 files changed, 31 insertions, 0 deletions
diff --git a/src/libsyntax_pos/fatal_error.rs b/src/libsyntax_pos/fatal_error.rs
new file mode 100644
index 00000000000..cf7c677d59d
--- /dev/null
+++ b/src/libsyntax_pos/fatal_error.rs
@@ -0,0 +1,30 @@
+/// Used as a return value to signify a fatal error occurred. (It is also
+/// used as the argument to panic at the moment, but that will eventually
+/// not be true.)
+#[derive(Copy, Clone, Debug)]
+#[must_use]
+pub struct FatalError;
+
+pub struct FatalErrorMarker;
+
+// Don't implement Send on FatalError. This makes it impossible to panic!(FatalError).
+// We don't want to invoke the panic handler and print a backtrace for fatal errors.
+impl !Send for FatalError {}
+
+impl FatalError {
+    pub fn raise(self) -> ! {
+        std::panic::resume_unwind(Box::new(FatalErrorMarker))
+    }
+}
+
+impl std::fmt::Display for FatalError {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "parser fatal error")
+    }
+}
+
+impl std::error::Error for FatalError {
+    fn description(&self) -> &str {
+        "The parser has encountered a fatal error"
+    }
+}
diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs
index a762d8af49a..50839638bb4 100644
--- a/src/libsyntax_pos/lib.rs
+++ b/src/libsyntax_pos/lib.rs
@@ -29,6 +29,7 @@ pub mod symbol;
 pub use symbol::{Symbol, sym};
 
 mod analyze_source_file;
+pub mod fatal_error;
 
 use rustc_data_structures::stable_hasher::StableHasher;
 use rustc_data_structures::sync::{Lrc, Lock};