diff options
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_ast_passes/src/ast_validation.rs | 12 | ||||
| -rw-r--r-- | compiler/rustc_passes/src/reachable.rs | 33 | ||||
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/misc.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/coherence/builtin.rs | 6 |
4 files changed, 25 insertions, 30 deletions
diff --git a/compiler/rustc_ast_passes/src/ast_validation.rs b/compiler/rustc_ast_passes/src/ast_validation.rs index 0520c9ac60c..21db7d0eebc 100644 --- a/compiler/rustc_ast_passes/src/ast_validation.rs +++ b/compiler/rustc_ast_passes/src/ast_validation.rs @@ -420,7 +420,15 @@ impl<'a> AstValidator<'a> { .iter() .flat_map(|i| i.attrs.as_ref()) .filter(|attr| { - let arr = [sym::allow, sym::cfg, sym::cfg_attr, sym::deny, sym::forbid, sym::warn]; + let arr = [ + sym::allow, + sym::cfg, + sym::cfg_attr, + sym::deny, + sym::expect, + sym::forbid, + sym::warn, + ]; !arr.contains(&attr.name_or_empty()) && rustc_attr::is_builtin_attr(attr) }) .for_each(|attr| { @@ -435,7 +443,7 @@ impl<'a> AstValidator<'a> { } else { self.err_handler().span_err( attr.span, - "allow, cfg, cfg_attr, deny, \ + "allow, cfg, cfg_attr, deny, expect, \ forbid, and warn are the only allowed built-in attributes in function parameters", ); } diff --git a/compiler/rustc_passes/src/reachable.rs b/compiler/rustc_passes/src/reachable.rs index 0ded6a421f5..75376cdc592 100644 --- a/compiler/rustc_passes/src/reachable.rs +++ b/compiler/rustc_passes/src/reachable.rs @@ -148,32 +148,15 @@ impl<'tcx> ReachableContext<'tcx> { hir::TraitItemKind::Fn(_, hir::TraitFn::Required(_)) | hir::TraitItemKind::Type(..) => false, }, - Some(Node::ImplItem(impl_item)) => { - match impl_item.kind { - hir::ImplItemKind::Const(..) => true, - hir::ImplItemKind::Fn(..) => { - let attrs = self.tcx.codegen_fn_attrs(def_id); - let generics = self.tcx.generics_of(def_id); - if generics.requires_monomorphization(self.tcx) || attrs.requests_inline() { - true - } else { - let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); - let impl_did = self.tcx.hir().get_parent_item(hir_id); - // Check the impl. If the generics on the self - // type of the impl require inlining, this method - // does too. - match self.tcx.hir().expect_item(impl_did).kind { - hir::ItemKind::Impl { .. } => { - let generics = self.tcx.generics_of(impl_did); - generics.requires_monomorphization(self.tcx) - } - _ => false, - } - } - } - hir::ImplItemKind::TyAlias(_) => false, + Some(Node::ImplItem(impl_item)) => match impl_item.kind { + hir::ImplItemKind::Const(..) => true, + hir::ImplItemKind::Fn(..) => { + let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); + let impl_did = self.tcx.hir().get_parent_item(hir_id); + method_might_be_inlined(self.tcx, impl_item, impl_did) } - } + hir::ImplItemKind::TyAlias(_) => false, + }, Some(_) => false, None => false, // This will happen for default methods. } diff --git a/compiler/rustc_trait_selection/src/traits/misc.rs b/compiler/rustc_trait_selection/src/traits/misc.rs index b83b0bf1ca5..f04f527ccb7 100644 --- a/compiler/rustc_trait_selection/src/traits/misc.rs +++ b/compiler/rustc_trait_selection/src/traits/misc.rs @@ -20,7 +20,7 @@ pub fn can_type_implement_copy<'tcx>( tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>, self_type: Ty<'tcx>, - cause: ObligationCause<'tcx>, + parent_cause: ObligationCause<'tcx>, ) -> Result<(), CopyImplementationError<'tcx>> { // FIXME: (@jroesch) float this code up tcx.infer_ctxt().enter(|infcx| { @@ -59,7 +59,7 @@ pub fn can_type_implement_copy<'tcx>( .ty(tcx, traits::InternalSubsts::identity_for_item(tcx, adt.did())) .has_param_types_or_consts() { - cause.clone() + parent_cause.clone() } else { ObligationCause::dummy_with_span(span) }; diff --git a/compiler/rustc_typeck/src/coherence/builtin.rs b/compiler/rustc_typeck/src/coherence/builtin.rs index c809b8bdd73..9f4e6a46d73 100644 --- a/compiler/rustc_typeck/src/coherence/builtin.rs +++ b/compiler/rustc_typeck/src/coherence/builtin.rs @@ -107,6 +107,10 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) { for (field, ty) in fields { let field_span = tcx.def_span(field.did); + let field_ty_span = match tcx.hir().get_if_local(field.did) { + Some(hir::Node::Field(field_def)) => field_def.ty.span, + _ => field_span, + }; err.span_label(field_span, "this field does not implement `Copy`"); // Spin up a new FulfillmentContext, so we can get the _precise_ reason // why this field does not implement Copy. This is useful because sometimes @@ -119,7 +123,7 @@ fn visit_implementation_of_copy(tcx: TyCtxt<'_>, impl_did: LocalDefId) { param_env, ty, tcx.lang_items().copy_trait().unwrap(), - traits::ObligationCause::dummy_with_span(field_span), + traits::ObligationCause::dummy_with_span(field_ty_span), ); for error in fulfill_cx.select_all_or_error(&infcx) { let error_predicate = error.obligation.predicate; |
