]> git.lizzy.rs Git - rust.git/commitdiff
resolve: Do not resolve visibilities on proc macro definitions twice
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 21 Mar 2020 14:51:29 +0000 (17:51 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Mon, 23 Mar 2020 08:40:58 +0000 (11:40 +0300)
src/librustc_resolve/build_reduced_graph.rs
src/test/ui/proc-macro/visibility-path.rs [new file with mode: 0644]
src/test/ui/proc-macro/visibility-path.stderr [new file with mode: 0644]

index 77d6e4560ab9374960233e5dc814a713cfa92476..db500a8b1fd5d7b570127a8d7dc0d15f6badb49f 100644 (file)
@@ -1149,7 +1149,14 @@ fn define_macro(&mut self, item: &ast::Item) -> MacroRulesScope<'a> {
             }))
         } 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);
             }
diff --git a/src/test/ui/proc-macro/visibility-path.rs b/src/test/ui/proc-macro/visibility-path.rs
new file mode 100644 (file)
index 0000000..a73430d
--- /dev/null
@@ -0,0 +1,25 @@
+// 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
+    }
+}
diff --git a/src/test/ui/proc-macro/visibility-path.stderr b/src/test/ui/proc-macro/visibility-path.stderr
new file mode 100644 (file)
index 0000000..1a73cc1
--- /dev/null
@@ -0,0 +1,14 @@
+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
+