about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-11-16 02:40:52 +0000
committerbors <bors@rust-lang.org>2019-11-16 02:40:52 +0000
commit1d8b6ce89e0874b5e93c9e41bfdd565c56372bb0 (patch)
tree363c94e009f1ebf5b5b562c34caac92815a497e4
parent82161cda33406ae8dda08b3e4afe97a44b193792 (diff)
parentae9a62633aa0c92f826ffe0d82e9e03b41a66de1 (diff)
downloadrust-1d8b6ce89e0874b5e93c9e41bfdd565c56372bb0.tar.gz
rust-1d8b6ce89e0874b5e93c9e41bfdd565c56372bb0.zip
Auto merge of #66453 - Centril:rollup-w1ohzxs, r=Centril
Rollup of 5 pull requests

Successful merges:

 - #66350 (protect creation of destructors by a mutex)
 - #66407 (Add more tests for fixed ICEs)
 - #66415 (Add --force-run-in-process unstable option to libtest)
 - #66427 (Move the JSON error emitter to librustc_errors)
 - #66441 (libpanic_unwind for Miri: make sure we have the SEH lang items when needed)

Failed merges:

r? @ghost
-rw-r--r--Cargo.lock1
-rw-r--r--src/libpanic_unwind/lib.rs5
-rw-r--r--src/librustc/session/mod.rs2
-rw-r--r--src/librustc_codegen_ssa/back/write.rs5
-rw-r--r--src/librustc_errors/annotate_snippet_emitter_writer.rs11
-rw-r--r--src/librustc_errors/emitter.rs25
-rw-r--r--src/librustc_errors/json.rs (renamed from src/libsyntax/json.rs)20
-rw-r--r--src/librustc_errors/json/tests.rs (renamed from src/libsyntax/json/tests.rs)14
-rw-r--r--src/librustc_errors/lib.rs65
-rw-r--r--src/librustdoc/core.rs2
-rw-r--r--src/libstd/sys/hermit/thread_local.rs3
-rw-r--r--src/libsyntax/lib.rs4
-rw-r--r--src/libsyntax_ext/test_harness.rs3
-rw-r--r--src/libsyntax_pos/Cargo.toml1
-rw-r--r--src/libsyntax_pos/fatal_error.rs30
-rw-r--r--src/libsyntax_pos/lib.rs3
-rw-r--r--src/libsyntax_pos/source_map.rs (renamed from src/libsyntax/source_map.rs)48
-rw-r--r--src/libsyntax_pos/source_map/tests.rs (renamed from src/libsyntax/source_map/tests.rs)0
-rw-r--r--src/libtest/cli.rs4
-rw-r--r--src/libtest/lib.rs2
-rw-r--r--src/libtest/tests.rs1
-rw-r--r--src/test/ui/extern/issue-36122-accessing-externed-dst.rs6
-rw-r--r--src/test/ui/extern/issue-36122-accessing-externed-dst.stderr12
-rw-r--r--src/test/ui/parser/issue-58094-missing-right-square-bracket.rs4
-rw-r--r--src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr16
-rw-r--r--src/test/ui/test-panic-abort-disabled.rs2
-rw-r--r--src/test/ui/test-panic-abort-disabled.stderr2
-rw-r--r--src/test/ui/unboxed-closures/issue-30904.rs36
-rw-r--r--src/test/ui/unboxed-closures/issue-30904.stderr24
-rw-r--r--src/test/ui/unboxed-closures/issue-30906.nll.stderr8
-rw-r--r--src/test/ui/unboxed-closures/issue-30906.rs18
-rw-r--r--src/test/ui/unboxed-closures/issue-30906.stderr12
-rw-r--r--src/tools/compiletest/src/json.rs2
33 files changed, 193 insertions, 198 deletions
diff --git a/Cargo.lock b/Cargo.lock
index bb2bd3c314c..d3bc70c666f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4439,6 +4439,7 @@ version = "0.0.0"
 dependencies = [
  "arena",
  "cfg-if",
+ "log",
  "rustc_data_structures",
  "rustc_index",
  "rustc_macros",
diff --git a/src/libpanic_unwind/lib.rs b/src/libpanic_unwind/lib.rs
index d97a7a8a87d..5f345c2133f 100644
--- a/src/libpanic_unwind/lib.rs
+++ b/src/libpanic_unwind/lib.rs
@@ -39,6 +39,11 @@ cfg_if::cfg_if! {
     if #[cfg(miri)] {
         #[path = "miri.rs"]
         mod imp;
+        // On MSVC we need the SEH lang items as well...
+        // This should match the conditions of the `seh.rs` import below.
+        #[cfg(all(target_env = "msvc", not(target_arch = "aarch64")))]
+        #[allow(unused)]
+        mod seh;
     } else if #[cfg(target_os = "emscripten")] {
         #[path = "emcc.rs"]
         mod imp;
diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs
index a69584cb90a..4fbc8da9cbf 100644
--- a/src/librustc/session/mod.rs
+++ b/src/librustc/session/mod.rs
@@ -22,7 +22,7 @@ use errors::emitter::HumanReadableErrorType;
 use errors::annotate_snippet_emitter_writer::{AnnotateSnippetEmitterWriter};
 use syntax::edition::Edition;
 use syntax::feature_gate::{self, AttributeType};
-use syntax::json::JsonEmitter;
+use errors::json::JsonEmitter;
 use syntax::source_map;
 use syntax::sess::{ParseSess, ProcessCfgMod};
 use syntax::symbol::Symbol;
diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
index ed901fa064a..f35a31d59fe 100644
--- a/src/librustc_codegen_ssa/back/write.rs
+++ b/src/librustc_codegen_ssa/back/write.rs
@@ -23,7 +23,8 @@ use rustc_data_structures::profiling::SelfProfilerRef;
 use rustc_fs_util::link_or_copy;
 use rustc_data_structures::svh::Svh;
 use rustc_data_structures::sync::Lrc;
-use rustc_errors::{Handler, Level, FatalError, DiagnosticId, SourceMapperDyn};
+use rustc_errors::{Handler, Level, FatalError, DiagnosticId};
+use syntax_pos::source_map::SourceMap;
 use rustc_errors::emitter::{Emitter};
 use rustc_target::spec::MergeFunctions;
 use syntax::attr;
@@ -1679,7 +1680,7 @@ impl Emitter for SharedEmitter {
         }
         drop(self.sender.send(SharedEmitterMessage::AbortIfErrors));
     }
-    fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> {
+    fn source_map(&self) -> Option<&Lrc<SourceMap>> {
         None
     }
 }
diff --git a/src/librustc_errors/annotate_snippet_emitter_writer.rs b/src/librustc_errors/annotate_snippet_emitter_writer.rs
index 491bc2aa6a2..4c5d0178b2c 100644
--- a/src/librustc_errors/annotate_snippet_emitter_writer.rs
+++ b/src/librustc_errors/annotate_snippet_emitter_writer.rs
@@ -6,9 +6,10 @@
 //! [annotate_snippets]: https://docs.rs/crate/annotate-snippets/
 
 use syntax_pos::{SourceFile, MultiSpan, Loc};
+use syntax_pos::source_map::SourceMap;
 use crate::{
     Level, CodeSuggestion, Diagnostic, Emitter,
-    SourceMapperDyn, SubDiagnostic, DiagnosticId
+    SubDiagnostic, DiagnosticId
 };
 use crate::emitter::FileWithAnnotatedLines;
 use rustc_data_structures::sync::Lrc;
@@ -20,7 +21,7 @@ use annotate_snippets::formatter::DisplayListFormatter;
 
 /// Generates diagnostics using annotate-snippet
 pub struct AnnotateSnippetEmitterWriter {
-    source_map: Option<Lrc<SourceMapperDyn>>,
+    source_map: Option<Lrc<SourceMap>>,
     /// If true, hides the longer explanation text
     short_message: bool,
     /// If true, will normalize line numbers with `LL` to prevent noise in UI test diffs.
@@ -49,7 +50,7 @@ impl Emitter for AnnotateSnippetEmitterWriter {
                                    &suggestions);
     }
 
-    fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> {
+    fn source_map(&self) -> Option<&Lrc<SourceMap>> {
         self.source_map.as_ref()
     }
 
@@ -61,7 +62,7 @@ impl Emitter for AnnotateSnippetEmitterWriter {
 /// Collects all the data needed to generate the data structures needed for the
 /// `annotate-snippets` library.
 struct DiagnosticConverter<'a> {
-    source_map: Option<Lrc<SourceMapperDyn>>,
+    source_map: Option<Lrc<SourceMap>>,
     level: Level,
     message: String,
     code: Option<DiagnosticId>,
@@ -168,7 +169,7 @@ impl<'a>  DiagnosticConverter<'a> {
 
 impl AnnotateSnippetEmitterWriter {
     pub fn new(
-        source_map: Option<Lrc<SourceMapperDyn>>,
+        source_map: Option<Lrc<SourceMap>>,
         short_message: bool,
         external_macro_backtrace: bool,
     ) -> Self {
diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs
index 291920f17f6..ea779982ba9 100644
--- a/src/librustc_errors/emitter.rs
+++ b/src/librustc_errors/emitter.rs
@@ -10,10 +10,11 @@
 use Destination::*;
 
 use syntax_pos::{SourceFile, Span, MultiSpan};
+use syntax_pos::source_map::SourceMap;
 
 use crate::{
     Level, CodeSuggestion, Diagnostic, SubDiagnostic, pluralize,
-    SuggestionStyle, SourceMapper, SourceMapperDyn, DiagnosticId,
+    SuggestionStyle, DiagnosticId,
 };
 use crate::Level::Error;
 use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, StyledString, Style};
@@ -49,7 +50,7 @@ impl HumanReadableErrorType {
     pub fn new_emitter(
         self,
         dst: Box<dyn Write + Send>,
-        source_map: Option<Lrc<SourceMapperDyn>>,
+        source_map: Option<Lrc<SourceMap>>,
         teach: bool,
         terminal_width: Option<usize>,
         external_macro_backtrace: bool,
@@ -192,7 +193,7 @@ pub trait Emitter {
         true
     }
 
-    fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>>;
+    fn source_map(&self) -> Option<&Lrc<SourceMap>>;
 
     /// Formats the substitutions of the primary_span
     ///
@@ -271,7 +272,7 @@ pub trait Emitter {
     // point directly at <*macros>. Since these are often difficult to read, this
     // will change the span to point at the use site.
     fn fix_multispans_in_std_macros(&self,
-                                    source_map: &Option<Lrc<SourceMapperDyn>>,
+                                    source_map: &Option<Lrc<SourceMap>>,
                                     span: &mut MultiSpan,
                                     children: &mut Vec<SubDiagnostic>,
                                     level: &Level,
@@ -311,7 +312,7 @@ pub trait Emitter {
     // <*macros>. Since these locations are often difficult to read, we move these Spans from
     // <*macros> to their corresponding use site.
     fn fix_multispan_in_std_macros(&self,
-                                   source_map: &Option<Lrc<SourceMapperDyn>>,
+                                   source_map: &Option<Lrc<SourceMap>>,
                                    span: &mut MultiSpan,
                                    always_backtrace: bool) -> bool {
         let sm = match source_map {
@@ -397,7 +398,7 @@ pub trait Emitter {
 }
 
 impl Emitter for EmitterWriter {
-    fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> {
+    fn source_map(&self) -> Option<&Lrc<SourceMap>> {
         self.sm.as_ref()
     }
 
@@ -428,7 +429,7 @@ impl Emitter for EmitterWriter {
 pub struct SilentEmitter;
 
 impl Emitter for SilentEmitter {
-    fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> { None }
+    fn source_map(&self) -> Option<&Lrc<SourceMap>> { None }
     fn emit_diagnostic(&mut self, _: &Diagnostic) {}
 }
 
@@ -476,7 +477,7 @@ impl ColorConfig {
 /// Handles the writing of `HumanReadableErrorType::Default` and `HumanReadableErrorType::Short`
 pub struct EmitterWriter {
     dst: Destination,
-    sm: Option<Lrc<SourceMapperDyn>>,
+    sm: Option<Lrc<SourceMap>>,
     short_message: bool,
     teach: bool,
     ui_testing: bool,
@@ -495,7 +496,7 @@ pub struct FileWithAnnotatedLines {
 impl EmitterWriter {
     pub fn stderr(
         color_config: ColorConfig,
-        source_map: Option<Lrc<SourceMapperDyn>>,
+        source_map: Option<Lrc<SourceMap>>,
         short_message: bool,
         teach: bool,
         terminal_width: Option<usize>,
@@ -515,7 +516,7 @@ impl EmitterWriter {
 
     pub fn new(
         dst: Box<dyn Write + Send>,
-        source_map: Option<Lrc<SourceMapperDyn>>,
+        source_map: Option<Lrc<SourceMap>>,
         short_message: bool,
         teach: bool,
         colored: bool,
@@ -1685,7 +1686,7 @@ impl FileWithAnnotatedLines {
     /// This helps us quickly iterate over the whole message (including secondary file spans)
     pub fn collect_annotations(
         msp: &MultiSpan,
-        source_map: &Option<Lrc<SourceMapperDyn>>
+        source_map: &Option<Lrc<SourceMap>>
     ) -> Vec<FileWithAnnotatedLines> {
         fn add_annotation_to_file(file_vec: &mut Vec<FileWithAnnotatedLines>,
                                   file: Lrc<SourceFile>,
@@ -2067,7 +2068,7 @@ impl<'a> Drop for WritableDst<'a> {
 }
 
 /// Whether the original and suggested code are visually similar enough to warrant extra wording.
-pub fn is_case_difference(sm: &dyn SourceMapper, suggested: &str, sp: Span) -> bool {
+pub fn is_case_difference(sm: &SourceMap, suggested: &str, sp: Span) -> bool {
     // FIXME: this should probably be extended to also account for `FO0` → `FOO` and unicode.
     let found = sm.span_to_snippet(sp).unwrap();
     let ascii_confusables = &['c', 'f', 'i', 'k', 'o', 's', 'u', 'v', 'w', 'x', 'y', 'z'];
diff --git a/src/libsyntax/json.rs b/src/librustc_errors/json.rs
index 0b157938375..ebbd49bd84a 100644
--- a/src/libsyntax/json.rs
+++ b/src/librustc_errors/json.rs
@@ -9,15 +9,15 @@
 
 // FIXME: spec the JSON output properly.
 
-use crate::source_map::{SourceMap, FilePathMapping};
+use syntax_pos::source_map::{SourceMap, FilePathMapping};
 
-use errors::registry::Registry;
-use errors::{SubDiagnostic, CodeSuggestion, SourceMapper, SourceMapperDyn};
-use errors::{DiagnosticId, Applicability};
-use errors::emitter::{Emitter, HumanReadableErrorType};
+use crate::registry::Registry;
+use crate::{SubDiagnostic, CodeSuggestion};
+use crate::{DiagnosticId, Applicability};
+use crate::emitter::{Emitter, HumanReadableErrorType};
 
 use syntax_pos::{MacroBacktrace, Span, SpanLabel, MultiSpan};
-use rustc_data_structures::sync::{self, Lrc};
+use rustc_data_structures::sync::Lrc;
 use std::io::{self, Write};
 use std::path::Path;
 use std::vec;
@@ -31,7 +31,7 @@ mod tests;
 pub struct JsonEmitter {
     dst: Box<dyn Write + Send>,
     registry: Option<Registry>,
-    sm: Lrc<dyn SourceMapper + sync::Send + sync::Sync>,
+    sm: Lrc<SourceMap>,
     pretty: bool,
     ui_testing: bool,
     json_rendered: HumanReadableErrorType,
@@ -92,7 +92,7 @@ impl JsonEmitter {
 }
 
 impl Emitter for JsonEmitter {
-    fn emit_diagnostic(&mut self, diag: &errors::Diagnostic) {
+    fn emit_diagnostic(&mut self, diag: &crate::Diagnostic) {
         let data = Diagnostic::from_errors_diagnostic(diag, self);
         let result = if self.pretty {
             writeln!(&mut self.dst, "{}", as_pretty_json(&data))
@@ -116,7 +116,7 @@ impl Emitter for JsonEmitter {
         }
     }
 
-    fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> {
+    fn source_map(&self) -> Option<&Lrc<SourceMap>> {
         Some(&self.sm)
     }
 
@@ -212,7 +212,7 @@ struct ArtifactNotification<'a> {
 }
 
 impl Diagnostic {
-    fn from_errors_diagnostic(diag: &errors::Diagnostic,
+    fn from_errors_diagnostic(diag: &crate::Diagnostic,
                                je: &JsonEmitter)
                                -> Diagnostic {
         let sugg = diag.suggestions.iter().map(|sugg| {
diff --git a/src/libsyntax/json/tests.rs b/src/librustc_errors/json/tests.rs
index 1edefd5bc4b..4ab5cd21b0b 100644
--- a/src/libsyntax/json/tests.rs
+++ b/src/librustc_errors/json/tests.rs
@@ -1,11 +1,10 @@
 use super::*;
 
 use crate::json::JsonEmitter;
-use crate::source_map::{FilePathMapping, SourceMap};
-use crate::with_default_globals;
+use syntax_pos::source_map::{FilePathMapping, SourceMap};
 
-use errors::emitter::{ColorConfig, HumanReadableErrorType};
-use errors::Handler;
+use crate::emitter::{ColorConfig, HumanReadableErrorType};
+use crate::Handler;
 use rustc_serialize::json::decode;
 use syntax_pos::{BytePos, Span};
 
@@ -40,6 +39,13 @@ impl<T: Write> Write for Shared<T> {
     }
 }
 
+fn with_default_globals(f: impl FnOnce()) {
+    let globals = syntax_pos::Globals::new(syntax_pos::edition::DEFAULT_EDITION);
+    syntax_pos::GLOBALS.set(&globals, || {
+        syntax_pos::GLOBALS.set(&globals, f)
+    })
+}
+
 /// Test the span yields correct positions in JSON.
 fn test_positions(code: &str, span: (u32, u32), expected_output: SpanTestData) {
     let expected_output = TestData { spans: vec![expected_output] };
diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs
index 8ee28875c62..17765ef9dee 100644
--- a/src/librustc_errors/lib.rs
+++ b/src/librustc_errors/lib.rs
@@ -18,6 +18,8 @@ use registry::Registry;
 use rustc_data_structures::sync::{self, Lrc, Lock};
 use rustc_data_structures::fx::{FxHashSet, FxIndexMap};
 use rustc_data_structures::stable_hasher::StableHasher;
+use syntax_pos::source_map::SourceMap;
+use syntax_pos::{Loc, Span, MultiSpan};
 
 use std::borrow::Cow;
 use std::cell::Cell;
@@ -35,17 +37,7 @@ mod snippet;
 pub mod registry;
 mod styled_buffer;
 mod lock;
-
-use syntax_pos::{
-    BytePos,
-    FileLinesResult,
-    FileName,
-    Loc,
-    MultiSpan,
-    SourceFile,
-    Span,
-    SpanSnippetError,
-};
+pub mod json;
 
 pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a>>;
 
@@ -150,26 +142,12 @@ pub struct SubstitutionPart {
     pub snippet: String,
 }
 
-pub type SourceMapperDyn = dyn SourceMapper + sync::Send + sync::Sync;
-
-pub trait SourceMapper {
-    fn lookup_char_pos(&self, pos: BytePos) -> Loc;
-    fn span_to_lines(&self, sp: Span) -> FileLinesResult;
-    fn span_to_string(&self, sp: Span) -> String;
-    fn span_to_snippet(&self, sp: Span) -> Result<String, SpanSnippetError>;
-    fn span_to_filename(&self, sp: Span) -> FileName;
-    fn merge_spans(&self, sp_lhs: Span, sp_rhs: Span) -> Option<Span>;
-    fn call_span_if_macro(&self, sp: Span) -> Span;
-    fn ensure_source_file_source_present(&self, source_file: Lrc<SourceFile>) -> bool;
-    fn doctest_offset_line(&self, file: &FileName, line: usize) -> usize;
-}
-
 impl CodeSuggestion {
     /// Returns the assembled code suggestions, whether they should be shown with an underline
     /// and whether the substitution only differs in capitalization.
     pub fn splice_lines(
         &self,
-        cm: &SourceMapperDyn,
+        cm: &SourceMap,
     ) -> Vec<(String, Vec<SubstitutionPart>, bool)> {
         use syntax_pos::{CharPos, Pos};
 
@@ -259,36 +237,7 @@ impl CodeSuggestion {
     }
 }
 
-/// 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) -> ! {
-        panic::resume_unwind(Box::new(FatalErrorMarker))
-    }
-}
-
-impl fmt::Display for FatalError {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "parser fatal error")
-    }
-}
-
-impl error::Error for FatalError {
-    fn description(&self) -> &str {
-        "The parser has encountered a fatal error"
-    }
-}
+pub use syntax_pos::fatal_error::{FatalError, FatalErrorMarker};
 
 /// Signifies that the compiler died with an explicit call to `.bug`
 /// or `.span_bug` rather than a failed assertion, etc.
@@ -405,7 +354,7 @@ impl Handler {
         color_config: ColorConfig,
         can_emit_warnings: bool,
         treat_err_as_bug: Option<usize>,
-        cm: Option<Lrc<SourceMapperDyn>>,
+        cm: Option<Lrc<SourceMap>>,
     ) -> Self {
         Self::with_tty_emitter_and_flags(
             color_config,
@@ -420,7 +369,7 @@ impl Handler {
 
     pub fn with_tty_emitter_and_flags(
         color_config: ColorConfig,
-        cm: Option<Lrc<SourceMapperDyn>>,
+        cm: Option<Lrc<SourceMap>>,
         flags: HandlerFlags,
     ) -> Self {
         let emitter = Box::new(EmitterWriter::stderr(
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index a40325448b1..507732a9107 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -18,7 +18,7 @@ use syntax::ast::CRATE_NODE_ID;
 use syntax::source_map;
 use syntax::attr;
 use syntax::feature_gate::UnstableFeatures;
-use syntax::json::JsonEmitter;
+use errors::json::JsonEmitter;
 use syntax::symbol::sym;
 use syntax_pos::DUMMY_SP;
 use errors;
diff --git a/src/libstd/sys/hermit/thread_local.rs b/src/libstd/sys/hermit/thread_local.rs
index 4bc8c4d5883..268fb770eae 100644
--- a/src/libstd/sys/hermit/thread_local.rs
+++ b/src/libstd/sys/hermit/thread_local.rs
@@ -3,6 +3,7 @@
 use crate::collections::BTreeMap;
 use crate::ptr;
 use crate::sync::atomic::{AtomicUsize, Ordering};
+use crate::sys_common::mutex::Mutex;
 
 pub type Key = usize;
 
@@ -11,6 +12,7 @@ type Dtor = unsafe extern fn(*mut u8);
 static NEXT_KEY: AtomicUsize = AtomicUsize::new(0);
 
 static mut KEYS: *mut BTreeMap<Key, Option<Dtor>> = ptr::null_mut();
+static KEYS_LOCK: Mutex = Mutex::new();
 
 #[thread_local]
 static mut LOCALS: *mut BTreeMap<Key, *mut u8> = ptr::null_mut();
@@ -32,6 +34,7 @@ unsafe fn locals() -> &'static mut BTreeMap<Key, *mut u8> {
 #[inline]
 pub unsafe fn create(dtor: Option<Dtor>) -> Key {
     let key = NEXT_KEY.fetch_add(1, Ordering::SeqCst);
+    let _guard = KEYS_LOCK.lock();
     keys().insert(key, dtor);
     key
 }
diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs
index 6290b2137ea..e3eca75dfe7 100644
--- a/src/libsyntax/lib.rs
+++ b/src/libsyntax/lib.rs
@@ -87,12 +87,10 @@ pub mod util {
     pub mod map_in_place;
 }
 
-pub mod json;
-
 pub mod ast;
 pub mod attr;
 pub mod expand;
-pub mod source_map;
+pub use syntax_pos::source_map;
 pub mod entry;
 pub mod feature_gate;
 pub mod mut_visit;
diff --git a/src/libsyntax_ext/test_harness.rs b/src/libsyntax_ext/test_harness.rs
index 1492f6f575f..659780d7a43 100644
--- a/src/libsyntax_ext/test_harness.rs
+++ b/src/libsyntax_ext/test_harness.rs
@@ -67,7 +67,8 @@ pub fn inject(
                 PanicStrategy::Unwind
             }
             (PanicStrategy::Abort, false) => {
-                span_diagnostic.err("building tests with panic=abort is not yet supported");
+                span_diagnostic.err("building tests with panic=abort is not supported \
+                                     without `-Zpanic_abort_tests`");
                 PanicStrategy::Unwind
             }
             (PanicStrategy::Unwind, _) => PanicStrategy::Unwind,
diff --git a/src/libsyntax_pos/Cargo.toml b/src/libsyntax_pos/Cargo.toml
index 378f7a955a3..2cac76085d2 100644
--- a/src/libsyntax_pos/Cargo.toml
+++ b/src/libsyntax_pos/Cargo.toml
@@ -18,3 +18,4 @@ arena = { path = "../libarena" }
 scoped-tls = "1.0"
 unicode-width = "0.1.4"
 cfg-if = "0.1.2"
+log = "0.4"
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..b88d6dbc3f3 100644
--- a/src/libsyntax_pos/lib.rs
+++ b/src/libsyntax_pos/lib.rs
@@ -16,6 +16,8 @@
 
 use rustc_serialize::{Encodable, Decodable, Encoder, Decoder};
 
+pub mod source_map;
+
 pub mod edition;
 use edition::Edition;
 pub mod hygiene;
@@ -29,6 +31,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};
diff --git a/src/libsyntax/source_map.rs b/src/libsyntax_pos/source_map.rs
index d9f618602a4..77d9807225e 100644
--- a/src/libsyntax/source_map.rs
+++ b/src/libsyntax_pos/source_map.rs
@@ -7,8 +7,8 @@
 //! within the `SourceMap`, which upon request can be converted to line and column
 //! information, source code snippets, etc.
 
-pub use syntax_pos::*;
-pub use syntax_pos::hygiene::{ExpnKind, ExpnData};
+pub use crate::*;
+pub use crate::hygiene::{ExpnKind, ExpnData};
 
 use rustc_data_structures::fx::FxHashMap;
 use rustc_data_structures::stable_hasher::StableHasher;
@@ -22,8 +22,6 @@ use std::fs;
 use std::io;
 use log::debug;
 
-use errors::SourceMapper;
-
 #[cfg(test)]
 mod tests;
 
@@ -216,7 +214,7 @@ impl SourceMap {
         self.try_new_source_file(filename, src)
             .unwrap_or_else(|OffsetOverflowError| {
                 eprintln!("fatal error: rustc does not support files larger than 4GB");
-                errors::FatalError.raise()
+                crate::fatal_error::FatalError.raise()
             })
     }
 
@@ -956,28 +954,15 @@ impl SourceMap {
 
         None
     }
-}
-
-impl SourceMapper for SourceMap {
-    fn lookup_char_pos(&self, pos: BytePos) -> Loc {
-        self.lookup_char_pos(pos)
-    }
-    fn span_to_lines(&self, sp: Span) -> FileLinesResult {
-        self.span_to_lines(sp)
-    }
-    fn span_to_string(&self, sp: Span) -> String {
-        self.span_to_string(sp)
-    }
-    fn span_to_snippet(&self, sp: Span) -> Result<String, SpanSnippetError> {
-        self.span_to_snippet(sp)
-    }
-    fn span_to_filename(&self, sp: Span) -> FileName {
-        self.span_to_filename(sp)
-    }
-    fn merge_spans(&self, sp_lhs: Span, sp_rhs: Span) -> Option<Span> {
-        self.merge_spans(sp_lhs, sp_rhs)
+    pub fn ensure_source_file_source_present(&self, source_file: Lrc<SourceFile>) -> bool {
+        source_file.add_external_src(
+            || match source_file.name {
+                FileName::Real(ref name) => self.file_loader.read_file(name).ok(),
+                _ => None,
+            }
+        )
     }
-    fn call_span_if_macro(&self, sp: Span) -> Span {
+    pub fn call_span_if_macro(&self, sp: Span) -> Span {
         if self.span_to_filename(sp.clone()).is_macros() {
             let v = sp.macro_backtrace();
             if let Some(use_site) = v.last() {
@@ -986,17 +971,6 @@ impl SourceMapper for SourceMap {
         }
         sp
     }
-    fn ensure_source_file_source_present(&self, source_file: Lrc<SourceFile>) -> bool {
-        source_file.add_external_src(
-            || match source_file.name {
-                FileName::Real(ref name) => self.file_loader.read_file(name).ok(),
-                _ => None,
-            }
-        )
-    }
-    fn doctest_offset_line(&self, file: &FileName, line: usize) -> usize {
-        self.doctest_offset_line(file, line)
-    }
 }
 
 #[derive(Clone)]
diff --git a/src/libsyntax/source_map/tests.rs b/src/libsyntax_pos/source_map/tests.rs
index 15254336bbf..15254336bbf 100644
--- a/src/libsyntax/source_map/tests.rs
+++ b/src/libsyntax_pos/source_map/tests.rs
diff --git a/src/libtest/cli.rs b/src/libtest/cli.rs
index a34426305be..c97cb0e0605 100644
--- a/src/libtest/cli.rs
+++ b/src/libtest/cli.rs
@@ -13,6 +13,7 @@ pub struct TestOpts {
     pub list: bool,
     pub filter: Option<String>,
     pub filter_exact: bool,
+    pub force_run_in_process: bool,
     pub exclude_should_panic: bool,
     pub run_ignored: RunIgnored,
     pub run_tests: bool,
@@ -46,6 +47,7 @@ fn optgroups() -> getopts::Options {
     let mut opts = getopts::Options::new();
     opts.optflag("", "include-ignored", "Run ignored and not ignored tests")
         .optflag("", "ignored", "Run only ignored tests")
+        .optflag("", "force-run-in-process", "Forces tests to run in-process when panic=abort")
         .optflag("", "exclude-should-panic", "Excludes tests marked as should_panic")
         .optflag("", "test", "Run tests and not benchmarks")
         .optflag("", "bench", "Run benchmarks instead of tests")
@@ -233,6 +235,7 @@ fn parse_opts_impl(matches: getopts::Matches) -> OptRes {
     let allow_unstable = get_allow_unstable(&matches)?;
 
     // Unstable flags
+    let force_run_in_process = unstable_optflag!(matches, allow_unstable, "force-run-in-process");
     let exclude_should_panic = unstable_optflag!(matches, allow_unstable, "exclude-should-panic");
     let include_ignored = unstable_optflag!(matches, allow_unstable, "include-ignored");
     let time_options = get_time_options(&matches, allow_unstable)?;
@@ -259,6 +262,7 @@ fn parse_opts_impl(matches: getopts::Matches) -> OptRes {
         list,
         filter,
         filter_exact: exact,
+        force_run_in_process,
         exclude_should_panic,
         run_ignored,
         run_tests,
diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs
index 341a2e18db5..7647978b3d9 100644
--- a/src/libtest/lib.rs
+++ b/src/libtest/lib.rs
@@ -254,7 +254,7 @@ where
     let mut pending = 0;
 
     let (tx, rx) = channel::<CompletedTest>();
-    let run_strategy = if opts.options.panic_abort {
+    let run_strategy = if opts.options.panic_abort && !opts.force_run_in_process {
         RunStrategy::SpawnPrimary
     } else {
         RunStrategy::InProcess
diff --git a/src/libtest/tests.rs b/src/libtest/tests.rs
index e0e211444cf..5f55b647f5e 100644
--- a/src/libtest/tests.rs
+++ b/src/libtest/tests.rs
@@ -24,6 +24,7 @@ impl TestOpts {
             list: false,
             filter: None,
             filter_exact: false,
+            force_run_in_process: false,
             exclude_should_panic: false,
             run_ignored: RunIgnored::No,
             run_tests: false,
diff --git a/src/test/ui/extern/issue-36122-accessing-externed-dst.rs b/src/test/ui/extern/issue-36122-accessing-externed-dst.rs
new file mode 100644
index 00000000000..22229db8000
--- /dev/null
+++ b/src/test/ui/extern/issue-36122-accessing-externed-dst.rs
@@ -0,0 +1,6 @@
+fn main() {
+    extern {
+        static symbol: [usize]; //~ ERROR: the size for values of type
+    }
+    println!("{}", symbol[0]);
+}
diff --git a/src/test/ui/extern/issue-36122-accessing-externed-dst.stderr b/src/test/ui/extern/issue-36122-accessing-externed-dst.stderr
new file mode 100644
index 00000000000..add3a8e7926
--- /dev/null
+++ b/src/test/ui/extern/issue-36122-accessing-externed-dst.stderr
@@ -0,0 +1,12 @@
+error[E0277]: the size for values of type `[usize]` cannot be known at compilation time
+  --> $DIR/issue-36122-accessing-externed-dst.rs:3:24
+   |
+LL |         static symbol: [usize];
+   |                        ^^^^^^^ doesn't have a size known at compile-time
+   |
+   = help: the trait `std::marker::Sized` is not implemented for `[usize]`
+   = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/parser/issue-58094-missing-right-square-bracket.rs b/src/test/ui/parser/issue-58094-missing-right-square-bracket.rs
new file mode 100644
index 00000000000..25699f9fe11
--- /dev/null
+++ b/src/test/ui/parser/issue-58094-missing-right-square-bracket.rs
@@ -0,0 +1,4 @@
+// Fixed in #66054.
+// ignore-tidy-trailing-newlines
+// error-pattern: aborting due to 2 previous errors
+#[Ѕ
\ No newline at end of file
diff --git a/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr b/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr
new file mode 100644
index 00000000000..2c987da81d8
--- /dev/null
+++ b/src/test/ui/parser/issue-58094-missing-right-square-bracket.stderr
@@ -0,0 +1,16 @@
+error: this file contains an un-closed delimiter
+  --> $DIR/issue-58094-missing-right-square-bracket.rs:4:4
+   |
+LL | #[Ѕ
+   |  - ^
+   |  |
+   |  un-closed delimiter
+
+error: expected item after attributes
+  --> $DIR/issue-58094-missing-right-square-bracket.rs:4:4
+   |
+LL | #[Ѕ
+   |    ^
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/test-panic-abort-disabled.rs b/src/test/ui/test-panic-abort-disabled.rs
index f24046ff0e8..4adb161d9ee 100644
--- a/src/test/ui/test-panic-abort-disabled.rs
+++ b/src/test/ui/test-panic-abort-disabled.rs
@@ -1,4 +1,4 @@
-// error-pattern:building tests with panic=abort is not yet supported
+// error-pattern:building tests with panic=abort is not supported
 // no-prefer-dynamic
 // compile-flags: --test -Cpanic=abort
 // run-flags: --test-threads=1
diff --git a/src/test/ui/test-panic-abort-disabled.stderr b/src/test/ui/test-panic-abort-disabled.stderr
index a8d9bad43ed..9c65c7360c1 100644
--- a/src/test/ui/test-panic-abort-disabled.stderr
+++ b/src/test/ui/test-panic-abort-disabled.stderr
@@ -1,4 +1,4 @@
-error: building tests with panic=abort is not yet supported
+error: building tests with panic=abort is not supported without `-Zpanic_abort_tests`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/unboxed-closures/issue-30904.rs b/src/test/ui/unboxed-closures/issue-30904.rs
deleted file mode 100644
index eec5e962b43..00000000000
--- a/src/test/ui/unboxed-closures/issue-30904.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-#![feature(fn_traits, unboxed_closures)]
-
-fn test<F: for<'x> FnOnce<(&'x str,)>>(_: F) {}
-
-struct Compose<F,G>(F,G);
-impl<T,F,G> FnOnce<(T,)> for Compose<F,G>
-where F: FnOnce<(T,)>, G: FnOnce<(F::Output,)> {
-    type Output = G::Output;
-    extern "rust-call" fn call_once(self, (x,): (T,)) -> G::Output {
-        (self.1)((self.0)(x))
-    }
-}
-
-struct Str<'a>(&'a str);
-fn mk_str<'a>(s: &'a str) -> Str<'a> { Str(s) }
-
-fn main() {
-    let _: for<'a> fn(&'a str) -> Str<'a> = mk_str;
-    // expected concrete lifetime, found bound lifetime parameter 'a
-    let _: for<'a> fn(&'a str) -> Str<'a> = Str;
-    //~^ ERROR: mismatched types
-
-    test(|_: &str| {});
-    test(mk_str);
-    // expected concrete lifetime, found bound lifetime parameter 'x
-    test(Str); //~ ERROR: type mismatch in function arguments
-
-    test(Compose(|_: &str| {}, |_| {}));
-    test(Compose(mk_str, |_| {}));
-    // internal compiler error: cannot relate bound region:
-    //   ReLateBound(DebruijnIndex { depth: 2 },
-    //     BrNamed(DefId { krate: 0, node: DefIndex(6) => test::'x }, 'x(65)))
-    //<= ReSkolemized(0,
-    //     BrNamed(DefId { krate: 0, node: DefIndex(6) => test::'x }, 'x(65)))
-    test(Compose(Str, |_| {}));
-}
diff --git a/src/test/ui/unboxed-closures/issue-30904.stderr b/src/test/ui/unboxed-closures/issue-30904.stderr
deleted file mode 100644
index 943cbe0ccc2..00000000000
--- a/src/test/ui/unboxed-closures/issue-30904.stderr
+++ /dev/null
@@ -1,24 +0,0 @@
-error[E0308]: mismatched types
-  --> $DIR/issue-30904.rs:20:45
-   |
-LL |     let _: for<'a> fn(&'a str) -> Str<'a> = Str;
-   |                                             ^^^ expected concrete lifetime, found bound lifetime parameter 'a
-   |
-   = note: expected type `for<'a> fn(&'a str) -> Str<'a>`
-              found type `fn(&str) -> Str<'_> {Str::<'_>}`
-
-error[E0631]: type mismatch in function arguments
-  --> $DIR/issue-30904.rs:26:10
-   |
-LL | fn test<F: for<'x> FnOnce<(&'x str,)>>(_: F) {}
-   |    ----    -------------------------- required by this bound in `test`
-...
-LL | struct Str<'a>(&'a str);
-   | ------------------------ found signature of `fn(&str) -> _`
-...
-LL |     test(Str);
-   |          ^^^ expected signature of `for<'x> fn(&'x str) -> _`
-
-error: aborting due to 2 previous errors
-
-For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/unboxed-closures/issue-30906.nll.stderr b/src/test/ui/unboxed-closures/issue-30906.nll.stderr
new file mode 100644
index 00000000000..5a2cbab9a15
--- /dev/null
+++ b/src/test/ui/unboxed-closures/issue-30906.nll.stderr
@@ -0,0 +1,8 @@
+error: higher-ranked subtype error
+  --> $DIR/issue-30906.rs:15:5
+   |
+LL |     test(Compose(f, |_| {}));
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/unboxed-closures/issue-30906.rs b/src/test/ui/unboxed-closures/issue-30906.rs
new file mode 100644
index 00000000000..03cce832775
--- /dev/null
+++ b/src/test/ui/unboxed-closures/issue-30906.rs
@@ -0,0 +1,18 @@
+#![feature(fn_traits, unboxed_closures)]
+
+fn test<F: for<'x> FnOnce<(&'x str,)>>(_: F) {}
+
+struct Compose<F,G>(F,G);
+impl<T,F,G> FnOnce<(T,)> for Compose<F,G>
+where F: FnOnce<(T,)>, G: FnOnce<(F::Output,)> {
+    type Output = G::Output;
+    extern "rust-call" fn call_once(self, (x,): (T,)) -> G::Output {
+        (self.1)((self.0)(x))
+    }
+}
+
+fn bad<T>(f: fn(&'static str) -> T) {
+    test(Compose(f, |_| {})); //~ ERROR: mismatched types
+}
+
+fn main() {}
diff --git a/src/test/ui/unboxed-closures/issue-30906.stderr b/src/test/ui/unboxed-closures/issue-30906.stderr
new file mode 100644
index 00000000000..5c3a1154e74
--- /dev/null
+++ b/src/test/ui/unboxed-closures/issue-30906.stderr
@@ -0,0 +1,12 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-30906.rs:15:5
+   |
+LL |     test(Compose(f, |_| {}));
+   |     ^^^^ one type is more general than the other
+   |
+   = note: expected type `std::ops::FnOnce<(&'x str,)>`
+              found type `std::ops::FnOnce<(&str,)>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/tools/compiletest/src/json.rs b/src/tools/compiletest/src/json.rs
index 02b09e21ff0..7930d1249e7 100644
--- a/src/tools/compiletest/src/json.rs
+++ b/src/tools/compiletest/src/json.rs
@@ -1,4 +1,4 @@
-//! These structs are a subset of the ones found in `syntax::json`.
+//! These structs are a subset of the ones found in `rustc_errors::json`.
 //! They are only used for deserialization of JSON output provided by libtest.
 
 use crate::errors::{Error, ErrorKind};