Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/macro_error.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/macro_error.rs32
1 files changed, 29 insertions, 3 deletions
diff --git a/crates/ide-diagnostics/src/handlers/macro_error.rs b/crates/ide-diagnostics/src/handlers/macro_error.rs
index e177b72e4d..99894fefef 100644
--- a/crates/ide-diagnostics/src/handlers/macro_error.rs
+++ b/crates/ide-diagnostics/src/handlers/macro_error.rs
@@ -4,13 +4,13 @@ use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext, Severity};
//
// This diagnostic is shown for macro expansion errors.
-// Diagnostic: proc-macros-disabled
+// Diagnostic: attribute-expansion-disabled
//
-// This diagnostic is shown for proc macros where proc macros have been disabled.
+// This diagnostic is shown for attribute proc macros when attribute expansions have been disabled.
// Diagnostic: proc-macro-disabled
//
-// This diagnostic is shown for proc macros that has been specifically disabled via `rust-analyzer.procMacro.ignored`.
+// This diagnostic is shown for proc macros that have been specifically disabled via `rust-analyzer.procMacro.ignored`.
pub(crate) fn macro_error(ctx: &DiagnosticsContext<'_>, d: &hir::MacroError) -> Diagnostic {
// Use more accurate position if available.
let display_range = ctx.resolve_precise_location(&d.node, d.precise_location);
@@ -291,4 +291,30 @@ mod prim_never {}
"#,
);
}
+
+ #[test]
+ fn no_stack_overflow_for_missing_binding() {
+ check_diagnostics(
+ r#"
+#[macro_export]
+macro_rules! boom {
+ (
+ $($code:literal),+,
+ $(param: $param:expr,)?
+ ) => {{
+ let _ = $crate::boom!(@param $($param)*);
+ }};
+ (@param) => { () };
+ (@param $param:expr) => { $param };
+}
+
+fn it_works() {
+ // NOTE: there is an error, but RA crashes before showing it
+ boom!("RAND", param: c7.clone());
+ // ^^^^^ error: expected literal
+}
+
+ "#,
+ );
+ }
}