Suggest using integration tests for proc-macros
This commit is contained in:
parent
0d7ed3ba84
commit
f7581d8d21
5 changed files with 43 additions and 5 deletions
|
@ -223,3 +223,6 @@ resolve_remove_surrounding_derive =
|
||||||
resolve_add_as_non_derive =
|
resolve_add_as_non_derive =
|
||||||
add as non-Derive macro
|
add as non-Derive macro
|
||||||
`#[{$macro_path}]`
|
`#[{$macro_path}]`
|
||||||
|
|
||||||
|
resolve_proc_macro_same_crate = can't use a procedural macro from the same crate that defines it
|
||||||
|
.help = you can define integration tests in a directory named `tests`
|
||||||
|
|
|
@ -508,3 +508,12 @@ pub(crate) struct RemoveSurroundingDerive {
|
||||||
pub(crate) struct AddAsNonDerive<'a> {
|
pub(crate) struct AddAsNonDerive<'a> {
|
||||||
pub(crate) macro_path: &'a str,
|
pub(crate) macro_path: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(resolve_proc_macro_same_crate)]
|
||||||
|
pub(crate) struct ProcMacroSameCrate {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
#[help]
|
||||||
|
pub(crate) is_test: bool,
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! A bunch of methods and structures more or less related to resolving macros and
|
//! A bunch of methods and structures more or less related to resolving macros and
|
||||||
//! interface provided by `Resolver` to macro expander.
|
//! interface provided by `Resolver` to macro expander.
|
||||||
|
|
||||||
use crate::errors::{AddAsNonDerive, MacroExpectedFound, RemoveSurroundingDerive};
|
use crate::errors::{self, AddAsNonDerive, MacroExpectedFound, RemoveSurroundingDerive};
|
||||||
use crate::Namespace::*;
|
use crate::Namespace::*;
|
||||||
use crate::{BuiltinMacroState, Determinacy};
|
use crate::{BuiltinMacroState, Determinacy};
|
||||||
use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet};
|
use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet};
|
||||||
|
@ -513,10 +513,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
if let Some(def_id) = def_id.as_local() {
|
if let Some(def_id) = def_id.as_local() {
|
||||||
self.unused_macros.remove(&def_id);
|
self.unused_macros.remove(&def_id);
|
||||||
if self.proc_macro_stubs.contains(&def_id) {
|
if self.proc_macro_stubs.contains(&def_id) {
|
||||||
self.tcx.sess.span_err(
|
self.tcx.sess.emit_err(errors::ProcMacroSameCrate {
|
||||||
path.span,
|
span: path.span,
|
||||||
"can't use a procedural macro from the same crate that defines it",
|
is_test: self.tcx.sess.is_test_crate(),
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
16
tests/ui/proc-macro/test-same-crate.rs
Normal file
16
tests/ui/proc-macro/test-same-crate.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// compile-flags: --test
|
||||||
|
#![crate_type = "proc-macro"]
|
||||||
|
|
||||||
|
extern crate proc_macro;
|
||||||
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
#[proc_macro]
|
||||||
|
pub fn mac(input: TokenStream) -> TokenStream { loop {} }
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
#[test]
|
||||||
|
fn t() { crate::mac!(A) }
|
||||||
|
//~^ ERROR can't use a procedural macro from the same crate that defines it
|
||||||
|
//~| HELP you can define integration tests in a directory named `tests`
|
||||||
|
}
|
10
tests/ui/proc-macro/test-same-crate.stderr
Normal file
10
tests/ui/proc-macro/test-same-crate.stderr
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
error: can't use a procedural macro from the same crate that defines it
|
||||||
|
--> $DIR/test-same-crate.rs:13:14
|
||||||
|
|
|
||||||
|
LL | fn t() { crate::mac!(A) }
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: you can define integration tests in a directory named `tests`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue