Skip to content
Closed
2 changes: 1 addition & 1 deletion src/libcore/marker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ pub trait Sized {
/// `Unsize` is implemented for:
///
/// - `[T; N]` is `Unsize<[T]>`
/// - `T` is `Unsize<Trait>` when `T: Trait`
/// - `T` is `Unsize<dyn Trait>` when `T: Trait`
/// - `Foo<..., T, ...>` is `Unsize<Foo<..., U, ...>>` if:
/// - `T: Unsize<U>`
/// - Foo is a struct
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/hir/itemlikevisit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ pub trait ItemLikeVisitor<'hir> {
fn visit_impl_item(&mut self, impl_item: &'hir ImplItem);
}

pub struct DeepVisitor<'v, V: 'v> {
pub struct DeepVisitor<'v, V> {
visitor: &'v mut V,
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc/infer/nll_relate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -800,7 +800,7 @@ impl<'me, 'tcx> TypeVisitor<'tcx> for ScopeInstantiator<'me, 'tcx> {
/// [blog post]: https://is.gd/0hKvIr
struct TypeGeneralizer<'me, 'tcx, D>
where
D: TypeRelatingDelegate<'tcx> + 'me,
D: TypeRelatingDelegate<'tcx>,
{
infcx: &'me InferCtxt<'me, 'tcx>,

Expand Down
1 change: 0 additions & 1 deletion src/librustc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#![deny(rust_2018_idioms)]
#![deny(internal)]
#![deny(unused_lifetimes)]
#![allow(explicit_outlives_requirements)]

#![feature(arbitrary_self_types)]
#![feature(box_patterns)]
Expand Down
6 changes: 3 additions & 3 deletions src/librustc/ty/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ pub struct CommonConsts<'tcx> {
pub err: &'tcx Const<'tcx>,
}

pub struct LocalTableInContext<'a, V: 'a> {
pub struct LocalTableInContext<'a, V> {
local_id_root: Option<DefId>,
data: &'a ItemLocalMap<V>
}
Expand Down Expand Up @@ -294,7 +294,7 @@ impl<'a, V> ::std::ops::Index<hir::HirId> for LocalTableInContext<'a, V> {
}
}

pub struct LocalTableInContextMut<'a, V: 'a> {
pub struct LocalTableInContextMut<'a, V> {
local_id_root: Option<DefId>,
data: &'a mut ItemLocalMap<V>
}
Expand Down Expand Up @@ -2171,7 +2171,7 @@ impl<'tcx> TyCtxt<'tcx> {


/// An entry in an interner.
struct Interned<'tcx, T: 'tcx+?Sized>(&'tcx T);
struct Interned<'tcx, T: ?Sized>(&'tcx T);

impl<'tcx, T: 'tcx+?Sized> Clone for Interned<'tcx, T> {
fn clone(&self) -> Self {
Expand Down
4 changes: 2 additions & 2 deletions src/librustc/ty/query/plumbing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ macro_rules! profq_query_msg {

/// A type representing the responsibility to execute the job in the `job` field.
/// This will poison the relevant query if dropped.
pub(super) struct JobOwner<'a, 'tcx, Q: QueryDescription<'tcx> + 'a> {
pub(super) struct JobOwner<'a, 'tcx, Q: QueryDescription<'tcx>> {
cache: &'a Lock<QueryCache<'tcx, Q>>,
key: Q::Key,
job: Lrc<QueryJob<'tcx>>,
Expand Down Expand Up @@ -230,7 +230,7 @@ pub struct CycleError<'tcx> {
}

/// The result of `try_get_lock`
pub(super) enum TryGetJob<'a, 'tcx, D: QueryDescription<'tcx> + 'a> {
pub(super) enum TryGetJob<'a, 'tcx, D: QueryDescription<'tcx>> {
/// The query is not yet started. Contains a guard to the cache eventually used to start it.
NotYetStarted(JobOwner<'a, 'tcx, D>),

Expand Down
1 change: 0 additions & 1 deletion src/librustc_codegen_llvm/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
#![deny(rust_2018_idioms)]
#![deny(internal)]
#![deny(unused_lifetimes)]
#![allow(explicit_outlives_requirements)]

use back::write::{create_target_machine, create_informational_target_machine};
use syntax_pos::symbol::Symbol;
Expand Down
1 change: 0 additions & 1 deletion src/librustc_codegen_ssa/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#![deny(rust_2018_idioms)]
#![deny(internal)]
#![deny(unused_lifetimes)]
#![allow(explicit_outlives_requirements)]

#![recursion_limit="256"]

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/dataflow/graphviz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ impl<'a, 'tcx, BD> MirWithFlowState<'tcx> for DataflowBuilder<'a, 'tcx, BD>
fn flow_state(&self) -> &DataflowState<'tcx, Self::BD> { &self.flow_state.flow_state }
}

struct Graph<'a, 'tcx, MWF:'a, P> where
struct Graph<'a, 'tcx, MWF, P> where
MWF: MirWithFlowState<'tcx>
{
mbcx: &'a MWF,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/dataflow/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ where

struct PropagationContext<'b, 'a, 'tcx, O>
where
O: 'b + BitDenotation<'tcx>,
O: BitDenotation<'tcx>,
{
builder: &'b mut DataflowAnalysis<'a, 'tcx, O>,
}
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/interpret/intern.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use super::{
};
use crate::const_eval::{CompileTimeInterpreter, CompileTimeEvalContext};

struct InternVisitor<'rt, 'mir: 'rt, 'tcx: 'rt + 'mir> {
struct InternVisitor<'rt, 'mir, 'tcx> {
/// previously encountered safe references
ref_tracking: &'rt mut RefTracking<(MPlaceTy<'tcx>, Mutability, InternMode)>,
ecx: &'rt mut CompileTimeEvalContext<'mir, 'tcx>,
Expand Down
1 change: 0 additions & 1 deletion src/librustc_mir/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ Rust MIR: a lowered representation of Rust. Also: an experiment!
#![deny(rust_2018_idioms)]
#![deny(internal)]
#![deny(unused_lifetimes)]
#![allow(explicit_outlives_requirements)]

#[macro_use] extern crate log;
#[macro_use]
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/util/elaborate_drops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ pub trait DropElaborator<'a, 'tcx>: fmt::Debug {
#[derive(Debug)]
struct DropCtxt<'l, 'b, 'tcx, D>
where
D: DropElaborator<'b, 'tcx> + 'l,
D: DropElaborator<'b, 'tcx>,
{
elaborator: &'l mut D,

Expand Down
1 change: 0 additions & 1 deletion src/librustc_typeck/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ This API is completely unstable and subject to change.
#![deny(rust_2018_idioms)]
#![deny(internal)]
#![deny(unused_lifetimes)]
#![allow(explicit_outlives_requirements)]

#[macro_use] extern crate log;
#[macro_use] extern crate syntax;
Expand Down
21 changes: 11 additions & 10 deletions src/libsyntax/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,10 @@ impl<'a> StripUnconfigured<'a> {
/// is in the original source file. Gives a compiler error if the syntax of
/// the attribute is incorrect.
fn process_cfg_attr(&mut self, attr: ast::Attribute) -> Vec<ast::Attribute> {
if !attr.check_name(sym::cfg_attr) {
if attr.path != sym::cfg_attr {
return vec![attr];
}
if attr.tokens.len() == 0 {
if attr.tokens.is_empty() {
self.sess.span_diagnostic
.struct_span_err(
attr.span,
Expand All @@ -108,7 +108,7 @@ impl<'a> StripUnconfigured<'a> {
<https://doc.rust-lang.org/reference/conditional-compilation.html\
#the-cfg_attr-attribute>")
.emit();
return Vec::new();
return vec![];
}

let (cfg_predicate, expanded_attrs) = match attr.parse(self.sess, |parser| {
Expand All @@ -133,17 +133,18 @@ impl<'a> StripUnconfigured<'a> {
Ok(result) => result,
Err(mut e) => {
e.emit();
return Vec::new();
return vec![];
}
};

// Check feature gate and lint on zero attributes in source. Even if the feature is gated,
// we still compute as if it wasn't, since the emitted error will stop compilation further
// along the compilation.
if expanded_attrs.len() == 0 {
// FIXME: Emit unused attribute lint here.
// Lint on zero attributes in source.
if expanded_attrs.is_empty() {
return vec![attr];
}

// At this point we know the attribute is considered used.
attr::mark_used(&attr);

if attr::cfg_matches(&cfg_predicate, self.sess, self.features) {
// We call `process_cfg_attr` recursively in case there's a
// `cfg_attr` inside of another `cfg_attr`. E.g.
Expand All @@ -159,7 +160,7 @@ impl<'a> StripUnconfigured<'a> {
}))
.collect()
} else {
Vec::new()
vec![]
}
}

Expand Down
4 changes: 0 additions & 4 deletions src/libsyntax/ext/derive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,6 @@ pub fn collect_derives(cx: &mut ExtCtxt<'_>, attrs: &mut Vec<ast::Attribute>) ->

match attr.parse_list(cx.parse_sess,
|parser| parser.parse_path_allowing_meta(PathStyle::Mod)) {
Ok(ref traits) if traits.is_empty() => {
cx.span_warn(attr.span, "empty trait list in `derive`");
false
}
Ok(traits) => {
result.extend(traits);
true
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/conditional-compilation/cfg-attr-empty-is-unused.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Check that `#[cfg_attr($PREDICATE,)]` triggers the `unused_attribute` lint.

// compile-flags: --cfg TRUE

#![deny(unused)]

#[cfg_attr(FALSE,)] //~ ERROR unused attribute
fn _f() {}

#[cfg_attr(TRUE,)] //~ ERROR unused attribute
fn _g() {}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
error: unused attribute
--> $DIR/cfg-attr-empty-is-unused.rs:7:1
|
LL | #[cfg_attr(FALSE,)]
| ^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/cfg-attr-empty-is-unused.rs:5:9
|
LL | #![deny(unused)]
| ^^^^^^
= note: #[deny(unused_attributes)] implied by #[deny(unused)]

error: unused attribute
--> $DIR/cfg-attr-empty-is-unused.rs:10:1
|
LL | #[cfg_attr(TRUE,)]
| ^^^^^^^^^^^^^^^^^^

error: aborting due to 2 previous errors

6 changes: 3 additions & 3 deletions src/test/ui/derives/deriving-meta-empty-trait-list.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// compile-pass
#![deny(unused)]

#[derive()] //~ WARNING empty trait list in `derive`
struct Bar;
#[derive()] //~ ERROR unused attribute
struct _Bar;

pub fn main() {}
11 changes: 10 additions & 1 deletion src/test/ui/derives/deriving-meta-empty-trait-list.stderr
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
warning: empty trait list in `derive`
error: unused attribute
--> $DIR/deriving-meta-empty-trait-list.rs:3:1
|
LL | #[derive()]
| ^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/deriving-meta-empty-trait-list.rs:1:9
|
LL | #![deny(unused)]
| ^^^^^^
= note: #[deny(unused_attributes)] implied by #[deny(unused)]

error: aborting due to previous error

3 changes: 0 additions & 3 deletions src/test/ui/malformed/malformed-derive-entry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ struct Test1;
#[derive(Copy="bad")] //~ ERROR expected one of `)`, `,`, or `::`, found `=`
struct Test2;

#[derive()] //~ WARNING empty trait list
struct Test3;

#[derive] //~ ERROR malformed `derive` attribute input
struct Test4;

Expand Down
8 changes: 1 addition & 7 deletions src/test/ui/malformed/malformed-derive-entry.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,8 @@ error: expected one of `)`, `,`, or `::`, found `=`
LL | #[derive(Copy="bad")]
| ^ expected one of `)`, `,`, or `::` here

warning: empty trait list in `derive`
--> $DIR/malformed-derive-entry.rs:7:1
|
LL | #[derive()]
| ^^^^^^^^^^^

error: malformed `derive` attribute input
--> $DIR/malformed-derive-entry.rs:10:1
--> $DIR/malformed-derive-entry.rs:7:1
|
LL | #[derive]
| ^^^^^^^^^ help: missing traits to be derived: `#[derive(Trait1, Trait2, ...)]`
Expand Down