// These functions are used by macro expansion for bug! and span_bug! use crate::ty::tls; use rustc_span::{MultiSpan, Span}; use std::fmt; #[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!(); }