mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-27 23:20:39 +00:00
Auto merge of #94706 - matthiaskrgr:rollup-l5erynr, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #93350 (libunwind: readd link attrs to _Unwind_Backtrace) - #93827 (Stabilize const_fn_fn_ptr_basics, const_fn_trait_bound, and const_impl_trait) - #94696 (Remove whitespaces and use CSS to align line numbers to the right instead) - #94700 (rustdoc: Update minifier version) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
d3bc1297db
4 changed files with 25 additions and 26 deletions
|
@ -3,6 +3,7 @@ use clippy_utils::qualify_min_const_fn::is_min_const_fn;
|
||||||
use clippy_utils::ty::has_drop;
|
use clippy_utils::ty::has_drop;
|
||||||
use clippy_utils::{fn_has_unsatisfiable_preds, is_entrypoint_fn, meets_msrv, msrvs, trait_ref_of_method};
|
use clippy_utils::{fn_has_unsatisfiable_preds, is_entrypoint_fn, meets_msrv, msrvs, trait_ref_of_method};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
use rustc_hir::def_id::CRATE_DEF_ID;
|
||||||
use rustc_hir::intravisit::FnKind;
|
use rustc_hir::intravisit::FnKind;
|
||||||
use rustc_hir::{Body, Constness, FnDecl, GenericParamKind, HirId};
|
use rustc_hir::{Body, Constness, FnDecl, GenericParamKind, HirId};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
|
@ -131,6 +132,18 @@ impl<'tcx> LateLintPass<'tcx> for MissingConstForFn {
|
||||||
FnKind::Closure => return,
|
FnKind::Closure => return,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Const fns are not allowed as methods in a trait.
|
||||||
|
{
|
||||||
|
let parent = cx.tcx.hir().get_parent_item(hir_id);
|
||||||
|
if parent != CRATE_DEF_ID {
|
||||||
|
if let hir::Node::Item(item) = cx.tcx.hir().get_by_def_id(parent) {
|
||||||
|
if let hir::ItemKind::Trait(..) = &item.kind {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mir = cx.tcx.optimized_mir(def_id);
|
let mir = cx.tcx.optimized_mir(def_id);
|
||||||
|
|
||||||
if let Err((span, err)) = is_min_const_fn(cx.tcx, mir, self.msrv.as_ref()) {
|
if let Err((span, err)) = is_min_const_fn(cx.tcx, mir, self.msrv.as_ref()) {
|
||||||
|
|
|
@ -32,32 +32,12 @@ pub fn is_min_const_fn<'a, 'tcx>(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, msrv:
|
||||||
| ty::PredicateKind::Projection(_)
|
| ty::PredicateKind::Projection(_)
|
||||||
| ty::PredicateKind::ConstEvaluatable(..)
|
| ty::PredicateKind::ConstEvaluatable(..)
|
||||||
| ty::PredicateKind::ConstEquate(..)
|
| ty::PredicateKind::ConstEquate(..)
|
||||||
|
| ty::PredicateKind::Trait(..)
|
||||||
| ty::PredicateKind::TypeWellFormedFromEnv(..) => continue,
|
| ty::PredicateKind::TypeWellFormedFromEnv(..) => continue,
|
||||||
ty::PredicateKind::ObjectSafe(_) => panic!("object safe predicate on function: {:#?}", predicate),
|
ty::PredicateKind::ObjectSafe(_) => panic!("object safe predicate on function: {:#?}", predicate),
|
||||||
ty::PredicateKind::ClosureKind(..) => panic!("closure kind predicate on function: {:#?}", predicate),
|
ty::PredicateKind::ClosureKind(..) => panic!("closure kind predicate on function: {:#?}", predicate),
|
||||||
ty::PredicateKind::Subtype(_) => panic!("subtype predicate on function: {:#?}", predicate),
|
ty::PredicateKind::Subtype(_) => panic!("subtype predicate on function: {:#?}", predicate),
|
||||||
ty::PredicateKind::Coerce(_) => panic!("coerce predicate on function: {:#?}", predicate),
|
ty::PredicateKind::Coerce(_) => panic!("coerce predicate on function: {:#?}", predicate),
|
||||||
ty::PredicateKind::Trait(pred) => {
|
|
||||||
if Some(pred.def_id()) == tcx.lang_items().sized_trait() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
match pred.self_ty().kind() {
|
|
||||||
ty::Param(ref p) => {
|
|
||||||
let generics = tcx.generics_of(current);
|
|
||||||
let def = generics.type_param(p, tcx);
|
|
||||||
let span = tcx.def_span(def.def_id);
|
|
||||||
return Err((
|
|
||||||
span,
|
|
||||||
"trait bounds other than `Sized` \
|
|
||||||
on const fn parameters are unstable"
|
|
||||||
.into(),
|
|
||||||
));
|
|
||||||
},
|
|
||||||
// other kinds of bounds are either tautologies
|
|
||||||
// or cause errors in other passes
|
|
||||||
_ => continue,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match predicates.parent {
|
match predicates.parent {
|
||||||
|
|
|
@ -49,8 +49,6 @@ fn sub(x: u32) -> usize {
|
||||||
unsafe { transmute(&x) }
|
unsafe { transmute(&x) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: This is currently not yet allowed to be const
|
|
||||||
// Once implemented, Clippy should be able to suggest this as const, too.
|
|
||||||
fn generic_arr<T: Copy>(t: [T; 1]) -> T {
|
fn generic_arr<T: Copy>(t: [T; 1]) -> T {
|
||||||
t[0]
|
t[0]
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,15 @@ LL | | }
|
||||||
| |_^
|
| |_^
|
||||||
|
|
||||||
error: this could be a `const fn`
|
error: this could be a `const fn`
|
||||||
--> $DIR/could_be_const.rs:67:9
|
--> $DIR/could_be_const.rs:52:1
|
||||||
|
|
|
||||||
|
LL | / fn generic_arr<T: Copy>(t: [T; 1]) -> T {
|
||||||
|
LL | | t[0]
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: this could be a `const fn`
|
||||||
|
--> $DIR/could_be_const.rs:65:9
|
||||||
|
|
|
|
||||||
LL | / pub fn b(self, a: &A) -> B {
|
LL | / pub fn b(self, a: &A) -> B {
|
||||||
LL | | B
|
LL | | B
|
||||||
|
@ -66,12 +74,12 @@ LL | | }
|
||||||
| |_________^
|
| |_________^
|
||||||
|
|
||||||
error: this could be a `const fn`
|
error: this could be a `const fn`
|
||||||
--> $DIR/could_be_const.rs:77:5
|
--> $DIR/could_be_const.rs:75:5
|
||||||
|
|
|
|
||||||
LL | / fn const_fn_stabilized_before_msrv(byte: u8) {
|
LL | / fn const_fn_stabilized_before_msrv(byte: u8) {
|
||||||
LL | | byte.is_ascii_digit();
|
LL | | byte.is_ascii_digit();
|
||||||
LL | | }
|
LL | | }
|
||||||
| |_____^
|
| |_____^
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue