From 0b39a82cf49bc376e568560e4f97360f477255d4 Mon Sep 17 00:00:00 2001 From: "Zack M. Davis" Date: Sat, 23 Jun 2018 16:57:23 -0700 Subject: [PATCH] in which the trivial-casts word to the wise is tucked into a help note 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. --- src/librustc_typeck/check/cast.rs | 41 +++++++++---------- ...trivial-casts-featuring-type-ascription.rs | 20 +++++++++ ...ial-casts-featuring-type-ascription.stderr | 28 +++++++++++++ src/test/ui/lint/trivial-casts.rs | 19 +++++++++ src/test/ui/lint/trivial-casts.stderr | 28 +++++++++++++ 5 files changed, 115 insertions(+), 21 deletions(-) create mode 100644 src/test/ui/lint/trivial-casts-featuring-type-ascription.rs create mode 100644 src/test/ui/lint/trivial-casts-featuring-type-ascription.stderr create mode 100644 src/test/ui/lint/trivial-casts.rs create mode 100644 src/test/ui/lint/trivial-casts.stderr diff --git a/src/librustc_typeck/check/cast.rs b/src/librustc_typeck/check/cast.rs index f0d7ca8ebf1..07e19c84a95 100644 --- a/src/librustc_typeck/check/cast.rs +++ b/src/librustc_typeck/check/cast.rs @@ -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>) { diff --git a/src/test/ui/lint/trivial-casts-featuring-type-ascription.rs b/src/test/ui/lint/trivial-casts-featuring-type-ascription.rs new file mode 100644 index 00000000000..fba3724ae49 --- /dev/null +++ b/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 or the MIT license +// , 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 +} diff --git a/src/test/ui/lint/trivial-casts-featuring-type-ascription.stderr b/src/test/ui/lint/trivial-casts-featuring-type-ascription.stderr new file mode 100644 index 00000000000..a77135c875d --- /dev/null +++ b/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 + diff --git a/src/test/ui/lint/trivial-casts.rs b/src/test/ui/lint/trivial-casts.rs new file mode 100644 index 00000000000..759b282c0da --- /dev/null +++ b/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 or the MIT license +// , 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 +} diff --git a/src/test/ui/lint/trivial-casts.stderr b/src/test/ui/lint/trivial-casts.stderr new file mode 100644 index 00000000000..d52869f4bed --- /dev/null +++ b/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 +