From f934b76fce8effcd664a3fc6b3771becde83693f Mon Sep 17 00:00:00 2001 From: est31 Date: Wed, 16 May 2018 16:49:51 +0200 Subject: [PATCH] Add a lint for unused const fn results --- src/librustc_lint/lib.rs | 3 ++- src/librustc_lint/unused.rs | 12 ++++++++++- src/test/ui/unused-const-fn-result.rs | 25 +++++++++++++++++++++++ src/test/ui/unused-const-fn-result.stderr | 20 ++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/unused-const-fn-result.rs create mode 100644 src/test/ui/unused-const-fn-result.stderr diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index ae44ea6b65b9a..848ef15df3ea4 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -177,7 +177,8 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { UNUSED_DOC_COMMENT, UNUSED_EXTERN_CRATES, UNUSED_FEATURES, - UNUSED_PARENS); + UNUSED_PARENS, + UNUSED_CONST_FN_RESULTS); add_lint_group!(sess, "rust_2018_idioms", diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index 845c964b986dd..aeda5edf37029 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -31,6 +31,12 @@ declare_lint! { "unused result of a type flagged as #[must_use]" } +declare_lint! { + pub UNUSED_CONST_FN_RESULTS, + Warn, + "unused result of a const fn invocation in a statement" +} + declare_lint! { pub UNUSED_RESULTS, Allow, @@ -42,7 +48,7 @@ pub struct UnusedResults; impl LintPass for UnusedResults { fn get_lints(&self) -> LintArray { - lint_array!(UNUSED_MUST_USE, UNUSED_RESULTS) + lint_array!(UNUSED_MUST_USE, UNUSED_CONST_FN_RESULTS, UNUSED_RESULTS) } } @@ -95,6 +101,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { 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 cx.tcx.is_const_fn(def_id) { + cx.span_lint(UNUSED_CONST_FN_RESULTS, s.span, + "unused const fn result"); + } } let must_use_op = match expr.node { // Hardcoding operators here seemed more expedient than the diff --git a/src/test/ui/unused-const-fn-result.rs b/src/test/ui/unused-const-fn-result.rs new file mode 100644 index 0000000000000..5489afd2a31d1 --- /dev/null +++ b/src/test/ui/unused-const-fn-result.rs @@ -0,0 +1,25 @@ +// 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. + +#![feature(const_fn,test)] +#![deny(unused_const_fn_results)] + +extern crate test; + +use test::black_box; + +const fn identity(v: T) -> T { + v +} + +fn main() { + identity(42); //~ ERROR unused const fn result [unused_const_fn_results] + identity(black_box(42)); //~ ERROR unused const fn result [unused_const_fn_results] +} diff --git a/src/test/ui/unused-const-fn-result.stderr b/src/test/ui/unused-const-fn-result.stderr new file mode 100644 index 0000000000000..371542f1bb9ff --- /dev/null +++ b/src/test/ui/unused-const-fn-result.stderr @@ -0,0 +1,20 @@ +error: unused const fn result + --> $DIR/unused-const-fn-result.rs:23:5 + | +LL | identity(42); //~ ERROR unused const fn result [unused_const_fn_results] + | ^^^^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/unused-const-fn-result.rs:12:9 + | +LL | #![deny(unused_const_fn_results)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error: unused const fn result + --> $DIR/unused-const-fn-result.rs:24:5 + | +LL | identity(black_box(42)); //~ ERROR unused const fn result [unused_const_fn_results] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors +