Add extra check for #[doc(test(...)] attribute

This commit is contained in:
Guillaume Gomez 2021-03-02 21:10:05 +01:00
parent 6f32e3e187
commit a66bf524c2
2 changed files with 24 additions and 4 deletions

View File

@ -3061,14 +3061,17 @@ declare_lint! {
} }
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. /// misused.
/// ///
/// ### Example /// ### Example
/// ///
/// ```rust,compile_fail /// ```rust,compile_fail
/// #![deny(warnings)] /// #![deny(warnings)]
/// #[doc(test(no_crate_inject))] ///
/// pub mod submodule {
/// #![doc(test(no_crate_inject))]
/// }
/// ``` /// ```
/// ///
/// {{produces}} /// {{produces}}
@ -3083,6 +3086,6 @@ declare_lint! {
"detects invalid `#[doc(...)]` attributes", "detects invalid `#[doc(...)]` attributes",
@future_incompatible = FutureIncompatibleInfo { @future_incompatible = FutureIncompatibleInfo {
reference: "issue #82730 <https://github.com/rust-lang/rust/issues/82730>", reference: "issue #82730 <https://github.com/rust-lang/rust/issues/82730>",
edition: Some(Edition::Edition2021), edition: None,
}; };
} }

View File

@ -17,7 +17,9 @@ use rustc_hir::{
self, FnSig, ForeignItem, ForeignItemKind, HirId, Item, ItemKind, TraitItem, CRATE_HIR_ID, self, FnSig, ForeignItem, ForeignItemKind, HirId, Item, ItemKind, TraitItem, CRATE_HIR_ID,
}; };
use rustc_hir::{MethodKind, Target}; 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_session::parse::feature_err;
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::{sym, Symbol};
use rustc_span::{Span, DUMMY_SP}; use rustc_span::{Span, DUMMY_SP};
@ -544,6 +546,21 @@ impl CheckAttrVisitor<'tcx> {
{ {
return false; 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() { } else if let Some(i_meta) = meta.meta_item() {
if ![ if ![
sym::cfg, sym::cfg,