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 =
|
passes_implied_feature_not_exist =
|
||||||
feature `{$implied_by}` implying `{$feature}` does 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 =
|
passes_incorrect_do_not_recommend_location =
|
||||||
`#[diagnostic::do_not_recommend]` can only be placed on trait implementations
|
`#[diagnostic::do_not_recommend]` can only be placed on trait implementations
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
||||||
for attr in attrs {
|
for attr in attrs {
|
||||||
match attr.path().as_slice() {
|
match attr.path().as_slice() {
|
||||||
[sym::diagnostic, sym::do_not_recommend, ..] => {
|
[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, ..] => {
|
[sym::diagnostic, sym::on_unimplemented, ..] => {
|
||||||
self.check_diagnostic_on_unimplemented(attr.span, hir_id, target)
|
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.
|
/// 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) {
|
if !matches!(target, Target::Impl) {
|
||||||
self.tcx.emit_node_span_lint(
|
self.tcx.emit_node_span_lint(
|
||||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||||
|
@ -357,6 +363,14 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
||||||
errors::IncorrectDoNotRecommendLocation,
|
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
|
/// 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)]
|
#[diag(passes_incorrect_do_not_recommend_location)]
|
||||||
pub(crate) struct IncorrectDoNotRecommendLocation;
|
pub(crate) struct IncorrectDoNotRecommendLocation;
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(passes_incorrect_do_not_recommend_args)]
|
||||||
|
pub(crate) struct DoNotRecommendDoesNotExpectArgs;
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(passes_autodiff_attr)]
|
#[diag(passes_autodiff_attr)]
|
||||||
pub(crate) struct AutoDiffAttr {
|
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