}))
} else {
let module = parent_scope.module;
- let vis = self.resolve_visibility(&item.vis);
+ let vis = match item.kind {
+ // Visibilities must not be resolved non-speculatively twice
+ // and we already resolved this one as a `fn` item visibility.
+ ItemKind::Fn(..) => self
+ .resolve_visibility_speculative(&item.vis, true)
+ .unwrap_or(ty::Visibility::Public),
+ _ => self.resolve_visibility(&item.vis),
+ };
if vis != ty::Visibility::Public {
self.insert_unused_macro(ident, item.id, span);
}
--- /dev/null
+// Proc macro defined with `pub(path)` doesn't ICEs due to resolving the `path` (issue #68921).
+
+// force-host
+// no-prefer-dynamic
+
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+use proc_macro::*;
+
+#[proc_macro]
+pub(self) fn outer(input: TokenStream) -> TokenStream {
+ //~^ ERROR functions tagged with `#[proc_macro]` must be `pub`
+ input
+}
+
+mod m {
+ use proc_macro::*;
+
+ #[proc_macro]
+ pub(super) fn inner(input: TokenStream) -> TokenStream {
+ //~^ ERROR functions tagged with `#[proc_macro]` must currently reside in the root
+ input
+ }
+}
--- /dev/null
+error: functions tagged with `#[proc_macro]` must be `pub`
+ --> $DIR/visibility-path.rs:12:1
+ |
+LL | pub(self) fn outer(input: TokenStream) -> TokenStream {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: functions tagged with `#[proc_macro]` must currently reside in the root of the crate
+ --> $DIR/visibility-path.rs:21:5
+ |
+LL | pub(super) fn inner(input: TokenStream) -> TokenStream {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+