Skip to content

Commit

Permalink
Don't report deprecation lints in derive expansions
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Mar 16, 2019
1 parent 2c8bbf5 commit a69e12c
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 2 deletions.
17 changes: 16 additions & 1 deletion src/librustc/lint/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,8 @@ pub fn provide(providers: &mut Providers<'_>) {

/// Returns whether `span` originates in a foreign crate's external macro.
///
/// This is used to test whether a lint should be entirely aborted above.
/// This is used to test whether a lint should not even begin to figure out whether it should
/// be reported on the current node.
pub fn in_external_macro(sess: &Session, span: Span) -> bool {
let info = match span.ctxt().outer().expn_info() {
Some(info) => info,
Expand All @@ -859,3 +860,17 @@ pub fn in_external_macro(sess: &Session, span: Span) -> bool {
Err(_) => true,
}
}

/// Returns whether `span` originates in a derive macro's expansion
pub fn in_derive_expansion(span: Span) -> bool {
let info = match span.ctxt().outer().expn_info() {
Some(info) => info,
// no ExpnInfo means this span doesn't come from a macro
None => return false,
};

match info.format {
ExpnFormat::MacroAttribute(symbol) => symbol.as_str().starts_with("derive("),
_ => false,
}
}
5 changes: 4 additions & 1 deletion src/librustc/middle/stability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
pub use self::StabilityLevel::*;

use crate::lint::{self, Lint};
use crate::lint::{self, Lint, in_derive_expansion};
use crate::hir::{self, Item, Generics, StructField, Variant, HirId};
use crate::hir::def::Def;
use crate::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId, LOCAL_CRATE};
Expand Down Expand Up @@ -561,6 +561,9 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
suggestion: Option<Symbol>,
message: &str,
lint: &'static Lint| {
if in_derive_expansion(span) {
return;
}
let msg = if let Some(note) = note {
format!("{}: {}", message, note)
} else {
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/deprecation/derive_on_deprecated.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// compile-pass

#![deny(deprecated)]

#[deprecated = "oh no"]
#[derive(Default)]
struct X;

fn main() {}
9 changes: 9 additions & 0 deletions src/test/ui/deprecation/derive_on_deprecated_forbidden.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// compile-pass

#![forbid(deprecated)]

#[deprecated = "oh no"]
#[derive(Default)]
struct X;

fn main() {}

0 comments on commit a69e12c

Please sign in to comment.