]> git.lizzy.rs Git - rust.git/commitdiff
Prevent #[doc(alias = "...")] at crate level
authorGuillaume Gomez <guillaume1.gomez@gmail.com>
Fri, 4 Sep 2020 15:12:53 +0000 (17:12 +0200)
committerGuillaume Gomez <guillaume1.gomez@gmail.com>
Sat, 3 Oct 2020 19:33:47 +0000 (21:33 +0200)
compiler/rustc_hir/src/target.rs
compiler/rustc_passes/src/check_attr.rs

index 1efc8bc3124b6ca6919e2073e5dd1ba590e2ee9b..fd6a312ef3af967cfc8ba2953f39fa5758d13576 100644 (file)
@@ -9,13 +9,13 @@
 
 use std::fmt::{self, Display};
 
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Debug)]
 pub enum MethodKind {
     Trait { body: bool },
     Inherent,
 }
 
-#[derive(Copy, Clone, PartialEq)]
+#[derive(Copy, Clone, PartialEq, Debug)]
 pub enum Target {
     ExternCrate,
     Use,
index b52216c45ce95a2cbff447b33b50691db12a3f47..8d64465b2442470603d560f4717b521499778140 100644 (file)
@@ -13,7 +13,7 @@
 use rustc_hir as hir;
 use rustc_hir::def_id::LocalDefId;
 use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
-use rustc_hir::{self, FnSig, ForeignItem, ForeignItemKind, HirId, Item, ItemKind, TraitItem};
+use rustc_hir::{self, FnSig, ForeignItem, ForeignItemKind, HirId, Item, ItemKind, TraitItem, CRATE_HIR_ID};
 use rustc_hir::{MethodKind, Target};
 use rustc_session::lint::builtin::{CONFLICTING_REPR_HINTS, UNUSED_ATTRIBUTES};
 use rustc_session::parse::feature_err;
@@ -333,6 +333,17 @@ fn check_doc_alias(&self, attr: &Attribute, hir_id: HirId, target: Target) -> bo
                                 .emit();
                             return false;
                         }
+                        if CRATE_HIR_ID == hir_id {
+                            self.tcx
+                                .sess
+                                .struct_span_err(
+                                    meta.span(),
+                                    "`#![doc(alias = \"...\")]` isn't allowed as a crate \
+                                     level attribute",
+                                )
+                                .emit();
+                            return false;
+                        }
                     }
                 }
             }
@@ -811,6 +822,11 @@ fn is_c_like_enum(item: &Item<'_>) -> bool {
 fn check_mod_attrs(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
     tcx.hir()
         .visit_item_likes_in_module(module_def_id, &mut CheckAttrVisitor { tcx }.as_deep_visitor());
+    if module_def_id.is_top_level_module() {
+        for attr in tcx.hir().krate_attrs() {
+            CheckAttrVisitor { tcx }.check_doc_alias(attr, CRATE_HIR_ID, Target::Mod);
+        }
+    }
 }
 
 pub(crate) fn provide(providers: &mut Providers) {