Suppose I had these two files:
// foo.rs
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro]
pub fn foo(x: TokenStream) -> TokenStream {
x
}
// bar.rs
extern crate foo;
use foo::foo;
fn main() {
foo!();
}
When I try to compile these files with rustc foo.rs && rustc bar.rs -L.
, I get the following errors:
warning: proc macro crates and `#[no_link]` crates have no effect without `#[macro_use]`
--> bar.rs:1:1
|
1 | extern crate foo;
| ^^^^^^^^^^^^^^^^^
error[E0432]: unresolved import `foo::foo`
--> bar.rs:2:5
|
2 | use foo::foo;
| ^^^^^^^^ no `foo` in the root
error: cannot find macro `foo!` in this scope
--> bar.rs:5:5
|
5 | foo!();
| ^^^
error: aborting due to 2 previous errors
Now, if I follow the compiler's advice and try #[macro_use]
instead, I'm presented with this error:
error: procedural macros cannot be imported with `#[macro_use]`
--> bar.rs:5:5
|
5 | foo!();
| ^^^
|
= help: instead, import the procedural macro like any other item: `use foo::foo;`
error: aborting due to previous error
But that's what I had in the first place!
The real solution to this problem is to add #![feature(use_extern_macros)]
to bar.rs
. The compiler should suggest this instead when it encounters a function-like proc macro.
It might be a easy fix to at least change the diagnostic message to also suggest adding #![feature(proc_macro)]
to bar.rs
for the short term. (Or have the diagnostic first check if that feature is enable before making the suggestion.) I don't mind having a redundant portion of the suggestion as long as the it covers the real problem as well.
Now with nightly I even get: warning: this feature has been stable since 1.29.0. Attribute no longer needed
for #![feature(proc_macro)]
.
But I still have the same issues as @lfairy. And now if I want to use my macro I get error: cannot find macro 'my_macro!' in this scope
. But If I add use my_crate::my_macro;
I get error[E0432]: unresolved import 'my_crate::my_macro'
.
It seems one now needs to replace the feature proc_macro
with use_extern_macros
. That would be a helpful hint in the Attribute is no longer needed
message.. ;)
Many features here have been stabilized, so this is likely stale, so closing.
Most helpful comment
Now with nightly I even get:
warning: this feature has been stable since 1.29.0. Attribute no longer needed
for#![feature(proc_macro)]
.But I still have the same issues as @lfairy. And now if I want to use my macro I get
error: cannot find macro 'my_macro!' in this scope
. But If I adduse my_crate::my_macro;
I geterror[E0432]: unresolved import 'my_crate::my_macro'
.It seems one now needs to replace the feature
proc_macro
withuse_extern_macros
. That would be a helpful hint in theAttribute is no longer needed
message.. ;)