Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir_expand/src/builtin_fn_macro.rs20
-rw-r--r--crates/hir_expand/src/name.rs1
2 files changed, 21 insertions, 0 deletions
diff --git a/crates/hir_expand/src/builtin_fn_macro.rs b/crates/hir_expand/src/builtin_fn_macro.rs
index bf6cc9989a..17f0caca7a 100644
--- a/crates/hir_expand/src/builtin_fn_macro.rs
+++ b/crates/hir_expand/src/builtin_fn_macro.rs
@@ -114,6 +114,7 @@ register_builtin! {
(cfg, Cfg) => cfg_expand,
(core_panic, CorePanic) => panic_expand,
(std_panic, StdPanic) => panic_expand,
+ (unreachable, Unreachable) => unreachable_expand,
(log_syntax, LogSyntax) => log_syntax_expand,
(trace_macros, TraceMacros) => trace_macros_expand,
@@ -354,6 +355,25 @@ fn panic_expand(
ExpandResult::ok(call)
}
+fn unreachable_expand(
+ db: &dyn AstDatabase,
+ id: MacroCallId,
+ tt: &tt::Subtree,
+) -> ExpandResult<tt::Subtree> {
+ let loc: MacroCallLoc = db.lookup_intern_macro_call(id);
+ // Expand to a macro call `$crate::panic::unreachable_{edition}`
+ let krate = tt::Ident { text: "$crate".into(), id: tt::TokenId::unspecified() };
+ let mut call = if db.crate_graph()[loc.krate].edition == Edition::Edition2021 {
+ quote!(#krate::panic::unreachable_2021!)
+ } else {
+ quote!(#krate::panic::unreachable_2015!)
+ };
+
+ // Pass the original arguments
+ call.token_trees.push(tt::TokenTree::Subtree(tt.clone()));
+ ExpandResult::ok(call)
+}
+
fn unquote_str(lit: &tt::Literal) -> Option<String> {
let lit = ast::make::tokens::literal(&lit.to_string());
let token = ast::String::cast(lit)?;
diff --git a/crates/hir_expand/src/name.rs b/crates/hir_expand/src/name.rs
index 7deec253da..f62c3ca0a0 100644
--- a/crates/hir_expand/src/name.rs
+++ b/crates/hir_expand/src/name.rs
@@ -253,6 +253,7 @@ pub mod known {
std_panic,
stringify,
trace_macros,
+ unreachable,
// Builtin derives
Copy,
Clone,