Skip to content

Commit

Permalink
in which the trivial-casts word to the wise is tucked into a help note
Browse files Browse the repository at this point in the history
The top level message shouldn't be too long; the
replaced-by-coercion/temporary-variable advice can live in a note. Also,
don't mention type ascription when it's not actually available as a real
thing. (The current state of discussion on the type ascription tracking
issue #23416 makes one rather suspect it will never be a stable thing in
its current form, but that's not for us to adjudicate in this commit.)

While we're here, yank out the differentiating parts of the
numeric/other conditional and only have one codepath emitting the
diagnostic.
  • Loading branch information
zackmdavis committed Jun 24, 2018
1 parent a417518 commit 0b39a82
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 21 deletions.
41 changes: 20 additions & 21 deletions src/librustc_typeck/check/cast.rs
Expand Up @@ -365,28 +365,27 @@ impl<'a, 'gcx, 'tcx> CastCheck<'tcx> {
fn trivial_cast_lint(&self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) {
let t_cast = self.cast_ty;
let t_expr = self.expr_ty;
if t_cast.is_numeric() && t_expr.is_numeric() {
fcx.tcx.lint_node(
lint::builtin::TRIVIAL_NUMERIC_CASTS,
self.expr.id,
self.span,
&format!("trivial numeric cast: `{}` as `{}`. Cast can be \
replaced by coercion, this might require type \
ascription or a temporary variable",
fcx.ty_to_string(t_expr),
fcx.ty_to_string(t_cast)));
let type_asc_or = if fcx.tcx.features().type_ascription {
"type ascription or "
} else {
fcx.tcx.lint_node(
lint::builtin::TRIVIAL_CASTS,
self.expr.id,
self.span,
&format!("trivial cast: `{}` as `{}`. Cast can be \
replaced by coercion, this might require type \
ascription or a temporary variable",
fcx.ty_to_string(t_expr),
fcx.ty_to_string(t_cast)));
}

""
};
let (adjective, lint) = if t_cast.is_numeric() && t_expr.is_numeric() {
("numeric ", lint::builtin::TRIVIAL_NUMERIC_CASTS)
} else {
("", lint::builtin::TRIVIAL_CASTS)
};
let mut err = fcx.tcx.struct_span_lint_node(
lint,
self.expr.id,
self.span,
&format!("trivial {}cast: `{}` as `{}`",
adjective,
fcx.ty_to_string(t_expr),
fcx.ty_to_string(t_cast)));
err.help(&format!("cast can be replaced by coercion; this might \
require {}a temporary variable", type_asc_or));
err.emit();
}

pub fn check(mut self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) {
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/lint/trivial-casts-featuring-type-ascription.rs
@@ -0,0 +1,20 @@
// Copyright 2018 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.

#![deny(trivial_casts, trivial_numeric_casts)]
#![feature(type_ascription)]

fn main() {
let lugubrious = 12i32 as i32;
//~^ ERROR trivial numeric cast
let haunted: &u32 = &99;
let _ = haunted as *const u32;
//~^ ERROR trivial cast
}
28 changes: 28 additions & 0 deletions src/test/ui/lint/trivial-casts-featuring-type-ascription.stderr
@@ -0,0 +1,28 @@
error: trivial numeric cast: `i32` as `i32`
--> $DIR/trivial-casts-featuring-type-ascription.rs:15:22
|
LL | let lugubrious = 12i32 as i32;
| ^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/trivial-casts-featuring-type-ascription.rs:11:24
|
LL | #![deny(trivial_casts, trivial_numeric_casts)]
| ^^^^^^^^^^^^^^^^^^^^^
= help: cast can be replaced by coercion; this might require type ascription or a temporary variable

error: trivial cast: `&u32` as `*const u32`
--> $DIR/trivial-casts-featuring-type-ascription.rs:18:13
|
LL | let _ = haunted as *const u32;
| ^^^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/trivial-casts-featuring-type-ascription.rs:11:9
|
LL | #![deny(trivial_casts, trivial_numeric_casts)]
| ^^^^^^^^^^^^^
= help: cast can be replaced by coercion; this might require type ascription or a temporary variable

error: aborting due to 2 previous errors

19 changes: 19 additions & 0 deletions src/test/ui/lint/trivial-casts.rs
@@ -0,0 +1,19 @@
// Copyright 2018 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.

#![deny(trivial_casts, trivial_numeric_casts)]

fn main() {
let lugubrious = 12i32 as i32;
//~^ ERROR trivial numeric cast
let haunted: &u32 = &99;
let _ = haunted as *const u32;
//~^ ERROR trivial cast
}
28 changes: 28 additions & 0 deletions src/test/ui/lint/trivial-casts.stderr
@@ -0,0 +1,28 @@
error: trivial numeric cast: `i32` as `i32`
--> $DIR/trivial-casts.rs:14:22
|
LL | let lugubrious = 12i32 as i32;
| ^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/trivial-casts.rs:11:24
|
LL | #![deny(trivial_casts, trivial_numeric_casts)]
| ^^^^^^^^^^^^^^^^^^^^^
= help: cast can be replaced by coercion; this might require a temporary variable

error: trivial cast: `&u32` as `*const u32`
--> $DIR/trivial-casts.rs:17:13
|
LL | let _ = haunted as *const u32;
| ^^^^^^^^^^^^^^^^^^^^^
|
note: lint level defined here
--> $DIR/trivial-casts.rs:11:9
|
LL | #![deny(trivial_casts, trivial_numeric_casts)]
| ^^^^^^^^^^^^^
= help: cast can be replaced by coercion; this might require a temporary variable

error: aborting due to 2 previous errors

0 comments on commit 0b39a82

Please sign in to comment.