Skip to content

Commit f3b7dd6

Browse files
committed
Add AliasKind::Weak for type aliases.
Only use it when the type alias contains an opaque type. Also does wf-checking on such type aliases.
1 parent 4fdd07f commit f3b7dd6

File tree

86 files changed

+474
-199
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+474
-199
lines changed

compiler/rustc_const_eval/src/util/type_name.rs

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> {
6363
| ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs),
6464
ty::Foreign(def_id) => self.print_def_path(def_id, &[]),
6565

66+
ty::Alias(ty::Weak, _) => bug!("type_name: unexpected weak projection"),
6667
ty::Alias(ty::Inherent, _) => bug!("type_name: unexpected inherent projection"),
6768
ty::GeneratorWitness(_) => bug!("type_name: unexpected `GeneratorWitness`"),
6869
ty::GeneratorWitnessMIR(..) => bug!("type_name: unexpected `GeneratorWitnessMIR`"),

compiler/rustc_hir_analysis/src/astconv/mod.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -1458,7 +1458,19 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
14581458
item_segment: &hir::PathSegment<'_>,
14591459
) -> Ty<'tcx> {
14601460
let substs = self.ast_path_substs_for_ty(span, did, item_segment);
1461-
self.tcx().at(span).type_of(did).subst(self.tcx(), substs)
1461+
let ty = self.tcx().at(span).type_of(did);
1462+
1463+
if matches!(self.tcx().def_kind(did), DefKind::TyAlias)
1464+
&& ty.skip_binder().has_opaque_types()
1465+
{
1466+
// Type aliases referring to types that contain opaque types (but aren't just directly
1467+
// referencing a single opaque type) get encoded as a type alias that normalization will
1468+
// then actually instantiate the where bounds of.
1469+
let alias_ty = self.tcx().mk_alias_ty(did, substs);
1470+
self.tcx().mk_alias(ty::Weak, alias_ty)
1471+
} else {
1472+
ty.subst(self.tcx(), substs)
1473+
}
14621474
}
14631475

14641476
fn conv_object_ty_poly_trait_ref(

compiler/rustc_hir_analysis/src/check/wfcheck.rs

+30-10
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,10 @@ fn check_item<'tcx>(tcx: TyCtxt<'tcx>, item: &'tcx hir::Item<'tcx>) {
217217
check_item_fn(tcx, def_id, item.ident, item.span, sig.decl);
218218
}
219219
hir::ItemKind::Static(ty, ..) => {
220-
check_item_type(tcx, def_id, ty.span, false);
220+
check_item_type(tcx, def_id, ty.span, UnsizedHandling::Forbid);
221221
}
222222
hir::ItemKind::Const(ty, ..) => {
223-
check_item_type(tcx, def_id, ty.span, false);
223+
check_item_type(tcx, def_id, ty.span, UnsizedHandling::Forbid);
224224
}
225225
hir::ItemKind::Struct(_, ast_generics) => {
226226
check_type_defn(tcx, item, false);
@@ -242,6 +242,12 @@ fn check_item<'tcx>(tcx: TyCtxt<'tcx>, item: &'tcx hir::Item<'tcx>) {
242242
}
243243
// `ForeignItem`s are handled separately.
244244
hir::ItemKind::ForeignMod { .. } => {}
245+
hir::ItemKind::TyAlias(hir_ty, ..) => {
246+
if tcx.type_of(item.owner_id.def_id).skip_binder().has_opaque_types() {
247+
// Bounds are respected for `type X = impl Trait` and `type X = (impl Trait, Y);`
248+
check_item_type(tcx, def_id, hir_ty.span, UnsizedHandling::Allow);
249+
}
250+
}
245251
_ => {}
246252
}
247253
}
@@ -258,7 +264,9 @@ fn check_foreign_item(tcx: TyCtxt<'_>, item: &hir::ForeignItem<'_>) {
258264
hir::ForeignItemKind::Fn(decl, ..) => {
259265
check_item_fn(tcx, def_id, item.ident, item.span, decl)
260266
}
261-
hir::ForeignItemKind::Static(ty, ..) => check_item_type(tcx, def_id, ty.span, true),
267+
hir::ForeignItemKind::Static(ty, ..) => {
268+
check_item_type(tcx, def_id, ty.span, UnsizedHandling::AllowIfForeignTail)
269+
}
262270
hir::ForeignItemKind::Type => (),
263271
}
264272
}
@@ -1100,20 +1108,32 @@ fn check_item_fn(
11001108
})
11011109
}
11021110

1103-
fn check_item_type(tcx: TyCtxt<'_>, item_id: LocalDefId, ty_span: Span, allow_foreign_ty: bool) {
1111+
enum UnsizedHandling {
1112+
Forbid,
1113+
Allow,
1114+
AllowIfForeignTail,
1115+
}
1116+
1117+
fn check_item_type(
1118+
tcx: TyCtxt<'_>,
1119+
item_id: LocalDefId,
1120+
ty_span: Span,
1121+
unsized_handling: UnsizedHandling,
1122+
) {
11041123
debug!("check_item_type: {:?}", item_id);
11051124

11061125
enter_wf_checking_ctxt(tcx, ty_span, item_id, |wfcx| {
11071126
let ty = tcx.type_of(item_id).subst_identity();
11081127
let item_ty = wfcx.normalize(ty_span, Some(WellFormedLoc::Ty(item_id)), ty);
11091128

1110-
let mut forbid_unsized = true;
1111-
if allow_foreign_ty {
1112-
let tail = tcx.struct_tail_erasing_lifetimes(item_ty, wfcx.param_env);
1113-
if let ty::Foreign(_) = tail.kind() {
1114-
forbid_unsized = false;
1129+
let forbid_unsized = match unsized_handling {
1130+
UnsizedHandling::Forbid => true,
1131+
UnsizedHandling::Allow => false,
1132+
UnsizedHandling::AllowIfForeignTail => {
1133+
let tail = tcx.struct_tail_erasing_lifetimes(item_ty, wfcx.param_env);
1134+
!matches!(tail.kind(), ty::Foreign(_))
11151135
}
1116-
}
1136+
};
11171137

11181138
wfcx.register_wf_obligation(ty_span, Some(WellFormedLoc::Ty(item_id)), item_ty.into());
11191139
if forbid_unsized {

compiler/rustc_hir_analysis/src/coherence/orphan.rs

+3
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,9 @@ fn do_orphan_check_impl<'tcx>(
208208
// }
209209
// impl<T: ?Sized> AutoTrait for <T as Id>::This {}
210210
AliasKind::Projection => "associated type",
211+
// type Foo = (impl Sized, bool)
212+
// impl AutoTrait for Foo {}
213+
AliasKind::Weak => "type alias",
211214
// type Opaque = impl Trait;
212215
// impl AutoTrait for Opaque {}
213216
AliasKind::Opaque => "opaque type",

compiler/rustc_hir_analysis/src/collect/item_bounds.rs

+1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ pub(super) fn explicit_item_bounds(
122122
};
123123
opaque_type_bounds(tcx, def_id, bounds, item_ty, *span)
124124
}
125+
hir::Node::Item(hir::Item { kind: hir::ItemKind::TyAlias(..), .. }) => &[],
125126
_ => bug!("item_bounds called on {:?}", def_id),
126127
};
127128
ty::EarlyBinder::bind(bounds)

compiler/rustc_hir_analysis/src/hir_wf_check.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ fn diagnostic_hir_wf_check<'tcx>(
128128
ref item => bug!("Unexpected TraitItem {:?}", item),
129129
},
130130
hir::Node::Item(item) => match item.kind {
131-
hir::ItemKind::Static(ty, _, _) | hir::ItemKind::Const(ty, _) => vec![ty],
131+
hir::ItemKind::TyAlias(ty, _)
132+
| hir::ItemKind::Static(ty, _, _)
133+
| hir::ItemKind::Const(ty, _) => vec![ty],
132134
hir::ItemKind::Impl(impl_) => match &impl_.of_trait {
133135
Some(t) => t
134136
.path

compiler/rustc_infer/src/infer/error_reporting/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2375,6 +2375,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
23752375
ty::AliasKind::Projection | ty::AliasKind::Inherent => {
23762376
format!("the associated type `{}`", p)
23772377
}
2378+
ty::AliasKind::Weak => format!("the type alias `{}`", p),
23782379
ty::AliasKind::Opaque => format!("the opaque type `{}`", p),
23792380
},
23802381
};

compiler/rustc_lint/src/builtin.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1465,8 +1465,8 @@ impl<'tcx> LateLintPass<'tcx> for TypeAliasBounds {
14651465
let hir::ItemKind::TyAlias(ty, type_alias_generics) = &item.kind else {
14661466
return
14671467
};
1468-
if let hir::TyKind::OpaqueDef(..) = ty.kind {
1469-
// Bounds are respected for `type X = impl Trait`
1468+
if cx.tcx.type_of(item.owner_id.def_id).skip_binder().has_opaque_types() {
1469+
// Bounds are respected for `type X = impl Trait` and `type X = (impl Trait, Y);`
14701470
return;
14711471
}
14721472
if cx.tcx.type_of(item.owner_id).skip_binder().has_inherent_projections() {

compiler/rustc_lint/src/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
12551255
}
12561256

12571257
ty::Param(..)
1258-
| ty::Alias(ty::Projection | ty::Inherent, ..)
1258+
| ty::Alias(ty::Projection | ty::Inherent | ty::Weak, ..)
12591259
| ty::Infer(..)
12601260
| ty::Bound(..)
12611261
| ty::Error(_)

compiler/rustc_middle/src/query/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,16 @@ rustc_queries! {
19031903
desc { "normalizing `{}`", goal.value.value }
19041904
}
19051905

1906+
/// Do not call this query directly: invoke `normalize` instead.
1907+
query normalize_weak_ty(
1908+
goal: CanonicalProjectionGoal<'tcx>
1909+
) -> Result<
1910+
&'tcx Canonical<'tcx, canonical::QueryResponse<'tcx, NormalizationResult<'tcx>>>,
1911+
NoSolution,
1912+
> {
1913+
desc { "normalizing `{}`", goal.value.value }
1914+
}
1915+
19061916
/// Do not call this query directly: invoke `normalize` instead.
19071917
query normalize_inherent_projection_ty(
19081918
goal: CanonicalProjectionGoal<'tcx>

compiler/rustc_middle/src/traits/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,9 @@ pub enum ObligationCauseCode<'tcx> {
448448

449449
/// Requirement for a `const N: Ty` to implement `Ty: ConstParamTy`
450450
ConstParam(Ty<'tcx>),
451+
452+
/// Obligations emitted during the normalization of a weak type alias.
453+
TypeAlias(InternedObligationCauseCode<'tcx>, Span, DefId),
451454
}
452455

453456
/// The 'location' at which we try to perform HIR-based wf checking.

compiler/rustc_middle/src/ty/context.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,7 @@ impl<'tcx> TyCtxt<'tcx> {
20122012
(ty::Opaque, DefKind::OpaqueTy)
20132013
| (ty::Projection | ty::Inherent, DefKind::AssocTy)
20142014
| (ty::Opaque | ty::Projection, DefKind::ImplTraitPlaceholder)
2015+
| (ty::Weak, DefKind::TyAlias)
20152016
);
20162017
self.mk_ty_from_kind(Alias(kind, alias_ty))
20172018
}

compiler/rustc_middle/src/ty/error.rs

+1
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ impl<'tcx> Ty<'tcx> {
300300
ty::Placeholder(..) => "higher-ranked type".into(),
301301
ty::Bound(..) => "bound type variable".into(),
302302
ty::Alias(ty::Projection | ty::Inherent, _) => "associated type".into(),
303+
ty::Alias(ty::Weak, _) => "type alias".into(),
303304
ty::Param(_) => "type parameter".into(),
304305
ty::Alias(ty::Opaque, ..) => "opaque type".into(),
305306
}

compiler/rustc_middle/src/ty/flags.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl FlagComputation {
178178

179179
&ty::Alias(kind, data) => {
180180
self.add_flags(match kind {
181-
ty::Projection => TypeFlags::HAS_TY_PROJECTION,
181+
ty::Weak | ty::Projection => TypeFlags::HAS_TY_PROJECTION,
182182
ty::Inherent => TypeFlags::HAS_TY_INHERENT,
183183
ty::Opaque => TypeFlags::HAS_TY_OPAQUE,
184184
});

compiler/rustc_middle/src/ty/print/pretty.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ pub trait PrettyPrinter<'tcx>:
731731
ty::Foreign(def_id) => {
732732
p!(print_def_path(def_id, &[]));
733733
}
734-
ty::Alias(ty::Projection | ty::Inherent, ref data) => {
734+
ty::Alias(ty::Projection | ty::Inherent | ty::Weak, ref data) => {
735735
if !(self.should_print_verbose() || NO_QUERIES.with(|q| q.get()))
736736
&& self.tcx().is_impl_trait_in_trait(data.def_id)
737737
{

compiler/rustc_middle/src/ty/relate.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -391,13 +391,13 @@ impl<'tcx> Relate<'tcx> for Ty<'tcx> {
391391
/// Relates `a` and `b` structurally, calling the relation for all nested values.
392392
/// Any semantic equality, e.g. of projections, and inference variables have to be
393393
/// handled by the caller.
394+
#[instrument(level = "trace", skip(relation), ret)]
394395
pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
395396
relation: &mut R,
396397
a: Ty<'tcx>,
397398
b: Ty<'tcx>,
398399
) -> RelateResult<'tcx, Ty<'tcx>> {
399400
let tcx = relation.tcx();
400-
debug!("structurally_relate_tys: a={:?} b={:?}", a, b);
401401
match (a.kind(), b.kind()) {
402402
(&ty::Infer(_), _) | (_, &ty::Infer(_)) => {
403403
// The caller should handle these cases!

compiler/rustc_middle/src/ty/sty.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1231,6 +1231,7 @@ impl<'tcx> AliasTy<'tcx> {
12311231
DefKind::AssocTy if let DefKind::Impl { of_trait: false } = tcx.def_kind(tcx.parent(self.def_id)) => ty::Inherent,
12321232
DefKind::AssocTy | DefKind::ImplTraitPlaceholder => ty::Projection,
12331233
DefKind::OpaqueTy => ty::Opaque,
1234+
DefKind::TyAlias => ty::Weak,
12341235
kind => bug!("unexpected DefKind in AliasTy: {kind:?}"),
12351236
}
12361237
}

compiler/rustc_privacy/src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ where
242242
}
243243
}
244244
}
245+
ty::Alias(ty::Weak, alias) => {
246+
self.def_id_visitor.visit_def_id(alias.def_id, "type alias", &ty);
247+
}
245248
ty::Alias(ty::Projection, proj) => {
246249
if self.def_id_visitor.skip_assoc_tys() {
247250
// Visitors searching for minimal visibility/reachability want to

compiler/rustc_symbol_mangling/src/v0.rs

+1
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> {
483483
}
484484

485485
ty::Alias(ty::Inherent, _) => bug!("symbol_names: unexpected inherent projection"),
486+
ty::Alias(ty::Weak, _) => bug!("symbol_names: unexpected weak projection"),
486487
ty::GeneratorWitness(_) => bug!("symbol_names: unexpected `GeneratorWitness`"),
487488
ty::GeneratorWitnessMIR(..) => bug!("symbol_names: unexpected `GeneratorWitnessMIR`"),
488489
}

compiler/rustc_trait_selection/src/solve/assembly/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -508,10 +508,11 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
508508
| ty::Placeholder(..)
509509
| ty::Infer(ty::IntVar(_) | ty::FloatVar(_))
510510
| ty::Alias(ty::Inherent, _)
511+
| ty::Alias(ty::Weak, _)
511512
| ty::Error(_) => return,
512513
ty::Infer(ty::TyVar(_) | ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_))
513514
| ty::Bound(..) => bug!("unexpected self type for `{goal:?}`"),
514-
// Excluding IATs here as they don't have meaningful item bounds.
515+
// Excluding IATs and type aliases here as they don't have meaningful item bounds.
515516
ty::Alias(ty::Projection | ty::Opaque, alias_ty) => alias_ty,
516517
};
517518

compiler/rustc_trait_selection/src/solve/assembly/structural_traits.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub(in crate::solve) fn instantiate_constituent_tys_for_auto_trait<'tcx>(
3333
ty::Dynamic(..)
3434
| ty::Param(..)
3535
| ty::Foreign(..)
36-
| ty::Alias(ty::Projection | ty::Inherent, ..)
36+
| ty::Alias(ty::Projection | ty::Inherent | ty::Weak, ..)
3737
| ty::Placeholder(..)
3838
| ty::Bound(..)
3939
| ty::Infer(_) => {

compiler/rustc_trait_selection/src/solve/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ mod opaques;
2929
mod project_goals;
3030
mod search_graph;
3131
mod trait_goals;
32+
mod weak_types;
3233

3334
pub use eval_ctxt::{EvalCtxt, InferCtxtEvalExt};
3435
pub use fulfill::FulfillmentCtxt;

compiler/rustc_trait_selection/src/solve/project_goals.rs

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
5757
}
5858
DefKind::AnonConst => self.normalize_anon_const(goal),
5959
DefKind::OpaqueTy => self.normalize_opaque_type(goal),
60+
DefKind::TyAlias => self.normalize_weak_type(goal),
6061
kind => bug!("unknown DefKind {} in projection goal: {goal:#?}", kind.descr(def_id)),
6162
}
6263
}

compiler/rustc_trait_selection/src/solve/trait_goals.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
618618
ty::Dynamic(..)
619619
| ty::Param(..)
620620
| ty::Foreign(..)
621-
| ty::Alias(ty::Projection | ty::Inherent, ..)
621+
| ty::Alias(ty::Projection | ty::Weak | ty::Inherent, ..)
622622
| ty::Placeholder(..) => Some(Err(NoSolution)),
623623

624624
ty::Infer(_) | ty::Bound(_, _) => bug!("unexpected type `{self_ty}`"),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use rustc_middle::traits::solve::{Certainty, Goal, QueryResult};
2+
use rustc_middle::ty;
3+
4+
use super::EvalCtxt;
5+
6+
impl<'tcx> EvalCtxt<'_, 'tcx> {
7+
pub(super) fn normalize_weak_type(
8+
&mut self,
9+
goal: Goal<'tcx, ty::ProjectionPredicate<'tcx>>,
10+
) -> QueryResult<'tcx> {
11+
let tcx = self.tcx();
12+
let weak_ty = goal.predicate.projection_ty;
13+
let expected = goal.predicate.term.ty().expect("no such thing as a const alias");
14+
15+
let actual = tcx.type_of(weak_ty.def_id).subst(tcx, weak_ty.substs);
16+
self.eq(goal.param_env, expected, actual)?;
17+
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
18+
}
19+
}

compiler/rustc_trait_selection/src/traits/coherence.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,9 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for OrphanChecker<'tcx> {
695695
| ty::RawPtr(..)
696696
| ty::Never
697697
| ty::Tuple(..)
698-
| ty::Alias(ty::Projection | ty::Inherent, ..) => self.found_non_local_ty(ty),
698+
| ty::Alias(ty::Projection | ty::Inherent | ty::Weak, ..) => {
699+
self.found_non_local_ty(ty)
700+
}
699701

700702
ty::Param(..) => self.found_param_ty(ty),
701703

compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -1824,12 +1824,13 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
18241824
ty::Alias(ty::Projection, ..) => Some(12),
18251825
ty::Alias(ty::Inherent, ..) => Some(13),
18261826
ty::Alias(ty::Opaque, ..) => Some(14),
1827-
ty::Never => Some(15),
1828-
ty::Adt(..) => Some(16),
1829-
ty::Generator(..) => Some(17),
1830-
ty::Foreign(..) => Some(18),
1831-
ty::GeneratorWitness(..) => Some(19),
1832-
ty::GeneratorWitnessMIR(..) => Some(20),
1827+
ty::Alias(ty::Weak, ..) => Some(15),
1828+
ty::Never => Some(16),
1829+
ty::Adt(..) => Some(17),
1830+
ty::Generator(..) => Some(18),
1831+
ty::Foreign(..) => Some(19),
1832+
ty::GeneratorWitness(..) => Some(20),
1833+
ty::GeneratorWitnessMIR(..) => Some(21),
18331834
ty::Placeholder(..) | ty::Bound(..) | ty::Infer(..) | ty::Error(_) => None,
18341835
}
18351836
}

compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs

+23
Original file line numberDiff line numberDiff line change
@@ -3198,6 +3198,29 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
31983198
)
31993199
});
32003200
}
3201+
ObligationCauseCode::TypeAlias(ref nested, span, def_id) => {
3202+
// #74711: avoid a stack overflow
3203+
ensure_sufficient_stack(|| {
3204+
self.note_obligation_cause_code(
3205+
body_id,
3206+
err,
3207+
predicate,
3208+
param_env,
3209+
nested,
3210+
obligated_types,
3211+
seen_requirements,
3212+
)
3213+
});
3214+
let mut multispan = MultiSpan::from(span);
3215+
multispan.push_span_label(span, "required by this bound");
3216+
err.span_note(
3217+
multispan,
3218+
format!(
3219+
"required by a bound on the type alias `{}`",
3220+
self.infcx.tcx.item_name(def_id)
3221+
),
3222+
);
3223+
}
32013224
ObligationCauseCode::FunctionArgumentObligation {
32023225
arg_hir_id,
32033226
call_hir_id,

0 commit comments

Comments
 (0)