diff options
| author | Guillaume Gomez <guillaume.gomez@huawei.com> | 2021-08-03 14:04:27 +0200 |
|---|---|---|
| committer | Guillaume Gomez <guillaume.gomez@huawei.com> | 2021-08-16 23:17:26 +0200 |
| commit | cbfe8749c2bef9b4a0b9c1c8637e3ee578caf038 (patch) | |
| tree | c9470b78830dd981203df31fb276e8ff942335fa | |
| parent | 0035d9dcecee49d1f7349932bfa52c05a6f83641 (diff) | |
| download | rust-cbfe8749c2bef9b4a0b9c1c8637e3ee578caf038.tar.gz rust-cbfe8749c2bef9b4a0b9c1c8637e3ee578caf038.zip | |
Add check for doc(test(...)) attribute
| -rw-r--r-- | compiler/rustc_passes/src/check_attr.rs | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 1bb6b899875..3fea75954b9 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -717,6 +717,42 @@ impl CheckAttrVisitor<'tcx> { true } + /// Checks that `doc(test(...))` attribute contains only valid attributes. Returns `true` if + /// valid. + fn check_test_attr(&self, meta: &NestedMetaItem, hir_id: HirId) -> bool { + let mut is_valid = true; + if let Some(metas) = meta.meta_item_list() { + for i_meta in metas { + match i_meta.name_or_empty() { + sym::attr | sym::no_crate_inject => {} + _ => { + self.tcx.struct_span_lint_hir( + INVALID_DOC_ATTRIBUTES, + hir_id, + i_meta.span(), + |lint| { + lint.build(&format!( + "unknown `doc(test)` attribute `{}`", + rustc_ast_pretty::pprust::path_to_string( + &i_meta.meta_item().unwrap().path + ), + )) + .emit(); + }, + ); + is_valid = false; + } + } + } + } else { + self.tcx.struct_span_lint_hir(INVALID_DOC_ATTRIBUTES, hir_id, meta.span(), |lint| { + lint.build("`#[doc(test(...)]` takes a list of attributes").emit(); + }); + is_valid = false; + } + is_valid + } + /// Runs various checks on `#[doc]` attributes. Returns `true` if valid. /// /// `specified_inline` should be initialized to `None` and kept for the scope @@ -793,8 +829,13 @@ impl CheckAttrVisitor<'tcx> { | sym::no_inline | sym::notable_trait | sym::passes - | sym::plugins - | sym::test => {} + | sym::plugins => {} + + sym::test => { + if !self.check_test_attr(&meta, hir_id) { + is_valid = false; + } + } sym::primitive => { if !self.tcx.features().doc_primitive { |
