From a907b7c51929eccd5af8774c60ac412772f2cacd Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Mon, 8 Jul 2019 18:13:30 +1000 Subject: [PATCH 1/3] Normalize type parameters in create_mono_items_for_default_impls. Fixes http://github.com/rust-lang/rust/issues/58375 --- src/librustc_mir/monomorphize/collector.rs | 7 +++++- .../issue-58375-monomorphize-default-impls.rs | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/issue-58375-monomorphize-default-impls.rs diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 6e9390f77508b..acf438dc66bff 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -1166,8 +1166,13 @@ fn create_mono_items_for_default_impls<'tcx>( } }); + let param_env = ty::ParamEnv::reveal_all(); + let substs = tcx.normalize_erasing_regions( + param_env, + substs, + ); let instance = ty::Instance::resolve(tcx, - ty::ParamEnv::reveal_all(), + param_env, method.def_id, substs).unwrap(); diff --git a/src/test/run-pass/issue-58375-monomorphize-default-impls.rs b/src/test/run-pass/issue-58375-monomorphize-default-impls.rs new file mode 100644 index 0000000000000..e4ae72927a4ed --- /dev/null +++ b/src/test/run-pass/issue-58375-monomorphize-default-impls.rs @@ -0,0 +1,23 @@ +// Make sure that the mono-item collector does not crash when trying to +// instantiate a default impl for DecodeUtf16<::Item> +// See https://github.com/rust-lang/rust/issues/58375 +// compile-flags:-C link-dead-code + +#![crate_type = "rlib"] + +pub struct DecodeUtf16(I); + +pub trait Arbitrary { + fn arbitrary() {} +} + +pub trait A { + type Item; +} + +impl A for u8 { + type Item = char; +} + +impl Arbitrary for DecodeUtf16<::Item> { +} \ No newline at end of file From acfe99a98efc57133f9596a3df937ed886e83fbe Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Mon, 15 Jul 2019 14:27:08 +1000 Subject: [PATCH 2/3] Add missing trailing newline --- src/test/run-pass/issue-58375-monomorphize-default-impls.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/run-pass/issue-58375-monomorphize-default-impls.rs b/src/test/run-pass/issue-58375-monomorphize-default-impls.rs index e4ae72927a4ed..6730217626f3e 100644 --- a/src/test/run-pass/issue-58375-monomorphize-default-impls.rs +++ b/src/test/run-pass/issue-58375-monomorphize-default-impls.rs @@ -20,4 +20,4 @@ impl A for u8 { } impl Arbitrary for DecodeUtf16<::Item> { -} \ No newline at end of file +} From 745c76d657ebbe29265100e5381f8bf326c54567 Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Tue, 16 Jul 2019 09:47:08 +1000 Subject: [PATCH 3/3] Normalize the trait_ref --- src/librustc_mir/monomorphize/collector.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index acf438dc66bff..ee0f9119544bf 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -1143,6 +1143,11 @@ fn create_mono_items_for_default_impls<'tcx>( def_id_to_string(tcx, impl_def_id)); if let Some(trait_ref) = tcx.impl_trait_ref(impl_def_id) { + let param_env = ty::ParamEnv::reveal_all(); + let trait_ref = tcx.normalize_erasing_regions( + param_env, + trait_ref, + ); let overridden_methods: FxHashSet<_> = impl_item_refs.iter() .map(|iiref| iiref.ident.modern()) @@ -1165,12 +1170,6 @@ fn create_mono_items_for_default_impls<'tcx>( } } }); - - let param_env = ty::ParamEnv::reveal_all(); - let substs = tcx.normalize_erasing_regions( - param_env, - substs, - ); let instance = ty::Instance::resolve(tcx, param_env, method.def_id,