Skip to content

Commit 6d4c257

Browse files
authored
Rollup merge of rust-lang#112772 - compiler-errors:clauses-1, r=lcnr
Add a fully fledged `Clause` type, rename old `Clause` to `ClauseKind` Does two basic things before I put up a more delicate set of PRs (along the lines of rust-lang#112714, but hopefully much cleaner) that migrate existing usages of `ty::Predicate` to `ty::Clause` (`predicates_of`/`item_bounds`/`ParamEnv::caller_bounds`). 1. Rename `Clause` to `ClauseKind`, so it's parallel with `PredicateKind`. 2. Add a new `Clause` type which is parallel to `Predicate`. * This type exposes `Clause::kind(self) -> Binder<'tcx, ClauseKind<'tcx>>` which is parallel to `Predicate::kind` 😸 The new `Clause` type essentially acts as a newtype wrapper around `Predicate` that asserts that it is specifically a `PredicateKind::Clause`. Turns out from experimentation[^1] that this is not negative performance-wise, which is wonderful, since this a much simpler design than something that requires encoding the discriminant into the alignment bits of a predicate kind, or something else like that... r? ``@lcnr`` or ``@oli-obk`` [^1]: rust-lang#112714 (comment)
2 parents 9a65f46 + b2c7ce8 commit 6d4c257

11 files changed

+37
-37
lines changed

clippy_lints/src/dereference.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use rustc_lint::{LateContext, LateLintPass};
2626
use rustc_middle::mir::{Rvalue, StatementKind};
2727
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AutoBorrow, AutoBorrowMutability};
2828
use rustc_middle::ty::{
29-
self, Binder, BoundVariableKind, Clause, EarlyBinder, FnSig, GenericArgKind, List, ParamEnv, ParamTy,
29+
self, Binder, BoundVariableKind, ClauseKind, EarlyBinder, FnSig, GenericArgKind, List, ParamEnv, ParamTy,
3030
PredicateKind, ProjectionPredicate, Ty, TyCtxt, TypeVisitableExt, TypeckResults,
3131
};
3232
use rustc_session::{declare_tool_lint, impl_lint_pass};
@@ -1133,7 +1133,7 @@ fn needless_borrow_impl_arg_position<'tcx>(
11331133
let projection_predicates = predicates
11341134
.iter()
11351135
.filter_map(|predicate| {
1136-
if let PredicateKind::Clause(Clause::Projection(projection_predicate)) = predicate.kind().skip_binder() {
1136+
if let PredicateKind::Clause(ClauseKind::Projection(projection_predicate)) = predicate.kind().skip_binder() {
11371137
Some(projection_predicate)
11381138
} else {
11391139
None
@@ -1147,7 +1147,7 @@ fn needless_borrow_impl_arg_position<'tcx>(
11471147
if predicates
11481148
.iter()
11491149
.filter_map(|predicate| {
1150-
if let PredicateKind::Clause(Clause::Trait(trait_predicate)) = predicate.kind().skip_binder()
1150+
if let PredicateKind::Clause(ClauseKind::Trait(trait_predicate)) = predicate.kind().skip_binder()
11511151
&& trait_predicate.trait_ref.self_ty() == param_ty.to_ty(cx.tcx)
11521152
{
11531153
Some(trait_predicate.trait_ref.def_id)
@@ -1209,7 +1209,7 @@ fn needless_borrow_impl_arg_position<'tcx>(
12091209
}
12101210

12111211
predicates.iter().all(|predicate| {
1212-
if let PredicateKind::Clause(Clause::Trait(trait_predicate)) = predicate.kind().skip_binder()
1212+
if let PredicateKind::Clause(ClauseKind::Trait(trait_predicate)) = predicate.kind().skip_binder()
12131213
&& cx.tcx.is_diagnostic_item(sym::IntoIterator, trait_predicate.trait_ref.def_id)
12141214
&& let ty::Param(param_ty) = trait_predicate.self_ty().kind()
12151215
&& let GenericArgKind::Type(ty) = substs_with_referent_ty[param_ty.index as usize].unpack()

clippy_lints/src/derive.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use rustc_lint::{LateContext, LateLintPass};
1414
use rustc_middle::hir::nested_filter;
1515
use rustc_middle::traits::Reveal;
1616
use rustc_middle::ty::{
17-
self, Binder, BoundConstness, Clause, GenericArgKind, GenericParamDefKind, ImplPolarity, ParamEnv, PredicateKind,
17+
self, Binder, BoundConstness, ClauseKind, GenericArgKind, GenericParamDefKind, ImplPolarity, ParamEnv, PredicateKind,
1818
TraitPredicate, Ty, TyCtxt,
1919
};
2020
use rustc_session::{declare_lint_pass, declare_tool_lint};
@@ -503,7 +503,7 @@ fn param_env_for_derived_eq(tcx: TyCtxt<'_>, did: DefId, eq_trait_id: DefId) ->
503503

504504
let ty_predicates = tcx.predicates_of(did).predicates;
505505
for (p, _) in ty_predicates {
506-
if let PredicateKind::Clause(Clause::Trait(p)) = p.kind().skip_binder()
506+
if let PredicateKind::Clause(ClauseKind::Trait(p)) = p.kind().skip_binder()
507507
&& p.trait_ref.def_id == eq_trait_id
508508
&& let ty::Param(self_ty) = p.trait_ref.self_ty().kind()
509509
&& p.constness == BoundConstness::NotConst
@@ -516,7 +516,7 @@ fn param_env_for_derived_eq(tcx: TyCtxt<'_>, did: DefId, eq_trait_id: DefId) ->
516516
ParamEnv::new(
517517
tcx.mk_predicates_from_iter(ty_predicates.iter().map(|&(p, _)| p).chain(
518518
params.iter().filter(|&&(_, needs_eq)| needs_eq).map(|&(param, _)| {
519-
tcx.mk_predicate(Binder::dummy(PredicateKind::Clause(Clause::Trait(TraitPredicate {
519+
tcx.mk_predicate(Binder::dummy(PredicateKind::Clause(ClauseKind::Trait(TraitPredicate {
520520
trait_ref: ty::TraitRef::new(tcx, eq_trait_id, [tcx.mk_param_from_def(param)]),
521521
constness: BoundConstness::NotConst,
522522
polarity: ImplPolarity::Positive,

clippy_lints/src/future_not_send.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_hir::intravisit::FnKind;
44
use rustc_hir::{Body, FnDecl};
55
use rustc_infer::infer::TyCtxtInferExt;
66
use rustc_lint::{LateContext, LateLintPass};
7-
use rustc_middle::ty::{self, AliasTy, Clause, PredicateKind};
7+
use rustc_middle::ty::{self, AliasTy, ClauseKind, PredicateKind};
88
use rustc_session::{declare_lint_pass, declare_tool_lint};
99
use rustc_span::def_id::LocalDefId;
1010
use rustc_span::{sym, Span};
@@ -93,7 +93,7 @@ impl<'tcx> LateLintPass<'tcx> for FutureNotSend {
9393
infcx
9494
.err_ctxt()
9595
.maybe_note_obligation_cause_for_async_await(db, &obligation);
96-
if let PredicateKind::Clause(Clause::Trait(trait_pred)) =
96+
if let PredicateKind::Clause(ClauseKind::Trait(trait_pred)) =
9797
obligation.predicate.kind().skip_binder()
9898
{
9999
db.note(format!(

clippy_lints/src/methods/needless_collect.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_hir::{
1616
};
1717
use rustc_lint::LateContext;
1818
use rustc_middle::hir::nested_filter;
19-
use rustc_middle::ty::{self, AssocKind, Clause, EarlyBinder, GenericArg, GenericArgKind, PredicateKind, Ty};
19+
use rustc_middle::ty::{self, AssocKind, ClauseKind, EarlyBinder, GenericArg, GenericArgKind, PredicateKind, Ty};
2020
use rustc_span::symbol::Ident;
2121
use rustc_span::{sym, Span, Symbol};
2222

@@ -175,7 +175,7 @@ fn check_collect_into_intoiterator<'tcx>(
175175
.caller_bounds()
176176
.into_iter()
177177
.filter_map(|p| {
178-
if let PredicateKind::Clause(Clause::Trait(t)) = p.kind().skip_binder()
178+
if let PredicateKind::Clause(ClauseKind::Trait(t)) = p.kind().skip_binder()
179179
&& cx.tcx.is_diagnostic_item(sym::IntoIterator,t.trait_ref.def_id) {
180180
Some(t.self_ty())
181181
} else {

clippy_lints/src/methods/unnecessary_to_owned.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use rustc_lint::LateContext;
1414
use rustc_middle::mir::Mutability;
1515
use rustc_middle::ty::adjustment::{Adjust, Adjustment, OverloadedDeref};
1616
use rustc_middle::ty::subst::{GenericArg, GenericArgKind, SubstsRef};
17-
use rustc_middle::ty::{self, Clause, EarlyBinder, ParamTy, PredicateKind, ProjectionPredicate, TraitPredicate, Ty};
17+
use rustc_middle::ty::{self, ClauseKind, EarlyBinder, ParamTy, PredicateKind, ProjectionPredicate, TraitPredicate, Ty};
1818
use rustc_span::{sym, Symbol};
1919
use rustc_trait_selection::traits::{query::evaluate_obligation::InferCtxtExt as _, Obligation, ObligationCause};
2020

@@ -345,12 +345,12 @@ fn get_input_traits_and_projections<'tcx>(
345345
let mut projection_predicates = Vec::new();
346346
for predicate in cx.tcx.param_env(callee_def_id).caller_bounds() {
347347
match predicate.kind().skip_binder() {
348-
PredicateKind::Clause(Clause::Trait(trait_predicate)) => {
348+
PredicateKind::Clause(ClauseKind::Trait(trait_predicate)) => {
349349
if trait_predicate.trait_ref.self_ty() == input {
350350
trait_predicates.push(trait_predicate);
351351
}
352352
},
353-
PredicateKind::Clause(Clause::Projection(projection_predicate)) => {
353+
PredicateKind::Clause(ClauseKind::Projection(projection_predicate)) => {
354354
if projection_predicate.projection_ty.self_ty() == input {
355355
projection_predicates.push(projection_predicate);
356356
}
@@ -407,7 +407,7 @@ fn can_change_type<'a>(cx: &LateContext<'a>, mut expr: &'a Expr<'a>, mut ty: Ty<
407407

408408
let mut trait_predicates = cx.tcx.param_env(callee_def_id)
409409
.caller_bounds().iter().filter(|predicate| {
410-
if let PredicateKind::Clause(Clause::Trait(trait_predicate))
410+
if let PredicateKind::Clause(ClauseKind::Trait(trait_predicate))
411411
= predicate.kind().skip_binder()
412412
&& trait_predicate.trait_ref.self_ty() == *param_ty
413413
{

clippy_lints/src/needless_pass_by_value.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
126126
.filter_map(|pred| {
127127
// Note that we do not want to deal with qualified predicates here.
128128
match pred.kind().no_bound_vars() {
129-
Some(ty::PredicateKind::Clause(ty::Clause::Trait(pred))) if pred.def_id() != sized_trait => {
129+
Some(ty::PredicateKind::Clause(ty::ClauseKind::Trait(pred))) if pred.def_id() != sized_trait => {
130130
Some(pred)
131131
},
132132
_ => None,

clippy_lints/src/ptr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use rustc_infer::infer::TyCtxtInferExt;
1919
use rustc_infer::traits::{Obligation, ObligationCause};
2020
use rustc_lint::{LateContext, LateLintPass};
2121
use rustc_middle::hir::nested_filter;
22-
use rustc_middle::ty::{self, Binder, Clause, ExistentialPredicate, List, PredicateKind, Ty};
22+
use rustc_middle::ty::{self, Binder, ClauseKind, ExistentialPredicate, List, PredicateKind, Ty};
2323
use rustc_session::{declare_lint_pass, declare_tool_lint};
2424
use rustc_span::source_map::Span;
2525
use rustc_span::sym;
@@ -697,7 +697,7 @@ fn matches_preds<'tcx>(
697697
ObligationCause::dummy(),
698698
cx.param_env,
699699
cx.tcx
700-
.mk_predicate(Binder::dummy(PredicateKind::Clause(Clause::Projection(
700+
.mk_predicate(Binder::dummy(PredicateKind::Clause(ClauseKind::Projection(
701701
p.with_self_ty(cx.tcx, ty),
702702
)))),
703703
)),

clippy_lints/src/unit_return_expecting_ord.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_hir::def_id::DefId;
44
use rustc_hir::{Closure, Expr, ExprKind, StmtKind};
55
use rustc_lint::{LateContext, LateLintPass};
66
use rustc_middle::ty;
7-
use rustc_middle::ty::{Clause, GenericPredicates, PredicateKind, ProjectionPredicate, TraitPredicate};
7+
use rustc_middle::ty::{ClauseKind, GenericPredicates, PredicateKind, ProjectionPredicate, TraitPredicate};
88
use rustc_session::{declare_lint_pass, declare_tool_lint};
99
use rustc_span::{sym, BytePos, Span};
1010

@@ -45,7 +45,7 @@ fn get_trait_predicates_for_trait_id<'tcx>(
4545
let mut preds = Vec::new();
4646
for (pred, _) in generics.predicates {
4747
if_chain! {
48-
if let PredicateKind::Clause(Clause::Trait(poly_trait_pred)) = pred.kind().skip_binder();
48+
if let PredicateKind::Clause(ClauseKind::Trait(poly_trait_pred)) = pred.kind().skip_binder();
4949
let trait_pred = cx.tcx.erase_late_bound_regions(pred.kind().rebind(poly_trait_pred));
5050
if let Some(trait_def_id) = trait_id;
5151
if trait_def_id == trait_pred.trait_ref.def_id;
@@ -63,7 +63,7 @@ fn get_projection_pred<'tcx>(
6363
trait_pred: TraitPredicate<'tcx>,
6464
) -> Option<ProjectionPredicate<'tcx>> {
6565
generics.predicates.iter().find_map(|(proj_pred, _)| {
66-
if let ty::PredicateKind::Clause(Clause::Projection(pred)) = proj_pred.kind().skip_binder() {
66+
if let ty::PredicateKind::Clause(ClauseKind::Projection(pred)) = proj_pred.kind().skip_binder() {
6767
let projection_pred = cx.tcx.erase_late_bound_regions(proj_pred.kind().rebind(pred));
6868
if projection_pred.projection_ty.substs == trait_pred.trait_ref.substs {
6969
return Some(projection_pred);

clippy_utils/src/eager_or_lazy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fn fn_eagerness(cx: &LateContext<'_>, fn_id: DefId, name: Symbol, have_one_arg:
7373
.flat_map(|v| v.fields.iter())
7474
.any(|x| matches!(cx.tcx.type_of(x.did).subst_identity().peel_refs().kind(), ty::Param(_)))
7575
&& all_predicates_of(cx.tcx, fn_id).all(|(pred, _)| match pred.kind().skip_binder() {
76-
PredicateKind::Clause(ty::Clause::Trait(pred)) => cx.tcx.trait_def(pred.trait_ref.def_id).is_marker,
76+
PredicateKind::Clause(ty::ClauseKind::Trait(pred)) => cx.tcx.trait_def(pred.trait_ref.def_id).is_marker,
7777
_ => true,
7878
})
7979
&& subs.types().all(|x| matches!(x.peel_refs().kind(), ty::Param(_)))

clippy_utils/src/qualify_min_const_fn.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ pub fn is_min_const_fn<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, msrv: &Msrv)
2727
for (predicate, _) in predicates.predicates {
2828
match predicate.kind().skip_binder() {
2929
ty::PredicateKind::Clause(
30-
ty::Clause::RegionOutlives(_)
31-
| ty::Clause::TypeOutlives(_)
32-
| ty::Clause::Projection(_)
33-
| ty::Clause::Trait(..)
34-
| ty::Clause::ConstArgHasType(..),
30+
ty::ClauseKind::RegionOutlives(_)
31+
| ty::ClauseKind::TypeOutlives(_)
32+
| ty::ClauseKind::Projection(_)
33+
| ty::ClauseKind::Trait(..)
34+
| ty::ClauseKind::ConstArgHasType(..),
3535
)
36-
| ty::PredicateKind::Clause(ty::Clause::WellFormed(_))
37-
| ty::PredicateKind::Clause(ty::Clause::ConstEvaluatable(..))
36+
| ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(_))
37+
| ty::PredicateKind::Clause(ty::ClauseKind::ConstEvaluatable(..))
3838
| ty::PredicateKind::ConstEquate(..)
3939
| ty::PredicateKind::TypeWellFormedFromEnv(..) => continue,
4040
ty::PredicateKind::AliasRelate(..) => panic!("alias relate predicate on function: {predicate:#?}"),

clippy_utils/src/ty.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub fn contains_ty_adt_constructor_opaque<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'
9494
match predicate.kind().skip_binder() {
9595
// For `impl Trait<U>`, it will register a predicate of `T: Trait<U>`, so we go through
9696
// and check substitutions to find `U`.
97-
ty::PredicateKind::Clause(ty::Clause::Trait(trait_predicate)) => {
97+
ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_predicate)) => {
9898
if trait_predicate
9999
.trait_ref
100100
.substs
@@ -107,7 +107,7 @@ pub fn contains_ty_adt_constructor_opaque<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'
107107
},
108108
// For `impl Trait<Assoc=U>`, it will register a predicate of `<T as Trait>::Assoc = U`,
109109
// so we check the term for `U`.
110-
ty::PredicateKind::Clause(ty::Clause::Projection(projection_predicate)) => {
110+
ty::PredicateKind::Clause(ty::ClauseKind::Projection(projection_predicate)) => {
111111
if let ty::TermKind::Ty(ty) = projection_predicate.term.unpack() {
112112
if contains_ty_adt_constructor_opaque_inner(cx, ty, needle, seen) {
113113
return true;
@@ -268,7 +268,7 @@ pub fn is_must_use_ty<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> bool {
268268
ty::Tuple(substs) => substs.iter().any(|ty| is_must_use_ty(cx, ty)),
269269
ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }) => {
270270
for (predicate, _) in cx.tcx.explicit_item_bounds(def_id).skip_binder() {
271-
if let ty::PredicateKind::Clause(ty::Clause::Trait(trait_predicate)) = predicate.kind().skip_binder() {
271+
if let ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_predicate)) = predicate.kind().skip_binder() {
272272
if cx.tcx.has_attr(trait_predicate.trait_ref.def_id, sym::must_use) {
273273
return true;
274274
}
@@ -707,7 +707,7 @@ fn sig_from_bounds<'tcx>(
707707

708708
for pred in predicates {
709709
match pred.kind().skip_binder() {
710-
PredicateKind::Clause(ty::Clause::Trait(p))
710+
PredicateKind::Clause(ty::ClauseKind::Trait(p))
711711
if (lang_items.fn_trait() == Some(p.def_id())
712712
|| lang_items.fn_mut_trait() == Some(p.def_id())
713713
|| lang_items.fn_once_trait() == Some(p.def_id()))
@@ -720,7 +720,7 @@ fn sig_from_bounds<'tcx>(
720720
}
721721
inputs = Some(i);
722722
},
723-
PredicateKind::Clause(ty::Clause::Projection(p))
723+
PredicateKind::Clause(ty::ClauseKind::Projection(p))
724724
if Some(p.projection_ty.def_id) == lang_items.fn_once_output() && p.projection_ty.self_ty() == ty =>
725725
{
726726
if output.is_some() {
@@ -747,7 +747,7 @@ fn sig_for_projection<'tcx>(cx: &LateContext<'tcx>, ty: AliasTy<'tcx>) -> Option
747747
.subst_iter_copied(cx.tcx, ty.substs)
748748
{
749749
match pred.kind().skip_binder() {
750-
PredicateKind::Clause(ty::Clause::Trait(p))
750+
PredicateKind::Clause(ty::ClauseKind::Trait(p))
751751
if (lang_items.fn_trait() == Some(p.def_id())
752752
|| lang_items.fn_mut_trait() == Some(p.def_id())
753753
|| lang_items.fn_once_trait() == Some(p.def_id())) =>
@@ -760,7 +760,7 @@ fn sig_for_projection<'tcx>(cx: &LateContext<'tcx>, ty: AliasTy<'tcx>) -> Option
760760
}
761761
inputs = Some(i);
762762
},
763-
PredicateKind::Clause(ty::Clause::Projection(p))
763+
PredicateKind::Clause(ty::ClauseKind::Projection(p))
764764
if Some(p.projection_ty.def_id) == lang_items.fn_once_output() =>
765765
{
766766
if output.is_some() {
@@ -950,7 +950,7 @@ pub fn ty_is_fn_once_param<'tcx>(tcx: TyCtxt<'_>, ty: Ty<'tcx>, predicates: &'tc
950950
predicates
951951
.iter()
952952
.try_fold(false, |found, p| {
953-
if let PredicateKind::Clause(ty::Clause::Trait(p)) = p.kind().skip_binder()
953+
if let PredicateKind::Clause(ty::ClauseKind::Trait(p)) = p.kind().skip_binder()
954954
&& let ty::Param(self_ty) = p.trait_ref.self_ty().kind()
955955
&& ty.index == self_ty.index
956956
{

0 commit comments

Comments
 (0)