Skip to content

Commit 8f19cad

Browse files
committed
Auto merge of #55003 - zackmdavis:must_use_assoc_fn, r=varkor
`#[must_use]` for associated functions is supposed to actually work In the comments of (closed, defunct) pull request #54884, @Centril [noted that](#54884 (comment)) must-use annotations didn't work on an associated function (what other communities might call a "static method"). Subsequent logging revealed that in this case we have a `Def::Method`, whereas the lint pass was only matching on `Def::Fn`. (One could argue that those def-names are thereby misleading—must-use for `self`-ful methods have always worked—but documenting or reworking that can be left to another day.) r? @varkor
2 parents f517527 + ab91a6b commit 8f19cad

File tree

6 files changed

+31
-16
lines changed

6 files changed

+31
-16
lines changed

src/liballoc/rc.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ impl<T: ?Sized> Clone for Rc<T> {
867867
///
868868
/// let five = Rc::new(5);
869869
///
870-
/// Rc::clone(&five);
870+
/// let _ = Rc::clone(&five);
871871
/// ```
872872
#[inline]
873873
fn clone(&self) -> Rc<T> {
@@ -1304,7 +1304,7 @@ impl<T: ?Sized> Clone for Weak<T> {
13041304
///
13051305
/// let weak_five = Rc::downgrade(&Rc::new(5));
13061306
///
1307-
/// Weak::clone(&weak_five);
1307+
/// let _ = Weak::clone(&weak_five);
13081308
/// ```
13091309
#[inline]
13101310
fn clone(&self) -> Weak<T> {

src/liballoc/sync.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ impl<T: ?Sized> Clone for Arc<T> {
713713
///
714714
/// let five = Arc::new(5);
715715
///
716-
/// Arc::clone(&five);
716+
/// let _ = Arc::clone(&five);
717717
/// ```
718718
#[inline]
719719
fn clone(&self) -> Arc<T> {
@@ -1135,7 +1135,7 @@ impl<T: ?Sized> Clone for Weak<T> {
11351135
///
11361136
/// let weak_five = Arc::downgrade(&Arc::new(5));
11371137
///
1138-
/// Weak::clone(&weak_five);
1138+
/// let _ = Weak::clone(&weak_five);
11391139
/// ```
11401140
#[inline]
11411141
fn clone(&self) -> Weak<T> {

src/librustc_lint/unused.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
8080
match callee.node {
8181
hir::ExprKind::Path(ref qpath) => {
8282
let def = cx.tables.qpath_def(qpath, callee.hir_id);
83-
if let Def::Fn(_) = def {
84-
Some(def)
85-
} else { // `Def::Local` if it was a closure, for which we
86-
None // do not currently support must-use linting
83+
match def {
84+
Def::Fn(_) | Def::Method(_) => Some(def),
85+
// `Def::Local` if it was a closure, for which we
86+
// do not currently support must-use linting
87+
_ => None
8788
}
8889
},
8990
_ => None

src/test/run-pass/resolve-pseudo-shadowing.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
fn check<Clone>(_c: Clone) {
1414
fn check2() {
15-
<() as std::clone::Clone>::clone(&());
15+
let _ = <() as std::clone::Clone>::clone(&());
1616
}
1717
check2();
1818
}

src/test/ui/fn_must_use.rs

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ impl MyStruct {
2222
fn need_to_use_this_method_value(&self) -> usize {
2323
self.n
2424
}
25+
26+
#[must_use]
27+
fn need_to_use_this_associated_function_value() -> isize {
28+
-1
29+
}
2530
}
2631

2732
trait EvenNature {
@@ -66,6 +71,9 @@ fn main() {
6671
m.is_even(); // trait method!
6772
//~^ WARN unused return value
6873

74+
MyStruct::need_to_use_this_associated_function_value();
75+
//~^ WARN unused return value
76+
6977
m.replace(3); // won't warn (annotation needs to be in trait definition)
7078

7179
// comparison methods are `must_use`

src/test/ui/fn_must_use.stderr

+13-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
warning: unused return value of `need_to_use_this_value` which must be used
2-
--> $DIR/fn_must_use.rs:60:5
2+
--> $DIR/fn_must_use.rs:65:5
33
|
44
LL | need_to_use_this_value(); //~ WARN unused return value
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -12,39 +12,45 @@ LL | #![warn(unused_must_use)]
1212
= note: it's important
1313

1414
warning: unused return value of `MyStruct::need_to_use_this_method_value` which must be used
15-
--> $DIR/fn_must_use.rs:65:5
15+
--> $DIR/fn_must_use.rs:70:5
1616
|
1717
LL | m.need_to_use_this_method_value(); //~ WARN unused return value
1818
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1919

2020
warning: unused return value of `EvenNature::is_even` which must be used
21-
--> $DIR/fn_must_use.rs:66:5
21+
--> $DIR/fn_must_use.rs:71:5
2222
|
2323
LL | m.is_even(); // trait method!
2424
| ^^^^^^^^^^^^
2525
|
2626
= note: no side effects
2727

28+
warning: unused return value of `MyStruct::need_to_use_this_associated_function_value` which must be used
29+
--> $DIR/fn_must_use.rs:74:5
30+
|
31+
LL | MyStruct::need_to_use_this_associated_function_value();
32+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
33+
2834
warning: unused return value of `std::cmp::PartialEq::eq` which must be used
29-
--> $DIR/fn_must_use.rs:72:5
35+
--> $DIR/fn_must_use.rs:80:5
3036
|
3137
LL | 2.eq(&3); //~ WARN unused return value
3238
| ^^^^^^^^^
3339

3440
warning: unused return value of `std::cmp::PartialEq::eq` which must be used
35-
--> $DIR/fn_must_use.rs:73:5
41+
--> $DIR/fn_must_use.rs:81:5
3642
|
3743
LL | m.eq(&n); //~ WARN unused return value
3844
| ^^^^^^^^^
3945

4046
warning: unused comparison which must be used
41-
--> $DIR/fn_must_use.rs:76:5
47+
--> $DIR/fn_must_use.rs:84:5
4248
|
4349
LL | 2 == 3; //~ WARN unused comparison
4450
| ^^^^^^
4551

4652
warning: unused comparison which must be used
47-
--> $DIR/fn_must_use.rs:77:5
53+
--> $DIR/fn_must_use.rs:85:5
4854
|
4955
LL | m == n; //~ WARN unused comparison
5056
| ^^^^^^

0 commit comments

Comments
 (0)