-
Notifications
You must be signed in to change notification settings - Fork 13.9k
Description
Procedural macros generate tokens, but sometimes the information is kept not in tokens, but rather in the lack of them.
Look at the struct S in the macro below, it doesn't have a pub annotation, so it's private and "private" is desugared into pub(self) where self is the current module, but "current module" depends on the location from which we resolve self.
mod m {
pub macro mac() {
struct S;
}
}
m::mac!();
fn main() {}If self is resolved from the macro def-site, then the current module is m, if self is resolved from the macro call-site, then the current module is crate root.
The question is what kind of self is implicitly generated for private items from macros.
Unfortunately, as far as I know, the only viable answer right now is self is the module in which the item will end up after all the macro expansions (i.e. "transitive call-site").
There are some alternatives potentially (#40847 (comment)), but if self is resolved from def site, then we'll get "visibilities can only be restricted to ancestor modules" errors and also conservative type privacy errors on every use of the generated struct.
These issues are probably resolvable, but they require nontrivial amount of design and implementation work and we can't delay stabilization of items-without-pub defined by macros until then.