diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 6b00a10eaa3..55a5e342947 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -166,6 +166,7 @@ pub mod util { pub mod nodemap; pub mod time_graph; pub mod profiling; + pub mod bug; } // A private module so that macro-expanded idents like diff --git a/src/librustc/macros.rs b/src/librustc/macros.rs index 0bf1f4decc4..e599b0704f9 100644 --- a/src/librustc/macros.rs +++ b/src/librustc/macros.rs @@ -51,14 +51,14 @@ macro_rules! enum_from_u32 { macro_rules! bug { () => ( bug!("impossible case reached") ); ($($message:tt)*) => ({ - $crate::session::bug_fmt(file!(), line!(), format_args!($($message)*)) + $crate::util::bug::bug_fmt(file!(), line!(), format_args!($($message)*)) }) } #[macro_export] macro_rules! span_bug { ($span:expr, $($message:tt)*) => ({ - $crate::session::span_bug_fmt(file!(), line!(), $span, format_args!($($message)*)) + $crate::util::bug::span_bug_fmt(file!(), line!(), $span, format_args!($($message)*)) }) } diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index c3d4d3abf9a..f474f214305 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -20,7 +20,6 @@ use middle::allocator::AllocatorKind; use middle::dependency_format; use session::search_paths::PathKind; use session::config::{OutputType, Lto}; -use ty::tls; use util::nodemap::{FxHashMap, FxHashSet}; use util::common::{duration_to_secs_str, ErrorReported}; use util::common::ProfileQueriesMsg; @@ -49,7 +48,6 @@ use std; use std::cell::{self, Cell, RefCell}; use std::collections::HashMap; use std::env; -use std::fmt; use std::io::Write; use std::path::{Path, PathBuf}; use std::time::Duration; @@ -1301,39 +1299,3 @@ pub fn compile_result_from_err_count(err_count: usize) -> CompileResult { Err(CompileIncomplete::Errored(ErrorReported)) } } - -#[cold] -#[inline(never)] -pub fn bug_fmt(file: &'static str, line: u32, args: fmt::Arguments) -> ! { - // this wrapper mostly exists so I don't have to write a fully - // qualified path of None:: inside the bug!() macro definition - opt_span_bug_fmt(file, line, None::, args); -} - -#[cold] -#[inline(never)] -pub fn span_bug_fmt>( - file: &'static str, - line: u32, - span: S, - args: fmt::Arguments, -) -> ! { - opt_span_bug_fmt(file, line, Some(span), args); -} - -fn opt_span_bug_fmt>( - file: &'static str, - line: u32, - span: Option, - args: fmt::Arguments, -) -> ! { - tls::with_opt(move |tcx| { - let msg = format!("{}:{}: {}", file, line, args); - match (tcx, span) { - (Some(tcx), Some(span)) => tcx.sess.diagnostic().span_bug(span, &msg), - (Some(tcx), None) => tcx.sess.diagnostic().bug(&msg), - (None, _) => panic!(msg), - } - }); - unreachable!(); -} diff --git a/src/librustc/util/bug.rs b/src/librustc/util/bug.rs new file mode 100644 index 00000000000..f2593e4d4b5 --- /dev/null +++ b/src/librustc/util/bug.rs @@ -0,0 +1,51 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// These functions are used by macro expansion for bug! and span_bug! + +use ty::tls; +use std::fmt; +use syntax_pos::{Span, MultiSpan}; + +#[cold] +#[inline(never)] +pub fn bug_fmt(file: &'static str, line: u32, args: fmt::Arguments) -> ! { + // this wrapper mostly exists so I don't have to write a fully + // qualified path of None:: inside the bug!() macro definition + opt_span_bug_fmt(file, line, None::, args); +} + +#[cold] +#[inline(never)] +pub fn span_bug_fmt>( + file: &'static str, + line: u32, + span: S, + args: fmt::Arguments, +) -> ! { + opt_span_bug_fmt(file, line, Some(span), args); +} + +fn opt_span_bug_fmt>( + file: &'static str, + line: u32, + span: Option, + args: fmt::Arguments, +) -> ! { + tls::with_opt(move |tcx| { + let msg = format!("{}:{}: {}", file, line, args); + match (tcx, span) { + (Some(tcx), Some(span)) => tcx.sess.diagnostic().span_bug(span, &msg), + (Some(tcx), None) => tcx.sess.diagnostic().bug(&msg), + (None, _) => panic!(msg), + } + }); + unreachable!(); +}