Skip to content

Commit c8d4a52

Browse files
committed
impl_trait_ref
1 parent f37aff3 commit c8d4a52

File tree

7 files changed

+20
-44
lines changed

7 files changed

+20
-44
lines changed

crates/flux-driver/src/collector/detached_specs.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,11 @@ impl TraitImplResolver {
114114
for (trait_id, impl_ids) in tcx.all_local_trait_impls(()) {
115115
let trait_ = LookupRes::DefId(*trait_id);
116116
for impl_id in impl_ids {
117-
if let Some(poly_trait_ref) = tcx.impl_trait_ref(*impl_id) {
118-
let self_ty = poly_trait_ref.instantiate_identity().self_ty();
119-
let self_ty = LookupRes::new(&self_ty);
120-
let key = TraitImplKey { trait_, self_ty };
121-
items.insert(key, *impl_id);
122-
}
117+
let poly_trait_ref = tcx.impl_trait_ref(*impl_id);
118+
let self_ty = poly_trait_ref.instantiate_identity().self_ty();
119+
let self_ty = LookupRes::new(&self_ty);
120+
let key = TraitImplKey { trait_, self_ty };
121+
items.insert(key, *impl_id);
123122
}
124123
}
125124
Self { items }

crates/flux-driver/src/collector/extern_specs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ impl<'a, 'sess, 'tcx> ExternSpecCollector<'a, 'sess, 'tcx> {
315315
} else {
316316
let opt_extern_impl_id = self.tcx().impl_of_assoc(callee_id);
317317
if let Some(extern_impl_id) = opt_extern_impl_id {
318-
debug_assert!(self.tcx().trait_id_of_impl(extern_impl_id).is_none());
318+
debug_assert!(!self.tcx().impl_is_of_trait(extern_impl_id));
319319
Ok(ExternImplItem { impl_id: extern_impl_id, item_id: callee_id })
320320
} else {
321321
Err(self.invalid_item_in_inherent_impl(item.owner_id, callee_id))

crates/flux-fhir-analysis/src/conv/mod.rs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -914,8 +914,7 @@ impl<'genv, 'tcx: 'genv, P: ConvPhase<'genv, 'tcx>> ConvCtxt<P> {
914914
let assoc_segment =
915915
fhir::PathSegment { args: &[], constraints: &[], ident, res: fhir::Res::Err };
916916
let mut env = Env::empty();
917-
let alias_ty =
918-
self.conv_type_relative_type_path(&mut env, ident.span, res, &assoc_segment)?;
917+
let alias_ty = self.conv_type_relative_type_path(&mut env, res, &assoc_segment)?;
919918
return Ok(rty::Sort::Alias(rty::AliasKind::Projection, alias_ty));
920919
}
921920
fhir::SortRes::PrimSort(fhir::PrimSort::Set) => {
@@ -1444,7 +1443,7 @@ impl<'genv, 'tcx: 'genv, P: ConvPhase<'genv, 'tcx>> ConvCtxt<P> {
14441443
let qself_res =
14451444
if let Some(path) = qself.as_path() { path.res } else { fhir::Res::Err };
14461445
let alias_ty = self
1447-
.conv_type_relative_type_path(env, qself.span, qself_res, segment)?
1446+
.conv_type_relative_type_path(env, qself_res, segment)?
14481447
.shift_in_escaping(1);
14491448
let bty = rty::BaseTy::Alias(rty::AliasKind::Projection, alias_ty);
14501449
let sort = bty.sort();
@@ -1464,18 +1463,14 @@ impl<'genv, 'tcx: 'genv, P: ConvPhase<'genv, 'tcx>> ConvCtxt<P> {
14641463
fn conv_type_relative_path<Tag: AssocItemTag>(
14651464
&mut self,
14661465
tag: Tag,
1467-
qself_span: Span,
14681466
qself_res: fhir::Res,
14691467
assoc_ident: Ident,
14701468
) -> QueryResult<(Tag::AssocItem<'tcx>, rty::TraitRef)> {
14711469
let tcx = self.tcx();
14721470

14731471
let bound = match qself_res {
14741472
fhir::Res::SelfTyAlias { alias_to: impl_def_id, is_trait_impl: true } => {
1475-
let Some(trait_ref) = tcx.impl_trait_ref(impl_def_id) else {
1476-
// A cycle error occurred most likely (comment copied from rustc)
1477-
span_bug!(qself_span, "expected cycle error");
1478-
};
1473+
let trait_ref = tcx.impl_trait_ref(impl_def_id);
14791474

14801475
self.probe_single_bound_for_assoc_item(
14811476
|| {
@@ -1535,16 +1530,11 @@ impl<'genv, 'tcx: 'genv, P: ConvPhase<'genv, 'tcx>> ConvCtxt<P> {
15351530
fn conv_type_relative_type_path(
15361531
&mut self,
15371532
env: &mut Env,
1538-
qself_span: Span,
15391533
qself_res: fhir::Res,
15401534
assoc_segment: &fhir::PathSegment,
15411535
) -> QueryResult<rty::AliasTy> {
1542-
let (assoc_item, trait_ref) = self.conv_type_relative_path(
1543-
AssocTag::Type,
1544-
qself_span,
1545-
qself_res,
1546-
assoc_segment.ident,
1547-
)?;
1536+
let (assoc_item, trait_ref) =
1537+
self.conv_type_relative_path(AssocTag::Type, qself_res, assoc_segment.ident)?;
15481538

15491539
let assoc_id = assoc_item.def_id;
15501540
let mut args = trait_ref.args.to_vec();
@@ -2469,7 +2459,7 @@ impl<'genv, 'tcx: 'genv, P: ConvPhase<'genv, 'tcx>> ConvCtxt<P> {
24692459
let qself_res =
24702460
if let Some(path) = qself.as_path() { path.res } else { fhir::Res::Err };
24712461
let (assoc_reft, trait_ref) =
2472-
self.conv_type_relative_path(AssocReftTag, qself.span, qself_res, *name)?;
2462+
self.conv_type_relative_path(AssocReftTag, qself_res, *name)?;
24732463
rty::AliasReft { assoc_id: assoc_reft.def_id, args: trait_ref.args }
24742464
}
24752465
};

crates/flux-infer/src/projections.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,7 @@ impl<'a, 'infcx, 'genv, 'tcx> Normalizer<'a, 'infcx, 'genv, 'tcx> {
201201
// IntoIter<{v. i32[v] | v > 0}, Global> MATCH IntoIter<T, A>
202202
// => {T -> {v. i32[v] | v > 0}, A -> Global}
203203

204-
let impl_trait_ref = self
205-
.genv()
206-
.impl_trait_ref(impl_def_id)?
207-
.unwrap()
208-
.skip_binder();
204+
let impl_trait_ref = self.genv().impl_trait_ref(impl_def_id)?.skip_binder();
209205

210206
let generics = self.tcx().generics_of(impl_def_id);
211207

crates/flux-middle/src/global_env.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -253,17 +253,14 @@ impl<'genv, 'tcx> GlobalEnv<'genv, 'tcx> {
253253
self.inner.queries.check_wf(self, def_id)
254254
}
255255

256-
pub fn impl_trait_ref(
257-
self,
258-
impl_id: DefId,
259-
) -> QueryResult<Option<rty::EarlyBinder<rty::TraitRef>>> {
260-
let Some(trait_ref) = self.tcx().impl_trait_ref(impl_id) else { return Ok(None) };
256+
pub fn impl_trait_ref(self, impl_id: DefId) -> QueryResult<rty::EarlyBinder<rty::TraitRef>> {
257+
let trait_ref = self.tcx().impl_trait_ref(impl_id);
261258
let trait_ref = trait_ref.skip_binder();
262259
let trait_ref = trait_ref
263260
.lower(self.tcx())
264261
.map_err(|err| QueryErr::unsupported(trait_ref.def_id, err.into_err()))?
265262
.refine(&Refiner::default_for_item(self, impl_id)?)?;
266-
Ok(Some(rty::EarlyBinder(trait_ref)))
263+
Ok(rty::EarlyBinder(trait_ref))
267264
}
268265

269266
pub fn generics_of(self, def_id: impl IntoQueryParam<DefId>) -> QueryResult<rty::Generics> {
@@ -323,10 +320,7 @@ impl<'genv, 'tcx> GlobalEnv<'genv, 'tcx> {
323320

324321
// Otherwise, check if the trait has a default body
325322
if let Some(body) = self.default_assoc_refinement_body(trait_assoc_id)? {
326-
let impl_trait_ref = self
327-
.impl_trait_ref(impl_id)?
328-
.unwrap()
329-
.instantiate_identity();
323+
let impl_trait_ref = self.impl_trait_ref(impl_id)?.instantiate_identity();
330324
return Ok(rty::EarlyBinder(body.instantiate(self.tcx(), &impl_trait_ref.args, &[])));
331325
}
332326

crates/flux-refineck/src/checker.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,8 @@ fn find_trait_item(
396396
) -> QueryResult<Option<(rty::TraitRef, DefId)>> {
397397
let tcx = genv.tcx();
398398
let def_id = def_id.to_def_id();
399-
if let Some(impl_id) = tcx.impl_of_assoc(def_id)
400-
&& let Some(impl_trait_ref) = genv.impl_trait_ref(impl_id)?
401-
{
402-
let impl_trait_ref = impl_trait_ref.instantiate_identity();
399+
if let Some(impl_id) = tcx.trait_impl_of_assoc(def_id) {
400+
let impl_trait_ref = genv.impl_trait_ref(impl_id)?.instantiate_identity();
403401
let trait_item_id = tcx.associated_item(def_id).trait_item_def_id().unwrap();
404402
return Ok(Some((impl_trait_ref, trait_item_id)));
405403
}

crates/flux-refineck/src/compare_impl_item.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc_infer::infer::TyCtxtInferExt;
1515
use rustc_middle::ty::TypingMode;
1616

1717
pub fn check_impl_against_trait(genv: GlobalEnv, impl_id: MaybeExternId) -> QueryResult {
18-
let trait_id = genv.tcx().trait_id_of_impl(impl_id.resolved_id()).unwrap();
18+
let trait_id = genv.tcx().impl_trait_id(impl_id.resolved_id());
1919

2020
let impl_assoc_refts = genv.assoc_refinements_of(impl_id)?;
2121
let trait_assoc_refts = genv.assoc_refinements_of(trait_id)?;
@@ -37,7 +37,6 @@ pub fn check_impl_against_trait(genv: GlobalEnv, impl_id: MaybeExternId) -> Quer
3737

3838
let impl_trait_ref = genv
3939
.impl_trait_ref(impl_id.resolved_id())?
40-
.unwrap()
4140
.instantiate_identity();
4241

4342
let rustc_infcx = genv

0 commit comments

Comments
 (0)