1 use crate::{Diagnostic, DiagnosticsContext};
3 // Diagnostic: macro-error
5 // This diagnostic is shown for macro expansion errors.
6 pub(crate) fn macro_error(ctx: &DiagnosticsContext<'_>, d: &hir::MacroError) -> Diagnostic {
10 ctx.sema.diagnostics_display_range(d.node.clone()).range,
18 tests::{check_diagnostics, check_diagnostics_with_config},
23 fn builtin_macro_fails_expansion() {
26 #[rustc_builtin_macro]
27 macro_rules! include { () => {} }
29 #[rustc_builtin_macro]
30 macro_rules! compile_error { () => {} }
32 include!("doesntexist");
33 //^^^^^^^^^^^^^^^^^^^^^^^^ error: failed to load file `doesntexist`
35 compile_error!("compile_error macro works");
36 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: compile_error macro works
42 fn eager_macro_concat() {
43 // FIXME: this is incorrectly handling `$crate`, resulting in a wrong diagnostic.
44 // See: https://github.com/rust-analyzer/rust-analyzer/issues/10300
48 //- /lib.rs crate:lib deps:core
49 use core::{panic, concat};
57 panic!(concat!($crate::private::concat!("")));
63 //^^^^ error: unresolved macro `$crate::private::concat!`
66 //- /core.rs crate:core
68 #[rustc_builtin_macro]
69 macro_rules! concat { () => {} }
73 $crate::panicking::panic_str($msg)
81 fn include_macro_should_allow_empty_content() {
82 let mut config = DiagnosticsConfig::default();
84 // FIXME: This is a false-positive, the file is actually linked in via
86 config.disabled.insert("unlinked-file".to_string());
88 check_diagnostics_with_config(
92 #[rustc_builtin_macro]
93 macro_rules! include { () => {} }
95 include!("foo/bar.rs");
103 fn good_out_dir_diagnostic() {
106 #[rustc_builtin_macro]
107 macro_rules! include { () => {} }
108 #[rustc_builtin_macro]
109 macro_rules! env { () => {} }
110 #[rustc_builtin_macro]
111 macro_rules! concat { () => {} }
113 include!(concat!(env!("OUT_DIR"), "/out.rs"));
114 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: `OUT_DIR` not set, enable "run build scripts" to fix
120 fn register_attr_and_tool() {
121 cov_mark::check!(register_attr);
122 cov_mark::check!(register_tool);
125 #![register_tool(tool)]
126 #![register_attr(attr)]
133 // NB: we don't currently emit diagnostics here
137 fn macro_diag_builtin() {
140 #[rustc_builtin_macro]
143 #[rustc_builtin_macro]
144 macro_rules! include {}
146 #[rustc_builtin_macro]
147 macro_rules! compile_error {}
149 #[rustc_builtin_macro]
150 macro_rules! format_args { () => {} }
153 // Test a handful of built-in (eager) macros:
156 //^^^^^^^^^^^^^^^^^ error: could not convert tokens
157 include!("does not exist");
158 //^^^^^^^^^^^^^^^^^^^^^^^^^^ error: failed to load file `does not exist`
161 //^^^^^^^^^^^^^ error: could not convert tokens
164 //^^^^^^^^^^^^^^^ error: `OUT_DIR` not set, enable "run build scripts" to fix
166 compile_error!("compile_error works");
167 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: compile_error works
172 //^^^^^^^^^^^^^^ error: no rule matches input tokens
179 fn macro_rules_diag() {
189 //^^^^^^ error: leftover tokens
195 fn dollar_crate_in_builtin_macro() {
199 #[rustc_builtin_macro]
200 macro_rules! format_args {}
203 macro_rules! arg { () => {} }
208 $crate::format_args!( "", $crate::arg!(1) )
214 } //^^^^^^^^ error: leftover tokens