diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 4aca01d9411..56fafacd722 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -934,12 +934,10 @@ impl<'a, 'gcx, 'tcx> Generics { } pub fn requires_monomorphization(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> bool { - for param in &self.params { - match param.kind { - GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => return true, - GenericParamDefKind::Lifetime => {} - } + if self.own_requires_monomorphization() { + return true; } + if let Some(parent_def_id) = self.parent { let parent = tcx.generics_of(parent_def_id); parent.requires_monomorphization(tcx) @@ -948,6 +946,16 @@ impl<'a, 'gcx, 'tcx> Generics { } } + pub fn own_requires_monomorphization(&self) -> bool { + for param in &self.params { + match param.kind { + GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => return true, + GenericParamDefKind::Lifetime => {} + } + } + false + } + pub fn region_param(&'tcx self, param: &EarlyBoundRegion, tcx: TyCtxt<'a, 'gcx, 'tcx>) diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index af875c2f9e8..1815c53aa12 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -1135,8 +1135,7 @@ fn create_mono_items_for_default_impls<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, continue; } - let counts = tcx.generics_of(method.def_id).own_counts(); - if counts.types + counts.consts != 0 { + if tcx.generics_of(method.def_id).own_requires_monomorphization() { continue; } diff --git a/src/librustc_mir/transform/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs index 93f3afe1aea..c9cccb2b03a 100644 --- a/src/librustc_mir/transform/check_unsafety.rs +++ b/src/librustc_mir/transform/check_unsafety.rs @@ -560,8 +560,7 @@ fn unsafe_derive_on_repr_packed<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: D // FIXME: when we make this a hard error, this should have its // own error code. - let counts = tcx.generics_of(def_id).own_counts(); - let message = if counts.types + counts.consts != 0 { + let message = if tcx.generics_of(def_id).own_requires_monomorphization() { "#[derive] can't be used on a #[repr(packed)] struct with \ type or const parameters (error E0133)".to_string() } else {