Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/body/tests.rs26
-rw-r--r--crates/hir-ty/src/mir/eval/shim.rs15
-rw-r--r--crates/test-utils/src/minicore.rs3
3 files changed, 26 insertions, 18 deletions
diff --git a/crates/hir-def/src/body/tests.rs b/crates/hir-def/src/body/tests.rs
index a27ffe2167..4c8a54f7c8 100644
--- a/crates/hir-def/src/body/tests.rs
+++ b/crates/hir-def/src/body/tests.rs
@@ -318,18 +318,20 @@ fn f() {
expect![[r#"
fn f() {
- $crate::panicking::panic_fmt(
- builtin#lang(Arguments::new_v1_formatted)(
- &[
- "cc",
- ],
- &[],
- &[],
- unsafe {
- builtin#lang(UnsafeArg::new)()
- },
- ),
- );
+ {
+ $crate::panicking::panic_fmt(
+ builtin#lang(Arguments::new_v1_formatted)(
+ &[
+ "cc",
+ ],
+ &[],
+ &[],
+ unsafe {
+ builtin#lang(UnsafeArg::new)()
+ },
+ ),
+ );
+ };
}"#]]
.assert_eq(&body.pretty_print(&db, def))
}
diff --git a/crates/hir-ty/src/mir/eval/shim.rs b/crates/hir-ty/src/mir/eval/shim.rs
index fee3dd3ada..33fae866ec 100644
--- a/crates/hir-ty/src/mir/eval/shim.rs
+++ b/crates/hir-ty/src/mir/eval/shim.rs
@@ -49,6 +49,7 @@ impl Evaluator<'_> {
if self.not_special_fn_cache.borrow().contains(&def) {
return Ok(false);
}
+
let function_data = self.db.function_data(def);
let is_intrinsic = match &function_data.abi {
Some(abi) => *abi == Interned::new_str("rust-intrinsic"),
@@ -311,16 +312,20 @@ impl Evaluator<'_> {
fn detect_lang_function(&self, def: FunctionId) -> Option<LangItem> {
use LangItem::*;
- let candidate = self.db.lang_attr(def.into())?;
+ let attrs = self.db.attrs(def.into());
+
+ if attrs.by_key("rustc_const_panic_str").exists() {
+ // `#[rustc_const_panic_str]` is treated like `lang = "begin_panic"` by rustc CTFE.
+ return Some(LangItem::BeginPanic);
+ }
+
+ let candidate = attrs.by_key("lang").string_value().and_then(LangItem::from_str)?;
// We want to execute these functions with special logic
// `PanicFmt` is not detected here as it's redirected later.
if [BeginPanic, SliceLen, DropInPlace].contains(&candidate) {
return Some(candidate);
}
- if self.db.attrs(def.into()).by_key("rustc_const_panic_str").exists() {
- // `#[rustc_const_panic_str]` is treated like `lang = "begin_panic"` by rustc CTFE.
- return Some(LangItem::BeginPanic);
- }
+
None
}
diff --git a/crates/test-utils/src/minicore.rs b/crates/test-utils/src/minicore.rs
index 3018f2c133..c50a5fa669 100644
--- a/crates/test-utils/src/minicore.rs
+++ b/crates/test-utils/src/minicore.rs
@@ -1378,8 +1378,9 @@ mod panic {
// Special-case the single-argument case for const_panic.
("{}", $arg:expr $(,)?) => ({
#[rustc_const_panic_str] // enforce a &&str argument in const-check and hook this by const-eval
+ #[rustc_do_not_const_check] // hooked by const-eval
const fn panic_cold_display<T: $crate::fmt::Display>(arg: &T) -> ! {
- loop {}
+ $crate::panicking::panic_display(arg)
}
panic_cold_display(&$arg);
}),