Skip to content

Commit a41c44f

Browse files
Nits and formatting
1 parent 1e72c7f commit a41c44f

File tree

17 files changed

+130
-142
lines changed

17 files changed

+130
-142
lines changed

compiler/rustc_borrowck/src/type_check/constraint_conversion.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use rustc_middle::traits::query::NoSolution;
1010
use rustc_middle::traits::ObligationCause;
1111
use rustc_middle::ty::{self, GenericArgKind, Ty, TyCtxt, TypeFoldable, TypeVisitableExt};
1212
use rustc_span::Span;
13-
use rustc_trait_selection::solve::deeply_normalize;
1413
use rustc_trait_selection::traits::query::type_op::custom::CustomTypeOp;
1514
use rustc_trait_selection::traits::query::type_op::{TypeOp, TypeOpOutput};
1615
use rustc_trait_selection::traits::ScrubbedTraitError;
@@ -283,8 +282,9 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
283282
) -> Ty<'tcx> {
284283
let result = CustomTypeOp::new(
285284
|ocx| {
286-
deeply_normalize(
287-
ocx.infcx.at(&ObligationCause::dummy_with_span(self.span), self.param_env),
285+
ocx.deeply_normalize(
286+
&ObligationCause::dummy_with_span(self.span),
287+
self.param_env,
288288
ty,
289289
)
290290
.map_err(|_: Vec<ScrubbedTraitError<'tcx>>| NoSolution)

compiler/rustc_hir_analysis/src/check/compare_impl_item.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_hir::intravisit;
1010
use rustc_hir::{GenericParamKind, ImplItemKind};
1111
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
1212
use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt};
13-
use rustc_infer::traits::{util, FulfillmentErrorLike};
13+
use rustc_infer::traits::util;
1414
use rustc_middle::ty::error::{ExpectedFound, TypeError};
1515
use rustc_middle::ty::fold::BottomUpFolder;
1616
use rustc_middle::ty::util::ExplicitSelf;
@@ -764,10 +764,7 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
764764
Ok(&*tcx.arena.alloc(remapped_types))
765765
}
766766

767-
struct ImplTraitInTraitCollector<'a, 'tcx, E>
768-
where
769-
E: FulfillmentErrorLike<'tcx>,
770-
{
767+
struct ImplTraitInTraitCollector<'a, 'tcx, E> {
771768
ocx: &'a ObligationCtxt<'a, 'tcx, E>,
772769
types: FxIndexMap<DefId, (Ty<'tcx>, ty::GenericArgsRef<'tcx>)>,
773770
span: Span,
@@ -777,7 +774,7 @@ where
777774

778775
impl<'a, 'tcx, E> ImplTraitInTraitCollector<'a, 'tcx, E>
779776
where
780-
E: FulfillmentErrorLike<'tcx>,
777+
E: 'tcx,
781778
{
782779
fn new(
783780
ocx: &'a ObligationCtxt<'a, 'tcx, E>,
@@ -791,7 +788,7 @@ where
791788

792789
impl<'tcx, E> TypeFolder<TyCtxt<'tcx>> for ImplTraitInTraitCollector<'_, 'tcx, E>
793790
where
794-
E: FulfillmentErrorLike<'tcx>,
791+
E: 'tcx,
795792
{
796793
fn interner(&self) -> TyCtxt<'tcx> {
797794
self.ocx.infcx.tcx

compiler/rustc_hir_analysis/src/coherence/orphan.rs

+7-11
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@ use rustc_middle::ty::{TypeFoldable, TypeFolder, TypeSuperFoldable};
1212
use rustc_middle::ty::{TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
1313
use rustc_middle::{bug, span_bug};
1414
use rustc_span::def_id::{DefId, LocalDefId};
15-
use rustc_trait_selection::traits::{
16-
self, IsFirstInputType, ScrubbedTraitError, UncoveredTyParams,
17-
};
15+
use rustc_trait_selection::traits::{self, IsFirstInputType, UncoveredTyParams};
1816
use rustc_trait_selection::traits::{OrphanCheckErr, OrphanCheckMode};
19-
use rustc_trait_selection::traits::{StructurallyNormalizeExt, TraitEngineExt};
2017

2118
#[instrument(level = "debug", skip(tcx))]
2219
pub(crate) fn orphan_check_impl(
@@ -319,13 +316,12 @@ fn orphan_check<'tcx>(
319316
}
320317

321318
let ty = if infcx.next_trait_solver() {
322-
let mut fulfill_cx =
323-
<dyn traits::TraitEngine<'tcx, ScrubbedTraitError<'tcx>>>::new(&infcx);
324-
infcx
325-
.at(&cause, ty::ParamEnv::empty())
326-
.structurally_normalize(ty, &mut *fulfill_cx)
327-
.map(|ty| infcx.resolve_vars_if_possible(ty))
328-
.unwrap_or(ty)
319+
ocx.structurally_normalize(
320+
&cause,
321+
ty::ParamEnv::empty(),
322+
infcx.resolve_vars_if_possible(ty),
323+
)
324+
.unwrap_or(ty)
329325
} else {
330326
ty
331327
};

compiler/rustc_infer/src/infer/canonical/query_response.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use crate::infer::canonical::{
1515
use crate::infer::region_constraints::{Constraint, RegionConstraintData};
1616
use crate::infer::{DefineOpaqueTypes, InferCtxt, InferOk, InferResult};
1717
use crate::traits::query::NoSolution;
18-
use crate::traits::{FulfillmentErrorLike, TraitEngine};
1918
use crate::traits::{Obligation, ObligationCause, PredicateObligation};
19+
use crate::traits::{ScrubbedTraitError, TraitEngine};
2020
use rustc_data_structures::captures::Captures;
2121
use rustc_index::Idx;
2222
use rustc_index::IndexVec;
@@ -50,11 +50,11 @@ impl<'tcx> InferCtxt<'tcx> {
5050
/// - Finally, if any of the obligations result in a hard error,
5151
/// then `Err(NoSolution)` is returned.
5252
#[instrument(skip(self, inference_vars, answer, fulfill_cx), level = "trace")]
53-
pub fn make_canonicalized_query_response<T, E: FulfillmentErrorLike<'tcx>>(
53+
pub fn make_canonicalized_query_response<T>(
5454
&self,
5555
inference_vars: CanonicalVarValues<'tcx>,
5656
answer: T,
57-
fulfill_cx: &mut dyn TraitEngine<'tcx, E>,
57+
fulfill_cx: &mut dyn TraitEngine<'tcx, ScrubbedTraitError<'tcx>>,
5858
) -> Result<CanonicalQueryResponse<'tcx, T>, NoSolution>
5959
where
6060
T: Debug + TypeFoldable<TyCtxt<'tcx>>,
@@ -97,11 +97,11 @@ impl<'tcx> InferCtxt<'tcx> {
9797
/// Helper for `make_canonicalized_query_response` that does
9898
/// everything up until the final canonicalization.
9999
#[instrument(skip(self, fulfill_cx), level = "debug")]
100-
fn make_query_response<T, E: FulfillmentErrorLike<'tcx>>(
100+
fn make_query_response<T>(
101101
&self,
102102
inference_vars: CanonicalVarValues<'tcx>,
103103
answer: T,
104-
fulfill_cx: &mut dyn TraitEngine<'tcx, E>,
104+
fulfill_cx: &mut dyn TraitEngine<'tcx, ScrubbedTraitError<'tcx>>,
105105
) -> Result<QueryResponse<'tcx, T>, NoSolution>
106106
where
107107
T: Debug + TypeFoldable<TyCtxt<'tcx>>,

compiler/rustc_infer/src/infer/mod.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ pub use SubregionOrigin::*;
1212
pub use ValuePairs::*;
1313

1414
use crate::traits::{
15-
self, FulfillmentErrorLike, ObligationCause, ObligationInspector, PredicateObligations,
16-
TraitEngine,
15+
self, ObligationCause, ObligationInspector, PredicateObligations, TraitEngine,
1716
};
1817
use error_reporting::TypeErrCtxt;
1918
use free_regions::RegionRelations;
@@ -738,7 +737,7 @@ impl<'tcx> InferCtxtBuilder<'tcx> {
738737

739738
impl<'tcx, T> InferOk<'tcx, T> {
740739
/// Extracts `value`, registering any obligations into `fulfill_cx`.
741-
pub fn into_value_registering_obligations<E: FulfillmentErrorLike<'tcx>>(
740+
pub fn into_value_registering_obligations<E: 'tcx>(
742741
self,
743742
infcx: &InferCtxt<'tcx>,
744743
fulfill_cx: &mut dyn TraitEngine<'tcx, E>,

compiler/rustc_infer/src/traits/engine.rs

+27-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,32 @@ use rustc_middle::ty::{self, Ty, Upcast};
77

88
use super::{ObligationCause, PredicateObligation};
99

10-
pub trait TraitEngine<'tcx, E: FulfillmentErrorLike<'tcx>>: 'tcx {
10+
/// A trait error with most of its information removed. This is the error
11+
/// returned by an `ObligationCtxt` by default, and suitable if you just
12+
/// want to see if a predicate holds, and don't particularly care about the
13+
/// error itself (except for if it's an ambiguity or true error).
14+
///
15+
/// use `ObligationCtxt::new_with_diagnostics` to get a `FulfillmentError`.
16+
#[derive(Clone, Debug)]
17+
pub enum ScrubbedTraitError<'tcx> {
18+
/// A real error. This goal definitely does not hold.
19+
TrueError,
20+
/// An ambiguity. This goal may hold if further inference is done.
21+
Ambiguity,
22+
/// An old-solver-style cycle error, which will fatal.
23+
Cycle(Vec<PredicateObligation<'tcx>>),
24+
}
25+
26+
impl<'tcx> ScrubbedTraitError<'tcx> {
27+
pub fn is_true_error(&self) -> bool {
28+
match self {
29+
ScrubbedTraitError::TrueError => true,
30+
ScrubbedTraitError::Ambiguity | ScrubbedTraitError::Cycle(_) => false,
31+
}
32+
}
33+
}
34+
35+
pub trait TraitEngine<'tcx, E: 'tcx>: 'tcx {
1136
/// Requires that `ty` must implement the trait with `def_id` in
1237
/// the given environment. This trait must not have any type
1338
/// parameters (except for `Self`).
@@ -73,10 +98,6 @@ pub trait TraitEngine<'tcx, E: FulfillmentErrorLike<'tcx>>: 'tcx {
7398
) -> Vec<PredicateObligation<'tcx>>;
7499
}
75100

76-
pub trait FulfillmentErrorLike<'tcx>: Debug + 'tcx {
77-
fn is_true_error(&self) -> bool;
78-
}
79-
80-
pub trait FromSolverError<'tcx, E>: FulfillmentErrorLike<'tcx> {
101+
pub trait FromSolverError<'tcx, E>: Debug + 'tcx {
81102
fn from_solver_error(infcx: &InferCtxt<'tcx>, error: E) -> Self;
82103
}

compiler/rustc_infer/src/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub use self::ImplSource::*;
2222
pub use self::SelectionError::*;
2323
use crate::infer::InferCtxt;
2424

25-
pub use self::engine::{FromSolverError, FulfillmentErrorLike, TraitEngine};
25+
pub use self::engine::{FromSolverError, ScrubbedTraitError, TraitEngine};
2626
pub use self::project::MismatchedProjectionTypes;
2727
pub(crate) use self::project::UndoLog;
2828
pub use self::project::{

compiler/rustc_macros/src/extension.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ use syn::spanned::Spanned;
66
use syn::{
77
braced, parse_macro_input, Attribute, Generics, ImplItem, Pat, PatIdent, Path, Signature,
88
Token, TraitItem, TraitItemConst, TraitItemFn, TraitItemMacro, TraitItemType, Type, Visibility,
9+
WhereClause,
910
};
1011

1112
pub(crate) fn extension(
1213
attr: proc_macro::TokenStream,
1314
input: proc_macro::TokenStream,
1415
) -> proc_macro::TokenStream {
1516
let ExtensionAttr { vis, trait_ } = parse_macro_input!(attr as ExtensionAttr);
16-
let Impl { attrs, generics, self_ty, items } = parse_macro_input!(input as Impl);
17+
let Impl { attrs, generics, self_ty, items, wc } = parse_macro_input!(input as Impl);
1718
let headers: Vec<_> = items
1819
.iter()
1920
.map(|item| match item {
@@ -59,7 +60,7 @@ pub(crate) fn extension(
5960
#(#headers)*
6061
}
6162

62-
impl #generics #trait_ for #self_ty {
63+
impl #generics #trait_ for #self_ty #wc {
6364
#(#items)*
6465
}
6566
}
@@ -133,6 +134,7 @@ struct Impl {
133134
generics: Generics,
134135
self_ty: Type,
135136
items: Vec<ImplItem>,
137+
wc: Option<WhereClause>,
136138
}
137139

138140
impl Parse for Impl {
@@ -141,6 +143,7 @@ impl Parse for Impl {
141143
let _: Token![impl] = input.parse()?;
142144
let generics = input.parse()?;
143145
let self_ty = input.parse()?;
146+
let wc = input.parse()?;
144147

145148
let content;
146149
let _brace_token = braced!(content in input);
@@ -149,6 +152,6 @@ impl Parse for Impl {
149152
items.push(content.parse()?);
150153
}
151154

152-
Ok(Impl { attrs, generics, self_ty, items })
155+
Ok(Impl { attrs, generics, self_ty, items, wc })
153156
}
154157
}

compiler/rustc_trait_selection/src/solve/fulfill.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use rustc_infer::infer::InferCtxt;
66
use rustc_infer::traits::query::NoSolution;
77
use rustc_infer::traits::solve::{CandidateSource, GoalSource, MaybeCause};
88
use rustc_infer::traits::{
9-
self, FromSolverError, FulfillmentErrorLike, MismatchedProjectionTypes, Obligation,
10-
ObligationCause, ObligationCauseCode, PredicateObligation, SelectionError, TraitEngine,
9+
self, FromSolverError, MismatchedProjectionTypes, Obligation, ObligationCause,
10+
ObligationCauseCode, PredicateObligation, SelectionError, TraitEngine,
1111
};
1212
use rustc_middle::bug;
1313
use rustc_middle::ty::error::{ExpectedFound, TypeError};
@@ -31,7 +31,7 @@ use super::{Certainty, InferCtxtEvalExt};
3131
///
3232
/// It is also likely that we want to use slightly different datastructures
3333
/// here as this will have to deal with far more root goals than `evaluate_all`.
34-
pub struct FulfillmentCtxt<'tcx, E: FulfillmentErrorLike<'tcx>> {
34+
pub struct FulfillmentCtxt<'tcx, E: 'tcx> {
3535
obligations: ObligationStorage<'tcx>,
3636

3737
/// The snapshot in which this context was created. Using the context
@@ -93,7 +93,7 @@ impl<'tcx> ObligationStorage<'tcx> {
9393
}
9494
}
9595

96-
impl<'tcx, E: FulfillmentErrorLike<'tcx>> FulfillmentCtxt<'tcx, E> {
96+
impl<'tcx, E: 'tcx> FulfillmentCtxt<'tcx, E> {
9797
pub fn new(infcx: &InferCtxt<'tcx>) -> FulfillmentCtxt<'tcx, E> {
9898
assert!(
9999
infcx.next_trait_solver(),
@@ -123,8 +123,9 @@ impl<'tcx, E: FulfillmentErrorLike<'tcx>> FulfillmentCtxt<'tcx, E> {
123123
}
124124
}
125125

126-
impl<'tcx, E: FromSolverError<'tcx, NextSolverError<'tcx>>> TraitEngine<'tcx, E>
127-
for FulfillmentCtxt<'tcx, E>
126+
impl<'tcx, E> TraitEngine<'tcx, E> for FulfillmentCtxt<'tcx, E>
127+
where
128+
E: FromSolverError<'tcx, NextSolverError<'tcx>>,
128129
{
129130
#[instrument(level = "trace", skip(self, infcx))]
130131
fn register_predicate_obligation(

compiler/rustc_trait_selection/src/solve/inspect/analyse.rs

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use rustc_ast_ir::try_visit;
1313
use rustc_ast_ir::visit::VisitorResult;
1414
use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, InferOk};
15-
use rustc_infer::traits::FulfillmentErrorLike as _;
1615
use rustc_macros::extension;
1716
use rustc_middle::traits::query::NoSolution;
1817
use rustc_middle::traits::solve::{inspect, QueryResult};

compiler/rustc_trait_selection/src/solve/normalize.rs

+19-17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::fmt::Debug;
12
use std::marker::PhantomData;
23

34
use crate::traits::error_reporting::{OverflowCause, TypeErrCtxtExt};
@@ -6,7 +7,7 @@ use crate::traits::{BoundVarReplacer, PlaceholderReplacer, ScrubbedTraitError};
67
use rustc_data_structures::stack::ensure_sufficient_stack;
78
use rustc_infer::infer::at::At;
89
use rustc_infer::infer::InferCtxt;
9-
use rustc_infer::traits::{FromSolverError, FulfillmentErrorLike, Obligation, TraitEngine};
10+
use rustc_infer::traits::{FromSolverError, Obligation, TraitEngine};
1011
use rustc_middle::traits::ObligationCause;
1112
use rustc_middle::ty::{self, Ty, TyCtxt, UniverseIndex};
1213
use rustc_middle::ty::{FallibleTypeFolder, TypeFolder, TypeSuperFoldable};
@@ -16,14 +17,11 @@ use super::{FulfillmentCtxt, NextSolverError};
1617

1718
/// Deeply normalize all aliases in `value`. This does not handle inference and expects
1819
/// its input to be already fully resolved.
19-
pub fn deeply_normalize<
20-
'tcx,
20+
pub fn deeply_normalize<'tcx, T, E>(at: At<'_, 'tcx>, value: T) -> Result<T, Vec<E>>
21+
where
2122
T: TypeFoldable<TyCtxt<'tcx>>,
2223
E: FromSolverError<'tcx, NextSolverError<'tcx>>,
23-
>(
24-
at: At<'_, 'tcx>,
25-
value: T,
26-
) -> Result<T, Vec<E>> {
24+
{
2725
assert!(!value.has_escaping_bound_vars());
2826
deeply_normalize_with_skipped_universes(at, value, vec![])
2927
}
@@ -34,31 +32,34 @@ pub fn deeply_normalize<
3432
/// Additionally takes a list of universes which represents the binders which have been
3533
/// entered before passing `value` to the function. This is currently needed for
3634
/// `normalize_erasing_regions`, which skips binders as it walks through a type.
37-
pub fn deeply_normalize_with_skipped_universes<
38-
'tcx,
39-
T: TypeFoldable<TyCtxt<'tcx>>,
40-
E: FromSolverError<'tcx, NextSolverError<'tcx>>,
41-
>(
35+
pub fn deeply_normalize_with_skipped_universes<'tcx, T, E>(
4236
at: At<'_, 'tcx>,
4337
value: T,
4438
universes: Vec<Option<UniverseIndex>>,
45-
) -> Result<T, Vec<E>> {
39+
) -> Result<T, Vec<E>>
40+
where
41+
T: TypeFoldable<TyCtxt<'tcx>>,
42+
E: FromSolverError<'tcx, NextSolverError<'tcx>>,
43+
{
4644
let fulfill_cx = FulfillmentCtxt::new(at.infcx);
4745
let mut folder =
4846
NormalizationFolder { at, fulfill_cx, depth: 0, universes, _errors: PhantomData };
4947

5048
value.try_fold_with(&mut folder)
5149
}
5250

53-
struct NormalizationFolder<'me, 'tcx, E: FulfillmentErrorLike<'tcx>> {
51+
struct NormalizationFolder<'me, 'tcx, E> {
5452
at: At<'me, 'tcx>,
5553
fulfill_cx: FulfillmentCtxt<'tcx, E>,
5654
depth: usize,
5755
universes: Vec<Option<UniverseIndex>>,
5856
_errors: PhantomData<E>,
5957
}
6058

61-
impl<'tcx, E: FromSolverError<'tcx, NextSolverError<'tcx>>> NormalizationFolder<'_, 'tcx, E> {
59+
impl<'tcx, E> NormalizationFolder<'_, 'tcx, E>
60+
where
61+
E: FromSolverError<'tcx, NextSolverError<'tcx>>,
62+
{
6263
fn normalize_alias_ty(&mut self, alias_ty: Ty<'tcx>) -> Result<Ty<'tcx>, Vec<E>> {
6364
assert!(matches!(alias_ty.kind(), ty::Alias(..)));
6465

@@ -150,8 +151,9 @@ impl<'tcx, E: FromSolverError<'tcx, NextSolverError<'tcx>>> NormalizationFolder<
150151
}
151152
}
152153

153-
impl<'tcx, E: FromSolverError<'tcx, NextSolverError<'tcx>>> FallibleTypeFolder<TyCtxt<'tcx>>
154-
for NormalizationFolder<'_, 'tcx, E>
154+
impl<'tcx, E> FallibleTypeFolder<TyCtxt<'tcx>> for NormalizationFolder<'_, 'tcx, E>
155+
where
156+
E: FromSolverError<'tcx, NextSolverError<'tcx>> + Debug,
155157
{
156158
type Error = Vec<E>;
157159

0 commit comments

Comments
 (0)