mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 19:17:43 +00:00
#[must_use] for functions (RFC 1940)
The return value of a function annotated with `must_use`, must be used. This is in the matter of #43302.
This commit is contained in:
parent
0188ec6ef8
commit
3645b0626c
@ -145,22 +145,38 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let t = cx.tables.expr_ty(&expr);
|
let t = cx.tables.expr_ty(&expr);
|
||||||
let warned = match t.sty {
|
let ty_warned = match t.sty {
|
||||||
ty::TyTuple(ref tys, _) if tys.is_empty() => return,
|
ty::TyAdt(def, _) => check_must_use(cx, def.did, s.span, ""),
|
||||||
ty::TyNever => return,
|
|
||||||
ty::TyBool => return,
|
|
||||||
ty::TyAdt(def, _) => check_must_use(cx, def.did, s.span),
|
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
if !warned {
|
|
||||||
|
let mut fn_warned = false;
|
||||||
|
let maybe_def = match expr.node {
|
||||||
|
hir::ExprCall(ref callee, _) => {
|
||||||
|
match callee.node {
|
||||||
|
hir::ExprPath(ref qpath) => Some(cx.tables.qpath_def(qpath, callee.id)),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hir::ExprMethodCall(..) => {
|
||||||
|
cx.tables.type_dependent_defs.get(&expr.id).cloned()
|
||||||
|
},
|
||||||
|
_ => { None }
|
||||||
|
};
|
||||||
|
if let Some(def) = maybe_def {
|
||||||
|
let def_id = def.def_id();
|
||||||
|
fn_warned = check_must_use(cx, def_id, s.span, "return value of ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(ty_warned || fn_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, def_id: DefId, sp: Span) -> bool {
|
fn check_must_use(cx: &LateContext, def_id: DefId, sp: Span, describe_path: &str) -> bool {
|
||||||
for attr in cx.tcx.get_attrs(def_id).iter() {
|
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 = format!("unused `{}` which must be used",
|
let mut msg = format!("unused {}`{}` which must be used",
|
||||||
cx.tcx.item_path_str(def_id));
|
describe_path, 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(": ");
|
||||||
|
33
src/test/ui/lint/fn_must_use.rs
Normal file
33
src/test/ui/lint/fn_must_use.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Copyright 2017 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 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
|
||||||
|
struct MyStruct {
|
||||||
|
n: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyStruct {
|
||||||
|
#[must_use]
|
||||||
|
fn need_to_use_this_method_value(&self) -> usize {
|
||||||
|
self.n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use="it's important"]
|
||||||
|
fn need_to_use_this_value() -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
need_to_use_this_value();
|
||||||
|
|
||||||
|
let m = MyStruct { n: 2 };
|
||||||
|
m.need_to_use_this_method_value();
|
||||||
|
}
|
14
src/test/ui/lint/fn_must_use.stderr
Normal file
14
src/test/ui/lint/fn_must_use.stderr
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
warning: unused return value of `need_to_use_this_value` which must be used: it's important
|
||||||
|
--> $DIR/fn_must_use.rs:29:5
|
||||||
|
|
|
||||||
|
29 | need_to_use_this_value();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: #[warn(unused_must_use)] on by default
|
||||||
|
|
||||||
|
warning: unused return value of `MyStruct::need_to_use_this_method_value` which must be used
|
||||||
|
--> $DIR/fn_must_use.rs:32:5
|
||||||
|
|
|
||||||
|
32 | m.need_to_use_this_method_value();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
Loading…
Reference in New Issue
Block a user