Rollup merge of #87373 - Aaron1011:hir-wf-field, r=estebank
Extend HIR WF checking to fields r? ``@estebank``
This commit is contained in:
commit
1e33d13d39
6 changed files with 15 additions and 13 deletions
|
@ -523,8 +523,7 @@ fn check_type_defn<'tcx, F>(
|
|||
fcx.register_wf_obligation(
|
||||
field.ty.into(),
|
||||
field.span,
|
||||
// We don't have an HIR id for the field
|
||||
ObligationCauseCode::WellFormed(None),
|
||||
ObligationCauseCode::WellFormed(Some(WellFormedLoc::Ty(field.def_id))),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -1467,6 +1466,7 @@ struct AdtVariant<'tcx> {
|
|||
|
||||
struct AdtField<'tcx> {
|
||||
ty: Ty<'tcx>,
|
||||
def_id: LocalDefId,
|
||||
span: Span,
|
||||
}
|
||||
|
||||
|
@ -1477,11 +1477,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
.fields()
|
||||
.iter()
|
||||
.map(|field| {
|
||||
let field_ty = self.tcx.type_of(self.tcx.hir().local_def_id(field.hir_id));
|
||||
let def_id = self.tcx.hir().local_def_id(field.hir_id);
|
||||
let field_ty = self.tcx.type_of(def_id);
|
||||
let field_ty = self.normalize_associated_types_in(field.ty.span, field_ty);
|
||||
let field_ty = self.resolve_vars_if_possible(field_ty);
|
||||
debug!("non_enum_variant: type of field {:?} is {:?}", field, field_ty);
|
||||
AdtField { ty: field_ty, span: field.ty.span }
|
||||
AdtField { ty: field_ty, span: field.ty.span, def_id }
|
||||
})
|
||||
.collect();
|
||||
AdtVariant { fields, explicit_discr: None }
|
||||
|
|
|
@ -25,7 +25,7 @@ fn diagnostic_hir_wf_check<'tcx>(
|
|||
WellFormedLoc::Ty(def_id) => def_id,
|
||||
WellFormedLoc::Param { function, param_idx: _ } => function,
|
||||
};
|
||||
let hir_id = HirId::make_owner(def_id);
|
||||
let hir_id = hir.local_def_id_to_hir_id(def_id);
|
||||
|
||||
// HIR wfcheck should only ever happen as part of improving an existing error
|
||||
tcx.sess
|
||||
|
@ -140,6 +140,7 @@ fn diagnostic_hir_wf_check<'tcx>(
|
|||
}
|
||||
ref item => bug!("Unexpected item {:?}", item),
|
||||
},
|
||||
hir::Node::Field(field) => Some(field.ty),
|
||||
ref node => bug!("Unexpected node {:?}", node),
|
||||
},
|
||||
WellFormedLoc::Param { function: _, param_idx } => {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
error[E0038]: the trait `Qiz` cannot be made into an object
|
||||
--> $DIR/issue-19380.rs:11:9
|
||||
--> $DIR/issue-19380.rs:11:29
|
||||
|
|
||||
LL | foos: &'static [&'static (dyn Qiz + 'static)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Qiz` cannot be made into an object
|
||||
| ^^^^^^^^^^^^^^^^^ `Qiz` cannot be made into an object
|
||||
|
|
||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||
--> $DIR/issue-19380.rs:2:6
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||
--> $DIR/wf-in-fn-type-arg.rs:9:8
|
||||
--> $DIR/wf-in-fn-type-arg.rs:9:11
|
||||
|
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ---- required by this bound in `MustBeCopy`
|
||||
...
|
||||
LL | x: fn(MustBeCopy<T>)
|
||||
| ^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||
|
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||
--> $DIR/wf-in-fn-type-ret.rs:9:8
|
||||
--> $DIR/wf-in-fn-type-ret.rs:9:16
|
||||
|
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ---- required by this bound in `MustBeCopy`
|
||||
...
|
||||
LL | x: fn() -> MustBeCopy<T>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||
|
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||
--> $DIR/wf-in-obj-type-trait.rs:11:8
|
||||
--> $DIR/wf-in-obj-type-trait.rs:11:19
|
||||
|
|
||||
LL | struct MustBeCopy<T:Copy> {
|
||||
| ---- required by this bound in `MustBeCopy`
|
||||
...
|
||||
LL | x: dyn Object<MustBeCopy<T>>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||
|
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
|
|
Loading…
Add table
Reference in a new issue