Skip to content

Commit

Permalink
assertions_on_constants: ignore indirect cfg!
Browse files Browse the repository at this point in the history
  • Loading branch information
pitaj committed Apr 14, 2022
1 parent b6645d0 commit 9f131e5
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
18 changes: 17 additions & 1 deletion clippy_utils/src/consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use if_chain::if_chain;
use rustc_ast::ast::{self, LitFloatType, LitKind};
use rustc_data_structures::sync::Lrc;
use rustc_hir::def::{DefKind, Res};
use rustc_hir::{BinOp, BinOpKind, Block, Expr, ExprKind, HirId, QPath, UnOp};
use rustc_hir::{BinOp, BinOpKind, Block, Expr, ExprKind, HirId, Item, ItemKind, Node, QPath, UnOp};
use rustc_lint::LateContext;
use rustc_middle::mir::interpret::Scalar;
use rustc_middle::ty::subst::{Subst, SubstsRef};
Expand Down Expand Up @@ -400,6 +400,22 @@ impl<'a, 'tcx> ConstEvalLateContext<'a, 'tcx> {
let res = self.typeck_results.qpath_res(qpath, id);
match res {
Res::Def(DefKind::Const | DefKind::AssocConst, def_id) => {
// Check if this constant is based on `cfg!(..)`,
// which is NOT constant for our purposes.
if let Some(node) = self.lcx.tcx.hir().get_if_local(def_id) &&
let Node::Item(&Item {
kind: ItemKind::Const(_, body_id),
..
}) = node &&
let Node::Expr(&Expr {
kind: ExprKind::Lit(_),
span,
..
}) = self.lcx.tcx.hir().get(body_id.hir_id) &&
is_direct_expn_of(span, "cfg").is_some() {
return None;
}

let substs = self.typeck_results.node_substs(id);
let substs = if self.substs.is_empty() {
substs
Expand Down
10 changes: 8 additions & 2 deletions tests/ui/assertions_on_constants.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#![allow(non_fmt_panics)]
#![allow(non_fmt_panics, clippy::needless_bool)]

macro_rules! assert_const {
($len:expr) => {
Expand Down Expand Up @@ -28,6 +28,12 @@ fn main() {
assert_const!(3);
assert_const!(-1);

// Don't lint on this:
// Don't lint if based on `cfg!(..)`:
assert!(cfg!(feature = "hey") || cfg!(not(feature = "asdf")));

let flag: bool = cfg!(not(feature = "asdf"));
assert!(flag);

const CFG_FLAG: &bool = &cfg!(feature = "hey");
assert!(!CFG_FLAG);
}

0 comments on commit 9f131e5

Please sign in to comment.