handle transmutes in const context if msrvs::CONST_FLOAT_BITS_CONV
This commit is contained in:
parent
7fcdebf658
commit
7cccef84cf
@ -17,6 +17,7 @@ macro_rules! msrv_aliases {
|
|||||||
|
|
||||||
// names may refer to stabilized feature flags or library items
|
// names may refer to stabilized feature flags or library items
|
||||||
msrv_aliases! {
|
msrv_aliases! {
|
||||||
|
1,83,0 { CONST_FLOAT_BITS_CONV }
|
||||||
1,81,0 { LINT_REASONS_STABILIZATION }
|
1,81,0 { LINT_REASONS_STABILIZATION }
|
||||||
1,80,0 { BOX_INTO_ITER}
|
1,80,0 { BOX_INTO_ITER}
|
||||||
1,77,0 { C_STR_LITERALS }
|
1,77,0 { C_STR_LITERALS }
|
||||||
|
@ -619,10 +619,10 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
|
|||||||
| transmute_ref_to_ref::check(cx, e, from_ty, to_ty, arg, const_context)
|
| transmute_ref_to_ref::check(cx, e, from_ty, to_ty, arg, const_context)
|
||||||
| transmute_ptr_to_ptr::check(cx, e, from_ty, to_ty, arg, &self.msrv)
|
| transmute_ptr_to_ptr::check(cx, e, from_ty, to_ty, arg, &self.msrv)
|
||||||
| transmute_int_to_bool::check(cx, e, from_ty, to_ty, arg)
|
| transmute_int_to_bool::check(cx, e, from_ty, to_ty, arg)
|
||||||
| transmute_int_to_float::check(cx, e, from_ty, to_ty, arg, const_context)
|
| transmute_int_to_float::check(cx, e, from_ty, to_ty, arg, const_context, &self.msrv)
|
||||||
| transmute_int_to_non_zero::check(cx, e, from_ty, to_ty, arg)
|
| transmute_int_to_non_zero::check(cx, e, from_ty, to_ty, arg)
|
||||||
| transmute_float_to_int::check(cx, e, from_ty, to_ty, arg, const_context)
|
| transmute_float_to_int::check(cx, e, from_ty, to_ty, arg, const_context, &self.msrv)
|
||||||
| transmute_num_to_bytes::check(cx, e, from_ty, to_ty, arg, const_context)
|
| transmute_num_to_bytes::check(cx, e, from_ty, to_ty, arg, const_context, &self.msrv)
|
||||||
| (unsound_collection_transmute::check(cx, e, from_ty, to_ty)
|
| (unsound_collection_transmute::check(cx, e, from_ty, to_ty)
|
||||||
|| transmute_undefined_repr::check(cx, e, from_ty, to_ty))
|
|| transmute_undefined_repr::check(cx, e, from_ty, to_ty))
|
||||||
| (eager_transmute::check(cx, e, arg, from_ty, to_ty));
|
| (eager_transmute::check(cx, e, arg, from_ty, to_ty));
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use super::TRANSMUTE_FLOAT_TO_INT;
|
use super::TRANSMUTE_FLOAT_TO_INT;
|
||||||
|
use clippy_config::msrvs::{self, Msrv};
|
||||||
use clippy_utils::diagnostics::span_lint_and_then;
|
use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::sugg;
|
use clippy_utils::sugg;
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
@ -16,9 +17,12 @@ pub(super) fn check<'tcx>(
|
|||||||
to_ty: Ty<'tcx>,
|
to_ty: Ty<'tcx>,
|
||||||
mut arg: &'tcx Expr<'_>,
|
mut arg: &'tcx Expr<'_>,
|
||||||
const_context: bool,
|
const_context: bool,
|
||||||
|
msrv: &Msrv,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match (&from_ty.kind(), &to_ty.kind()) {
|
match (&from_ty.kind(), &to_ty.kind()) {
|
||||||
(ty::Float(float_ty), ty::Int(_) | ty::Uint(_)) if !const_context => {
|
(ty::Float(float_ty), ty::Int(_) | ty::Uint(_))
|
||||||
|
if !const_context || msrv.meets(msrvs::CONST_FLOAT_BITS_CONV) =>
|
||||||
|
{
|
||||||
span_lint_and_then(
|
span_lint_and_then(
|
||||||
cx,
|
cx,
|
||||||
TRANSMUTE_FLOAT_TO_INT,
|
TRANSMUTE_FLOAT_TO_INT,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use super::TRANSMUTE_INT_TO_FLOAT;
|
use super::TRANSMUTE_INT_TO_FLOAT;
|
||||||
|
use clippy_config::msrvs::{self, Msrv};
|
||||||
use clippy_utils::diagnostics::span_lint_and_then;
|
use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::sugg;
|
use clippy_utils::sugg;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -15,9 +16,10 @@ pub(super) fn check<'tcx>(
|
|||||||
to_ty: Ty<'tcx>,
|
to_ty: Ty<'tcx>,
|
||||||
arg: &'tcx Expr<'_>,
|
arg: &'tcx Expr<'_>,
|
||||||
const_context: bool,
|
const_context: bool,
|
||||||
|
msrv: &Msrv,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match (&from_ty.kind(), &to_ty.kind()) {
|
match (&from_ty.kind(), &to_ty.kind()) {
|
||||||
(ty::Int(_) | ty::Uint(_), ty::Float(_)) if !const_context => {
|
(ty::Int(_) | ty::Uint(_), ty::Float(_)) if !const_context || msrv.meets(msrvs::CONST_FLOAT_BITS_CONV) => {
|
||||||
span_lint_and_then(
|
span_lint_and_then(
|
||||||
cx,
|
cx,
|
||||||
TRANSMUTE_INT_TO_FLOAT,
|
TRANSMUTE_INT_TO_FLOAT,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use super::TRANSMUTE_NUM_TO_BYTES;
|
use super::TRANSMUTE_NUM_TO_BYTES;
|
||||||
|
use clippy_config::msrvs::{self, Msrv};
|
||||||
use clippy_utils::diagnostics::span_lint_and_then;
|
use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::sugg;
|
use clippy_utils::sugg;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -15,15 +16,14 @@ pub(super) fn check<'tcx>(
|
|||||||
to_ty: Ty<'tcx>,
|
to_ty: Ty<'tcx>,
|
||||||
arg: &'tcx Expr<'_>,
|
arg: &'tcx Expr<'_>,
|
||||||
const_context: bool,
|
const_context: bool,
|
||||||
|
msrv: &Msrv,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match (&from_ty.kind(), &to_ty.kind()) {
|
match (&from_ty.kind(), &to_ty.kind()) {
|
||||||
(ty::Int(_) | ty::Uint(_) | ty::Float(_), ty::Array(arr_ty, _)) => {
|
(ty::Int(_) | ty::Uint(_) | ty::Float(_), ty::Array(arr_ty, _)) => {
|
||||||
if !matches!(arr_ty.kind(), ty::Uint(UintTy::U8)) {
|
if !matches!(arr_ty.kind(), ty::Uint(UintTy::U8)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if matches!(from_ty.kind(), ty::Float(_)) && const_context {
|
if matches!(from_ty.kind(), ty::Float(_)) && const_context && !msrv.meets(msrvs::CONST_FLOAT_BITS_CONV) {
|
||||||
// TODO: Remove when const_float_bits_conv is stabilized
|
|
||||||
// rust#72447
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user