Show type name for unused_must_use lint

This commit is contained in:
Seo Sanghyeon 2017-06-20 04:36:56 +09:00
parent 04145943a2
commit 05540bf08b
2 changed files with 10 additions and 11 deletions

View file

@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use rustc::hir::def_id::DefId;
use rustc::ty; use rustc::ty;
use rustc::ty::adjustment; use rustc::ty::adjustment;
use util::nodemap::FxHashMap; use util::nodemap::FxHashMap;
@ -144,20 +145,18 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
ty::TyTuple(ref tys, _) if tys.is_empty() => return, ty::TyTuple(ref tys, _) if tys.is_empty() => return,
ty::TyNever => return, ty::TyNever => return,
ty::TyBool => return, ty::TyBool => return,
ty::TyAdt(def, _) => { ty::TyAdt(def, _) => check_must_use(cx, def.did, s.span),
let attrs = cx.tcx.get_attrs(def.did);
check_must_use(cx, &attrs, s.span)
}
_ => false, _ => false,
}; };
if !warned { if !warned {
cx.span_lint(UNUSED_RESULTS, s.span, "unused result"); cx.span_lint(UNUSED_RESULTS, s.span, "unused result");
} }
fn check_must_use(cx: &LateContext, attrs: &[ast::Attribute], sp: Span) -> bool { fn check_must_use(cx: &LateContext, def_id: DefId, sp: Span) -> bool {
for attr in attrs { for attr in cx.tcx.get_attrs(def_id).iter() {
if attr.check_name("must_use") { if attr.check_name("must_use") {
let mut msg = "unused result which must be used".to_string(); let mut msg = format!("unused `{}` which must be used",
cx.tcx.item_path_str(def_id));
// check for #[must_use="..."] // check for #[must_use="..."]
if let Some(s) = attr.value_str() { if let Some(s) = attr.value_str() {
msg.push_str(": "); msg.push_str(": ");

View file

@ -26,8 +26,8 @@ fn qux() -> MustUseMsg { return foo::<MustUseMsg>(); }
#[allow(unused_results)] #[allow(unused_results)]
fn test() { fn test() {
foo::<isize>(); foo::<isize>();
foo::<MustUse>(); //~ ERROR: unused result which must be used foo::<MustUse>(); //~ ERROR: unused `MustUse` which must be used
foo::<MustUseMsg>(); //~ ERROR: unused result which must be used: some message foo::<MustUseMsg>(); //~ ERROR: unused `MustUseMsg` which must be used: some message
} }
#[allow(unused_results, unused_must_use)] #[allow(unused_results, unused_must_use)]
@ -39,8 +39,8 @@ fn test2() {
fn main() { fn main() {
foo::<isize>(); //~ ERROR: unused result foo::<isize>(); //~ ERROR: unused result
foo::<MustUse>(); //~ ERROR: unused result which must be used foo::<MustUse>(); //~ ERROR: unused `MustUse` which must be used
foo::<MustUseMsg>(); //~ ERROR: unused result which must be used: some message foo::<MustUseMsg>(); //~ ERROR: unused `MustUseMsg` which must be used: some message
let _ = foo::<isize>(); let _ = foo::<isize>();
let _ = foo::<MustUse>(); let _ = foo::<MustUse>();