From a66bf524c298ff177c3d3046ff8f2d02a81e4bc9 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 2 Mar 2021 21:10:05 +0100 Subject: [PATCH] Add extra check for #[doc(test(...)] attribute --- compiler/rustc_lint_defs/src/builtin.rs | 9 ++++++--- compiler/rustc_passes/src/check_attr.rs | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 11d973dd1d8..b099dcf0300 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -3061,14 +3061,17 @@ declare_lint! { } declare_lint! { - /// The `invalid_doc_attributes` lint detects when the `#[doc(...)]` is + /// The `invalid_doc_attribute` lint detects when the `#[doc(...)]` is /// misused. /// /// ### Example /// /// ```rust,compile_fail /// #![deny(warnings)] - /// #[doc(test(no_crate_inject))] + /// + /// pub mod submodule { + /// #![doc(test(no_crate_inject))] + /// } /// ``` /// /// {{produces}} @@ -3083,6 +3086,6 @@ declare_lint! { "detects invalid `#[doc(...)]` attributes", @future_incompatible = FutureIncompatibleInfo { reference: "issue #82730 ", - edition: Some(Edition::Edition2021), + edition: None, }; } diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 39245ea77e5..c84d29428ad 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -17,7 +17,9 @@ 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::lint::builtin::{ + CONFLICTING_REPR_HINTS, INVALID_DOC_ATTRIBUTE, UNUSED_ATTRIBUTES, +}; use rustc_session::parse::feature_err; use rustc_span::symbol::{sym, Symbol}; use rustc_span::{Span, DUMMY_SP}; @@ -544,6 +546,21 @@ impl CheckAttrVisitor<'tcx> { { return false; } + } else if meta.has_name(sym::test) { + if CRATE_HIR_ID != hir_id { + self.tcx.struct_span_lint_hir( + INVALID_DOC_ATTRIBUTE, + hir_id, + meta.span(), + |lint| { + lint.build( + "`#![doc(test(...)]` is only allowed as a crate level attribute" + ) + .emit(); + }, + ); + return false; + } } else if let Some(i_meta) = meta.meta_item() { if ![ sym::cfg,