Rollup merge of #87373 - Aaron1011:hir-wf-field, r=estebank

Extend HIR WF checking to fields

r? ``@estebank``
This commit is contained in:
Yuki Okushi 2021-07-23 19:27:48 +09:00 committed by GitHub
commit 1e33d13d39
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 15 additions and 13 deletions

View file

@ -523,8 +523,7 @@ fn check_type_defn<'tcx, F>(
fcx.register_wf_obligation( fcx.register_wf_obligation(
field.ty.into(), field.ty.into(),
field.span, field.span,
// We don't have an HIR id for the field ObligationCauseCode::WellFormed(Some(WellFormedLoc::Ty(field.def_id))),
ObligationCauseCode::WellFormed(None),
) )
} }
@ -1467,6 +1466,7 @@ struct AdtVariant<'tcx> {
struct AdtField<'tcx> { struct AdtField<'tcx> {
ty: Ty<'tcx>, ty: Ty<'tcx>,
def_id: LocalDefId,
span: Span, span: Span,
} }
@ -1477,11 +1477,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
.fields() .fields()
.iter() .iter()
.map(|field| { .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.normalize_associated_types_in(field.ty.span, field_ty);
let field_ty = self.resolve_vars_if_possible(field_ty); let field_ty = self.resolve_vars_if_possible(field_ty);
debug!("non_enum_variant: type of field {:?} is {:?}", field, 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(); .collect();
AdtVariant { fields, explicit_discr: None } AdtVariant { fields, explicit_discr: None }

View file

@ -25,7 +25,7 @@ fn diagnostic_hir_wf_check<'tcx>(
WellFormedLoc::Ty(def_id) => def_id, WellFormedLoc::Ty(def_id) => def_id,
WellFormedLoc::Param { function, param_idx: _ } => function, 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 // HIR wfcheck should only ever happen as part of improving an existing error
tcx.sess tcx.sess
@ -140,6 +140,7 @@ fn diagnostic_hir_wf_check<'tcx>(
} }
ref item => bug!("Unexpected item {:?}", item), ref item => bug!("Unexpected item {:?}", item),
}, },
hir::Node::Field(field) => Some(field.ty),
ref node => bug!("Unexpected node {:?}", node), ref node => bug!("Unexpected node {:?}", node),
}, },
WellFormedLoc::Param { function: _, param_idx } => { WellFormedLoc::Param { function: _, param_idx } => {

View file

@ -1,8 +1,8 @@
error[E0038]: the trait `Qiz` cannot be made into an object 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)] 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> 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 --> $DIR/issue-19380.rs:2:6

View file

@ -1,11 +1,11 @@
error[E0277]: the trait bound `T: Copy` is not satisfied 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> { LL | struct MustBeCopy<T:Copy> {
| ---- required by this bound in `MustBeCopy` | ---- required by this bound in `MustBeCopy`
... ...
LL | x: fn(MustBeCopy<T>) 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` help: consider restricting type parameter `T`
| |

View file

@ -1,11 +1,11 @@
error[E0277]: the trait bound `T: Copy` is not satisfied 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> { LL | struct MustBeCopy<T:Copy> {
| ---- required by this bound in `MustBeCopy` | ---- required by this bound in `MustBeCopy`
... ...
LL | x: fn() -> MustBeCopy<T> 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` help: consider restricting type parameter `T`
| |

View file

@ -1,11 +1,11 @@
error[E0277]: the trait bound `T: Copy` is not satisfied 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> { LL | struct MustBeCopy<T:Copy> {
| ---- required by this bound in `MustBeCopy` | ---- required by this bound in `MustBeCopy`
... ...
LL | x: dyn Object<MustBeCopy<T>> 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` help: consider restricting type parameter `T`
| |