There are two crates here, library and consumer (which depends on library).
library:
#![feature(decl_macro)]
pub macro global_meow($item:expr) {
const _: () = {
fn foo() {
Meow::meow(&$item);
}
};
}
#[macro_export]
macro_rules! global_meow_rules {
($item:expr) => {
const _: () = {
fn foo() {
$crate::Meow::meow(&$item);
}
};
}
}
pub trait Meow {
fn meow(&self) {}
}
pub struct GlobalMeow;
impl Meow for GlobalMeow { }
pub(crate) struct PrivateMeow;
impl Meow for PrivateMeow { }
consumer:
static NOT_MEOW: usize = 0;
library::global_meow!(NOT_MEOW);
library::global_meow_rules!(NOT_MEOW);
fn main() {}
The current output is (when running cargo check on consumer):
# cargo check
Checking consumer v0.1.0 (/tmp/scratcho2FpPeJDq/consumer)
error[E0277]: the trait bound `usize: Meow` is not satisfied
--> src/main.rs:2:1
|
2 | library::global_meow!(NOT_MEOW);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize`
|
= help: the following other types implement trait `Meow`:
GlobalMeow
library::PrivateMeow
= note: this error originates in the macro `library::global_meow` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `usize: Meow` is not satisfied
--> src/main.rs:4:1
|
4 | library::global_meow_rules!(NOT_MEOW);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize`
|
= help: the following other types implement trait `Meow`:
GlobalMeow
library::PrivateMeow
= note: this error originates in the macro `library::global_meow_rules` (in Nightly builds, run with -Z macro-backtrace for more info)
Ideally the output should look like:
# cargo check
Checking consumer v0.1.0 (/tmp/scratcho2FpPeJDq/consumer)
error[E0277]: the trait bound `usize: Meow` is not satisfied
--> src/main.rs:2:1
|
2 | library::global_meow!(NOT_MEOW);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize`
|
= help: the following other types implement trait `Meow`:
GlobalMeow
= note: this error originates in the macro `library::global_meow` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0277]: the trait bound `usize: Meow` is not satisfied
--> src/main.rs:4:1
|
4 | library::global_meow_rules!(NOT_MEOW);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize`
|
= help: the following other types implement trait `Meow`:
GlobalMeow
= note: this error originates in the macro `library::global_meow_rules` (in Nightly builds, run with -Z macro-backtrace for more info)
We should not be suggesting private types to users, since macro hygiene does mean they can't write library::PrivateMeow
This is on the latest nightly, rustc 1.64.0-nightly (06754d885 2022-07-08)
This was ran into in #99074
There are two crates here,
libraryandconsumer(which depends onlibrary).library:
consumer:
The current output is (when running
cargo checkonconsumer):# cargo check Checking consumer v0.1.0 (/tmp/scratcho2FpPeJDq/consumer) error[E0277]: the trait bound `usize: Meow` is not satisfied --> src/main.rs:2:1 | 2 | library::global_meow!(NOT_MEOW); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize` | = help: the following other types implement trait `Meow`: GlobalMeow library::PrivateMeow = note: this error originates in the macro `library::global_meow` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `usize: Meow` is not satisfied --> src/main.rs:4:1 | 4 | library::global_meow_rules!(NOT_MEOW); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize` | = help: the following other types implement trait `Meow`: GlobalMeow library::PrivateMeow = note: this error originates in the macro `library::global_meow_rules` (in Nightly builds, run with -Z macro-backtrace for more info)Ideally the output should look like:
# cargo check Checking consumer v0.1.0 (/tmp/scratcho2FpPeJDq/consumer) error[E0277]: the trait bound `usize: Meow` is not satisfied --> src/main.rs:2:1 | 2 | library::global_meow!(NOT_MEOW); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize` | = help: the following other types implement trait `Meow`: GlobalMeow = note: this error originates in the macro `library::global_meow` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `usize: Meow` is not satisfied --> src/main.rs:4:1 | 4 | library::global_meow_rules!(NOT_MEOW); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Meow` is not implemented for `usize` | = help: the following other types implement trait `Meow`: GlobalMeow = note: this error originates in the macro `library::global_meow_rules` (in Nightly builds, run with -Z macro-backtrace for more info)We should not be suggesting private types to users, since macro hygiene does mean they can't write
library::PrivateMeowThis is on the latest nightly,
rustc 1.64.0-nightly (06754d885 2022-07-08)This was ran into in #99074