Auto merge of #120019 - lcnr:fn-wf, r=BoxyUwU · rust-lang/rust@6bf600b (original) (raw)
`@@ -63,13 +63,16 @@ fn relate_mir_and_user_ty<'tcx>(
`
63
63
`user_ty: Ty<'tcx>,
`
64
64
`) -> Result<(), NoSolution> {
`
65
65
`let cause = ObligationCause::dummy_with_span(span);
`
``
66
`+
ocx.register_obligation(Obligation::new(
`
``
67
`+
ocx.infcx.tcx,
`
``
68
`+
cause.clone(),
`
``
69
`+
param_env,
`
``
70
`+
ty::ClauseKind::WellFormed(user_ty.into()),
`
``
71
`+
));
`
``
72
+
66
73
`let user_ty = ocx.normalize(&cause, param_env, user_ty);
`
67
74
` ocx.eq(&cause, param_env, mir_ty, user_ty)?;
`
68
75
``
69
``
`-
// FIXME(#104764): We should check well-formedness before normalization.
`
70
``
`-
let predicate =
`
71
``
`-
ty::Binder::dummy(ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(user_ty.into())));
`
72
``
`-
ocx.register_obligation(Obligation::new(ocx.infcx.tcx, cause, param_env, predicate));
`
73
76
`Ok(())
`
74
77
`}
`
75
78
``
`@@ -113,31 +116,38 @@ fn relate_mir_and_user_args<'tcx>(
`
113
116
` ocx.register_obligation(Obligation::new(tcx, cause, param_env, instantiated_predicate));
`
114
117
`}
`
115
118
``
``
119
`` +
// Now prove the well-formedness of def_id
with substs
.
``
``
120
`` +
// Note for some items, proving the WF of ty
is not sufficient because the
``
``
121
`+
// well-formedness of an item may depend on the WF of gneneric args not present in the
`
``
122
`+
// item's type. Currently this is true for associated consts, e.g.:
`
``
123
// ```rust
``
124
`+
// impl MyTy {
`
``
125
`+
// const CONST: () = { /* arbitrary code that depends on T being WF */ };
`
``
126
`+
// }
`
``
127
// ```
``
128
`+
for arg in args {
`
``
129
`+
ocx.register_obligation(Obligation::new(
`
``
130
`+
tcx,
`
``
131
`+
cause.clone(),
`
``
132
`+
param_env,
`
``
133
`+
ty::ClauseKind::WellFormed(arg),
`
``
134
`+
));
`
``
135
`+
}
`
``
136
+
116
137
`if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
`
``
138
`+
ocx.register_obligation(Obligation::new(
`
``
139
`+
tcx,
`
``
140
`+
cause.clone(),
`
``
141
`+
param_env,
`
``
142
`+
ty::ClauseKind::WellFormed(self_ty.into()),
`
``
143
`+
));
`
``
144
+
117
145
`let self_ty = ocx.normalize(&cause, param_env, self_ty);
`
118
146
`let impl_self_ty = tcx.type_of(impl_def_id).instantiate(tcx, args);
`
119
147
`let impl_self_ty = ocx.normalize(&cause, param_env, impl_self_ty);
`
120
148
``
121
149
` ocx.eq(&cause, param_env, self_ty, impl_self_ty)?;
`
122
``
`-
let predicate = ty::Binder::dummy(ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(
`
123
``
`-
impl_self_ty.into(),
`
124
``
`-
)));
`
125
``
`-
ocx.register_obligation(Obligation::new(tcx, cause.clone(), param_env, predicate));
`
126
150
`}
`
127
151
``
128
``
`-
// In addition to proving the predicates, we have to
`
129
``
`` -
// prove that ty
is well-formed -- this is because
``
130
``
`` -
// the WF of ty
is predicated on the args being
``
131
``
`-
// well-formed, and we haven't proven that. We don't
`
132
``
`` -
// want to prove the WF of types from args
directly because they
``
133
``
`-
// haven't been normalized.
`
134
``
`-
//
`
135
``
`-
// FIXME(nmatsakis): Well, perhaps we should normalize
`
136
``
`-
// them? This would only be relevant if some input
`
137
``
`` -
// type were ill-formed but did not appear in ty
,
``
138
``
`-
// which...could happen with normalization...
`
139
``
`-
let predicate =
`
140
``
`-
ty::Binder::dummy(ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(ty.into())));
`
141
``
`-
ocx.register_obligation(Obligation::new(tcx, cause, param_env, predicate));
`
142
152
`Ok(())
`
143
153
`}
`