// 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!(); }