diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index c41a361fcc309..55782041be687 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -735,7 +735,7 @@ impl<'a> LintContext for EarlyContext<'a> { } fn enter_attrs(&mut self, attrs: &[ast::Attribute]) { - debug!("early context: exit_attrs({:?})", attrs); + debug!("early context: enter_attrs({:?})", attrs); run_lints!(self, enter_lint_attrs, early_passes, attrs); } @@ -934,8 +934,10 @@ impl<'a, 'v> ast_visit::Visitor<'v> for EarlyContext<'a> { } fn visit_expr(&mut self, e: &ast::Expr) { - run_lints!(self, check_expr, early_passes, e); - ast_visit::walk_expr(self, e); + self.with_lint_attrs(e.attrs.as_attr_slice(), |cx| { + run_lints!(cx, check_expr, early_passes, e); + ast_visit::walk_expr(cx, e); + }) } fn visit_stmt(&mut self, s: &ast::Stmt) { @@ -990,8 +992,10 @@ impl<'a, 'v> ast_visit::Visitor<'v> for EarlyContext<'a> { } fn visit_local(&mut self, l: &ast::Local) { - run_lints!(self, check_local, early_passes, l); - ast_visit::walk_local(self, l); + self.with_lint_attrs(l.attrs.as_attr_slice(), |cx| { + run_lints!(cx, check_local, early_passes, l); + ast_visit::walk_local(cx, l); + }) } fn visit_block(&mut self, b: &ast::Block) { diff --git a/src/test/run-pass/lint-expr-stmt-attrs-for-early-lints.rs b/src/test/run-pass/lint-expr-stmt-attrs-for-early-lints.rs new file mode 100644 index 0000000000000..16c7176a68db4 --- /dev/null +++ b/src/test/run-pass/lint-expr-stmt-attrs-for-early-lints.rs @@ -0,0 +1,22 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(stmt_expr_attributes)] +#![deny(unused_parens)] + +// Tests that lint attributes on statements/expressions are +// correctly applied to non-builtin early (AST) lints + +fn main() { + #[allow(unused_parens)] + { + let _ = (9); + } +}