Check #[diagnostic::do_not_recommend]
for arguments
This commit adds a check that verifies that no arguments are passed to `#[diagnostic::do_not_recommend]`. If we detect arguments we emit a warning.
This commit is contained in:
parent
bfd02d8b36
commit
ecb6fd8d3a
6 changed files with 91 additions and 2 deletions
|
@ -357,6 +357,9 @@ passes_ignored_derived_impls =
|
|||
passes_implied_feature_not_exist =
|
||||
feature `{$implied_by}` implying `{$feature}` does not exist
|
||||
|
||||
passes_incorrect_do_not_recommend_args =
|
||||
`#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
|
||||
passes_incorrect_do_not_recommend_location =
|
||||
`#[diagnostic::do_not_recommend]` can only be placed on trait implementations
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
for attr in attrs {
|
||||
match attr.path().as_slice() {
|
||||
[sym::diagnostic, sym::do_not_recommend, ..] => {
|
||||
self.check_do_not_recommend(attr.span, hir_id, target)
|
||||
self.check_do_not_recommend(attr.span, hir_id, target, attr)
|
||||
}
|
||||
[sym::diagnostic, sym::on_unimplemented, ..] => {
|
||||
self.check_diagnostic_on_unimplemented(attr.span, hir_id, target)
|
||||
|
@ -348,7 +348,13 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
}
|
||||
|
||||
/// Checks if `#[diagnostic::do_not_recommend]` is applied on a trait impl.
|
||||
fn check_do_not_recommend(&self, attr_span: Span, hir_id: HirId, target: Target) {
|
||||
fn check_do_not_recommend(
|
||||
&self,
|
||||
attr_span: Span,
|
||||
hir_id: HirId,
|
||||
target: Target,
|
||||
attr: &Attribute,
|
||||
) {
|
||||
if !matches!(target, Target::Impl) {
|
||||
self.tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
|
@ -357,6 +363,14 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
errors::IncorrectDoNotRecommendLocation,
|
||||
);
|
||||
}
|
||||
if !attr.is_word() {
|
||||
self.tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
hir_id,
|
||||
attr_span,
|
||||
errors::DoNotRecommendDoesNotExpectArgs,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Checks if `#[diagnostic::on_unimplemented]` is applied to a trait definition
|
||||
|
|
|
@ -20,6 +20,10 @@ use crate::lang_items::Duplicate;
|
|||
#[diag(passes_incorrect_do_not_recommend_location)]
|
||||
pub(crate) struct IncorrectDoNotRecommendLocation;
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(passes_incorrect_do_not_recommend_args)]
|
||||
pub(crate) struct DoNotRecommendDoesNotExpectArgs;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_autodiff_attr)]
|
||||
pub(crate) struct AutoDiffAttr {
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
warning: `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
--> $DIR/does_not_acccept_args.rs:12:1
|
||||
|
|
||||
LL | #[diagnostic::do_not_recommend(not_accepted)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unknown_or_malformed_diagnostic_attributes)]` on by default
|
||||
|
||||
warning: `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
--> $DIR/does_not_acccept_args.rs:16:1
|
||||
|
|
||||
LL | #[diagnostic::do_not_recommend(not_accepted = "foo")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
--> $DIR/does_not_acccept_args.rs:20:1
|
||||
|
|
||||
LL | #[diagnostic::do_not_recommend(not_accepted(42))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: 3 warnings emitted
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
warning: `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
--> $DIR/does_not_acccept_args.rs:12:1
|
||||
|
|
||||
LL | #[diagnostic::do_not_recommend(not_accepted)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unknown_or_malformed_diagnostic_attributes)]` on by default
|
||||
|
||||
warning: `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
--> $DIR/does_not_acccept_args.rs:16:1
|
||||
|
|
||||
LL | #[diagnostic::do_not_recommend(not_accepted = "foo")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
--> $DIR/does_not_acccept_args.rs:20:1
|
||||
|
|
||||
LL | #[diagnostic::do_not_recommend(not_accepted(42))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: 3 warnings emitted
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
//@ check-pass
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
|
||||
#![feature(do_not_recommend)]
|
||||
|
||||
trait Foo {}
|
||||
trait Bar {}
|
||||
trait Baz {}
|
||||
|
||||
#[diagnostic::do_not_recommend(not_accepted)]
|
||||
//~^ WARNING `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
impl<T> Foo for T where T: Send {}
|
||||
|
||||
#[diagnostic::do_not_recommend(not_accepted = "foo")]
|
||||
//~^ WARNING `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
impl<T> Bar for T where T: Send {}
|
||||
|
||||
#[diagnostic::do_not_recommend(not_accepted(42))]
|
||||
//~^ WARNING `#[diagnostic::do_not_recommend]` does not expect any arguments
|
||||
impl<T> Baz for T where T: Send {}
|
||||
|
||||
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue