Fix const core::panic!(non_literal_str).

This commit is contained in:
Mara Bos 2020-09-05 17:26:11 +02:00
parent 500ddc5efd
commit 4f7ffbf351
6 changed files with 15 additions and 3 deletions

View File

@ -263,6 +263,7 @@ language_item_table! {
// is required to define it somewhere. Additionally, there are restrictions on crates that use // is required to define it somewhere. Additionally, there are restrictions on crates that use
// a weak lang item, but do not have it defined. // a weak lang item, but do not have it defined.
Panic, sym::panic, panic_fn, Target::Fn; Panic, sym::panic, panic_fn, Target::Fn;
PanicStr, sym::panic_str, panic_str, Target::Fn;
PanicBoundsCheck, sym::panic_bounds_check, panic_bounds_check_fn, Target::Fn; PanicBoundsCheck, sym::panic_bounds_check, panic_bounds_check_fn, Target::Fn;
PanicInfo, sym::panic_info, panic_info, Target::Struct; PanicInfo, sym::panic_info, panic_info, Target::Struct;
PanicLocation, sym::panic_location, panic_location, Target::Struct; PanicLocation, sym::panic_location, panic_location, Target::Struct;

View File

@ -70,9 +70,10 @@ impl<'mir, 'tcx> InterpCx<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>> {
) -> InterpResult<'tcx> { ) -> InterpResult<'tcx> {
let def_id = instance.def_id(); let def_id = instance.def_id();
if Some(def_id) == self.tcx.lang_items().panic_fn() if Some(def_id) == self.tcx.lang_items().panic_fn()
|| Some(def_id) == self.tcx.lang_items().panic_str()
|| Some(def_id) == self.tcx.lang_items().begin_panic_fn() || Some(def_id) == self.tcx.lang_items().begin_panic_fn()
{ {
// &'static str // &str
assert!(args.len() == 1); assert!(args.len() == 1);
let msg_place = self.deref_operand(args[0])?; let msg_place = self.deref_operand(args[0])?;

View File

@ -74,7 +74,9 @@ impl ConstCx<'mir, 'tcx> {
/// Returns `true` if this `DefId` points to one of the official `panic` lang items. /// Returns `true` if this `DefId` points to one of the official `panic` lang items.
pub fn is_lang_panic_fn(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool { pub fn is_lang_panic_fn(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool {
Some(def_id) == tcx.lang_items().panic_fn() || Some(def_id) == tcx.lang_items().begin_panic_fn() Some(def_id) == tcx.lang_items().panic_fn()
|| Some(def_id) == tcx.lang_items().panic_str()
|| Some(def_id) == tcx.lang_items().begin_panic_fn()
} }
pub fn allow_internal_unstable(tcx: TyCtxt<'tcx>, def_id: DefId, feature_gate: Symbol) -> bool { pub fn allow_internal_unstable(tcx: TyCtxt<'tcx>, def_id: DefId, feature_gate: Symbol) -> bool {

View File

@ -777,6 +777,7 @@ symbols! {
panic_info, panic_info,
panic_location, panic_location,
panic_runtime, panic_runtime,
panic_str,
panic_unwind, panic_unwind,
param_attrs, param_attrs,
parent_trait, parent_trait,

View File

@ -10,7 +10,7 @@ macro_rules! panic {
$crate::panicking::panic($msg) $crate::panicking::panic($msg)
); );
($msg:expr) => ( ($msg:expr) => (
$crate::panic!("{}", $crate::convert::identity::<&str>($msg)) $crate::panicking::panic_str($msg)
); );
($msg:expr,) => ( ($msg:expr,) => (
$crate::panic!($msg) $crate::panic!($msg)

View File

@ -50,6 +50,13 @@ pub fn panic(expr: &'static str) -> ! {
panic_fmt(fmt::Arguments::new_v1(&[expr], &[])); panic_fmt(fmt::Arguments::new_v1(&[expr], &[]));
} }
#[inline]
#[track_caller]
#[cfg_attr(not(bootstrap), lang = "panic_str")] // needed for const-evaluated panics
pub fn panic_str(expr: &str) -> ! {
panic_fmt(format_args!("{}", expr));
}
#[cold] #[cold]
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))] #[cfg_attr(not(feature = "panic_immediate_abort"), inline(never))]
#[track_caller] #[track_caller]