coverage: Always error on #[coverage(..)] in unexpected places · rust-lang/rust@b7c057c (original) (raw)

`@@ -122,7 +122,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {

`

122

122

`self.check_diagnostic_on_unimplemented(attr.span, hir_id, target)

`

123

123

`}

`

124

124

`[sym::inline] => self.check_inline(hir_id, attr, span, target),

`

125

``

`-

[sym::coverage] => self.check_coverage(hir_id, attr, span, target),

`

``

125

`+

[sym::coverage] => self.check_coverage(attr, span, target),

`

126

126

`[sym::non_exhaustive] => self.check_non_exhaustive(hir_id, attr, span, target),

`

127

127

`[sym::marker] => self.check_marker(hir_id, attr, span, target),

`

128

128

`[sym::target_feature] => {

`

`@@ -369,47 +369,15 @@ impl<'tcx> CheckAttrVisitor<'tcx> {

`

369

369

`}

`

370

370

`}

`

371

371

``

372

``

`` -

/// Checks if a #[coverage] is applied directly to a function

``

373

``

`-

fn check_coverage(&self, hir_id: HirId, attr: &Attribute, span: Span, target: Target) -> bool {

`

``

372

`` +

/// Checks that #[coverage(..)] is applied to a function or closure.

``

``

373

`+

fn check_coverage(&self, attr: &Attribute, span: Span, target: Target) -> bool {

`

374

374

`match target {

`

375

``

`-

// #[coverage] on function is fine

`

``

375

`+

// #[coverage(..)] on function is fine

`

376

376

`Target::Fn

`

377

377

` | Target::Closure

`

378

378

` | Target::Method(MethodKind::Trait { body: true } | MethodKind::Inherent) => true,

`

379

``

-

380

``

`-

// function prototypes can't be covered

`

381

``

`-

Target::Method(MethodKind::Trait { body: false }) | Target::ForeignFn => {

`

382

``

`-

self.tcx.emit_node_span_lint(

`

383

``

`-

UNUSED_ATTRIBUTES,

`

384

``

`-

hir_id,

`

385

``

`-

attr.span,

`

386

``

`-

errors::IgnoredCoverageFnProto,

`

387

``

`-

);

`

388

``

`-

true

`

389

``

`-

}

`

390

``

-

391

``

`-

Target::Mod | Target::ForeignMod | Target::Impl | Target::Trait => {

`

392

``

`-

self.tcx.emit_node_span_lint(

`

393

``

`-

UNUSED_ATTRIBUTES,

`

394

``

`-

hir_id,

`

395

``

`-

attr.span,

`

396

``

`-

errors::IgnoredCoveragePropagate,

`

397

``

`-

);

`

398

``

`-

true

`

399

``

`-

}

`

400

``

-

401

``

`-

Target::Expression | Target::Statement | Target::Arm => {

`

402

``

`-

self.tcx.emit_node_span_lint(

`

403

``

`-

UNUSED_ATTRIBUTES,

`

404

``

`-

hir_id,

`

405

``

`-

attr.span,

`

406

``

`-

errors::IgnoredCoverageFnDefn,

`

407

``

`-

);

`

408

``

`-

true

`

409

``

`-

}

`

410

``

-

411

379

` _ => {

`

412

``

`-

self.dcx().emit_err(errors::IgnoredCoverageNotCoverable {

`

``

380

`+

self.dcx().emit_err(errors::CoverageNotFnOrClosure {

`

413

381

`attr_span: attr.span,

`

414

382

`defn_span: span,

`

415

383

`});

`