提交 647aecc2 编写于 作者: B bors

Auto merge of #44807 - GuillaumeGomez:rollup, r=GuillaumeGomez

Rollup of 4 pull requests

- Successful merges: #44103, #44625, #44789, #44795
- Failed merges:
......@@ -153,6 +153,7 @@ fn check_stmt(&mut self, cx: &LateContext, s: &hir::Stmt) {
};
let mut fn_warned = false;
let mut op_warned = false;
if cx.tcx.sess.features.borrow().fn_must_use {
let maybe_def = match expr.node {
hir::ExprCall(ref callee, _) => {
......@@ -172,9 +173,24 @@ fn check_stmt(&mut self, cx: &LateContext, s: &hir::Stmt) {
let def_id = def.def_id();
fn_warned = check_must_use(cx, def_id, s.span, "return value of ");
}
if let hir::ExprBinary(bin_op, ..) = expr.node {
match bin_op.node {
// Hardcoding the comparison operators here seemed more
// expedient than the refactoring that would be needed to
// look up the `#[must_use]` attribute which does exist on
// the comparison trait methods
hir::BiEq | hir::BiLt | hir::BiLe | hir::BiNe | hir::BiGe | hir::BiGt => {
let msg = "unused comparison which must be used";
cx.span_lint(UNUSED_MUST_USE, expr.span, msg);
op_warned = true;
},
_ => {},
}
}
}
if !(ty_warned || fn_warned) {
if !(ty_warned || fn_warned || op_warned) {
cx.span_lint(UNUSED_RESULTS, s.span, "unused result");
}
......
......@@ -408,7 +408,7 @@ fn consume_lvalue(&mut self,
self.each_borrow_involving_path(
context, lvalue_span.0, flow_state, |this, _idx, borrow| {
if !borrow.compatible_with(BorrowKind::Mut) {
this.report_move_out_while_borrowed(context, lvalue_span);
this.report_move_out_while_borrowed(context, lvalue_span, borrow);
Control::Break
} else {
Control::Continue
......@@ -896,20 +896,28 @@ impl<'c, 'b, 'a: 'b+'c, 'gcx, 'tcx: 'a> MirBorrowckCtxt<'c, 'b, 'a, 'gcx, 'tcx>
fn report_use_of_moved(&mut self,
_context: Context,
(lvalue, span): (&Lvalue, Span)) {
let mut err = self.tcx.cannot_act_on_uninitialized_variable(
span, "use", &self.describe_lvalue(lvalue), Origin::Mir);
// FIXME: add span_label for use of uninitialized variable
err.emit();
self.tcx.cannot_act_on_uninitialized_variable(span,
"use",
&self.describe_lvalue(lvalue),
Origin::Mir)
.span_label(span, format!("use of possibly uninitialized `{}`",
self.describe_lvalue(lvalue)))
.emit();
}
fn report_move_out_while_borrowed(&mut self,
_context: Context,
(lvalue, span): (&Lvalue, Span)) {
let mut err = self.tcx.cannot_move_when_borrowed(
span, &self.describe_lvalue(lvalue), Origin::Mir);
// FIXME 1: add span_label for "borrow of `()` occurs here"
// FIXME 2: add span_label for "move out of `{}` occurs here"
err.emit();
(lvalue, span): (&Lvalue, Span),
borrow: &BorrowData) {
self.tcx.cannot_move_when_borrowed(span,
&self.describe_lvalue(lvalue),
Origin::Mir)
.span_label(self.retrieve_borrow_span(borrow),
format!("borrow of `{}` occurs here",
self.describe_lvalue(&borrow.lvalue)))
.span_label(span, format!("move out of `{}` occurs here",
self.describe_lvalue(lvalue)))
.emit();
}
fn report_use_while_mutably_borrowed(&mut self,
......
......@@ -823,7 +823,7 @@ span.since {
.information {
position: absolute;
left: -1px;
left: -20px;
margin-top: 7px;
z-index: 1;
}
......
......@@ -106,15 +106,18 @@
pub struct Child {
handle: imp::Process,
/// The handle for writing to the child's stdin, if it has been captured
/// The handle for writing to the child's standard input (stdin), if it has
/// been captured.
#[stable(feature = "process", since = "1.0.0")]
pub stdin: Option<ChildStdin>,
/// The handle for reading from the child's stdout, if it has been captured
/// The handle for reading from the child's standard output (stdout), if it
/// has been captured.
#[stable(feature = "process", since = "1.0.0")]
pub stdout: Option<ChildStdout>,
/// The handle for reading from the child's stderr, if it has been captured
/// The handle for reading from the child's standard error (stderr), if it
/// has been captured.
#[stable(feature = "process", since = "1.0.0")]
pub stderr: Option<ChildStderr>,
}
......@@ -149,12 +152,17 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
/// A handle to a child process's stdin.
/// A handle to a child process's standard input (stdin).
///
/// This struct is used in the [`stdin`] field on [`Child`].
///
/// When an instance of `ChildStdin` is [dropped], the `ChildStdin`'s underlying
/// file handle will be closed. If the child process was blocked on input prior
/// to being dropped, it will become unblocked after dropping.
///
/// [`Child`]: struct.Child.html
/// [`stdin`]: struct.Child.html#structfield.stdin
/// [dropped]: ../ops/trait.Drop.html
#[stable(feature = "process", since = "1.0.0")]
pub struct ChildStdin {
inner: AnonPipe
......@@ -192,12 +200,16 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
/// A handle to a child process's stdout.
/// A handle to a child process's standard output (stdout).
///
/// This struct is used in the [`stdout`] field on [`Child`].
///
/// When an instance of `ChildStdout` is [dropped], the `ChildStdout`'s
/// underlying file handle will be closed.
///
/// [`Child`]: struct.Child.html
/// [`stdout`]: struct.Child.html#structfield.stdout
/// [dropped]: ../ops/trait.Drop.html
#[stable(feature = "process", since = "1.0.0")]
pub struct ChildStdout {
inner: AnonPipe
......@@ -239,8 +251,12 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
///
/// This struct is used in the [`stderr`] field on [`Child`].
///
/// When an instance of `ChildStderr` is [dropped], the `ChildStderr`'s
/// underlying file handle will be closed.
///
/// [`Child`]: struct.Child.html
/// [`stderr`]: struct.Child.html#structfield.stderr
/// [dropped]: ../ops/trait.Drop.html
#[stable(feature = "process", since = "1.0.0")]
pub struct ChildStderr {
inner: AnonPipe
......@@ -534,7 +550,7 @@ pub fn current_dir<P: AsRef<Path>>(&mut self, dir: P) -> &mut Command {
self
}
/// Configuration for the child process's stdin handle (file descriptor 0).
/// Configuration for the child process's standard input (stdin) handle.
///
/// # Examples
///
......@@ -554,7 +570,7 @@ pub fn stdin<T: Into<Stdio>>(&mut self, cfg: T) -> &mut Command {
self
}
/// Configuration for the child process's stdout handle (file descriptor 1).
/// Configuration for the child process's standard output (stdout) handle.
///
/// # Examples
///
......@@ -574,7 +590,7 @@ pub fn stdout<T: Into<Stdio>>(&mut self, cfg: T) -> &mut Command {
self
}
/// Configuration for the child process's stderr handle (file descriptor 2).
/// Configuration for the child process's standard error (stderr) handle.
///
/// # Examples
///
......
......@@ -380,7 +380,7 @@ pub fn new() -> Features {
// #[doc(masked)]
(active, doc_masked, "1.21.0", None),
// allow `#[must_use]` on functions (RFC 1940)
// allow `#[must_use]` on functions and comparison operators (RFC 1940)
(active, fn_must_use, "1.21.0", Some(43302)),
// allow '|' at beginning of match arms (RFC 1925)
......
......@@ -11,6 +11,7 @@
#![feature(fn_must_use)]
#![warn(unused_must_use)]
#[derive(PartialEq, Eq)]
struct MyStruct {
n: usize,
}
......@@ -58,13 +59,18 @@ fn main() {
need_to_use_this_value();
let mut m = MyStruct { n: 2 };
let n = MyStruct { n: 3 };
m.need_to_use_this_method_value();
m.is_even(); // trait method!
m.replace(3);
m.replace(3); // won't warn (annotation needs to be in trait definition)
// comparison methods are `must_use`
2.eq(&3);
m.eq(&n);
// FIXME: operators should probably be `must_use` if underlying method is
// lint includes comparison operators
2 == 3;
m == n;
}
warning: unused return value of `need_to_use_this_value` which must be used: it's important
--> $DIR/fn_must_use.rs:58:5
--> $DIR/fn_must_use.rs:59:5
|
58 | need_to_use_this_value();
59 | need_to_use_this_value();
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
......@@ -11,20 +11,38 @@ note: lint level defined here
| ^^^^^^^^^^^^^^^
warning: unused return value of `MyStruct::need_to_use_this_method_value` which must be used
--> $DIR/fn_must_use.rs:61:5
--> $DIR/fn_must_use.rs:64:5
|
61 | m.need_to_use_this_method_value();
64 | m.need_to_use_this_method_value();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
warning: unused return value of `EvenNature::is_even` which must be used: no side effects
--> $DIR/fn_must_use.rs:62:5
--> $DIR/fn_must_use.rs:65:5
|
62 | m.is_even(); // trait method!
65 | m.is_even(); // trait method!
| ^^^^^^^^^^^^
warning: unused return value of `std::cmp::PartialEq::eq` which must be used
--> $DIR/fn_must_use.rs:66:5
--> $DIR/fn_must_use.rs:70:5
|
66 | 2.eq(&3);
70 | 2.eq(&3);
| ^^^^^^^^^
warning: unused return value of `std::cmp::PartialEq::eq` which must be used
--> $DIR/fn_must_use.rs:71:5
|
71 | m.eq(&n);
| ^^^^^^^^^
warning: unused comparison which must be used
--> $DIR/fn_must_use.rs:74:5
|
74 | 2 == 3;
| ^^^^^^
warning: unused comparison which must be used
--> $DIR/fn_must_use.rs:75:5
|
75 | m == n;
| ^^^^^^
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册