From 90e941a974e3561efa18c148de24db1f401cd3c4 Mon Sep 17 00:00:00 2001 From: David Wood Date: Wed, 22 Jul 2020 10:31:12 +0100 Subject: [PATCH 1/3] mir: improve polymorphic constant bug This commit changes the span and content of the "collection encountered polymorphic constant" bug in monomorphization collection to point to the use of the constant rather than the definition. Signed-off-by: David Wood --- src/librustc_mir/monomorphize/collector.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 0b5f27fc17a72..e724180f4d833 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -627,8 +627,9 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { Ok(val) => collect_const_value(self.tcx, val, self.output), Err(ErrorHandled::Reported(ErrorReported) | ErrorHandled::Linted) => {} Err(ErrorHandled::TooGeneric) => span_bug!( - self.tcx.def_span(def.did), - "collection encountered polymorphic constant", + self.body.source_info(location).span, + "collection encountered polymorphic constant: {}", + substituted_constant ), } } From f39ed207fe25a39fba59d120efcdb56e30d19183 Mon Sep 17 00:00:00 2001 From: David Wood Date: Wed, 22 Jul 2020 15:03:56 +0100 Subject: [PATCH 2/3] sess: disable polymorphisation This commit disables polymorphisation to resolve regressions related to closures which inherit unused generic parameters and are then used in casts or reflection. Signed-off-by: David Wood --- src/librustc_session/options.rs | 2 +- .../item-collection/static-init.rs | 2 +- .../trait-method-default-impl.rs | 2 +- .../polymorphization/unused_type_parameters.rs | 2 +- .../const_parameters/closures.rs | 1 + .../const_parameters/closures.stderr | 10 +++++----- .../const_parameters/functions.rs | 1 + .../const_parameters/functions.stderr | 4 ++-- .../ui/polymorphization/drop_shims/simple.rs | 1 + .../polymorphization/drop_shims/transitive.rs | 1 + src/test/ui/polymorphization/generators.rs | 1 + src/test/ui/polymorphization/generators.stderr | 10 +++++----- src/test/ui/polymorphization/lifetimes.rs | 1 + src/test/ui/polymorphization/lifetimes.stderr | 4 ++-- .../polymorphization/normalized_sig_types.rs | 1 + src/test/ui/polymorphization/predicates.rs | 1 + src/test/ui/polymorphization/predicates.stderr | 2 +- .../type_parameters/closures.rs | 1 + .../type_parameters/closures.stderr | 18 +++++++++--------- .../type_parameters/functions.rs | 1 + .../type_parameters/functions.stderr | 8 ++++---- src/test/ui/polymorphization/unsized_cast.rs | 1 + .../ui/polymorphization/unsized_cast.stderr | 6 +++--- 23 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs index 6b2097240e215..73696ed35e286 100644 --- a/src/librustc_session/options.rs +++ b/src/librustc_session/options.rs @@ -949,7 +949,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, (default: PLT is disabled if full relro is enabled)"), polonius: bool = (false, parse_bool, [UNTRACKED], "enable polonius-based borrow-checker (default: no)"), - polymorphize: bool = (true, parse_bool, [TRACKED], + polymorphize: bool = (false, parse_bool, [TRACKED], "perform polymorphization analysis"), pre_link_arg: (/* redirected to pre_link_args */) = ((), parse_string_push, [UNTRACKED], "a single extra argument to prepend the linker invocation (can be used several times)"), diff --git a/src/test/codegen-units/item-collection/static-init.rs b/src/test/codegen-units/item-collection/static-init.rs index aebccff01fc69..9d79171c4cb98 100644 --- a/src/test/codegen-units/item-collection/static-init.rs +++ b/src/test/codegen-units/item-collection/static-init.rs @@ -1,4 +1,4 @@ -// compile-flags:-Zprint-mono-items=eager +// compile-flags:-Zprint-mono-items=eager -Zpolymorphize=on #![feature(start)] diff --git a/src/test/codegen-units/item-collection/trait-method-default-impl.rs b/src/test/codegen-units/item-collection/trait-method-default-impl.rs index abe2d108eae7d..6cf59fdc39694 100644 --- a/src/test/codegen-units/item-collection/trait-method-default-impl.rs +++ b/src/test/codegen-units/item-collection/trait-method-default-impl.rs @@ -1,4 +1,4 @@ -// compile-flags:-Zprint-mono-items=eager +// compile-flags:-Zprint-mono-items=eager -Zpolymorphize=on #![deny(dead_code)] #![feature(start)] diff --git a/src/test/codegen-units/polymorphization/unused_type_parameters.rs b/src/test/codegen-units/polymorphization/unused_type_parameters.rs index dc2ad0559b34f..403f68bb170bb 100644 --- a/src/test/codegen-units/polymorphization/unused_type_parameters.rs +++ b/src/test/codegen-units/polymorphization/unused_type_parameters.rs @@ -1,4 +1,4 @@ -// compile-flags:-Zprint-mono-items=lazy -Copt-level=1 +// compile-flags:-Zpolymorphize=on -Zprint-mono-items=lazy -Copt-level=1 // ignore-tidy-linelength #![crate_type = "rlib"] diff --git a/src/test/ui/polymorphization/const_parameters/closures.rs b/src/test/ui/polymorphization/const_parameters/closures.rs index 7bbcaebea0125..f20605e1b9a61 100644 --- a/src/test/ui/polymorphization/const_parameters/closures.rs +++ b/src/test/ui/polymorphization/const_parameters/closures.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(const_generics, rustc_attrs)] //~^ WARN the feature `const_generics` is incomplete diff --git a/src/test/ui/polymorphization/const_parameters/closures.stderr b/src/test/ui/polymorphization/const_parameters/closures.stderr index eb872eac74c91..266b6e62afd0b 100644 --- a/src/test/ui/polymorphization/const_parameters/closures.stderr +++ b/src/test/ui/polymorphization/const_parameters/closures.stderr @@ -1,5 +1,5 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/closures.rs:2:12 + --> $DIR/closures.rs:3:12 | LL | #![feature(const_generics, rustc_attrs)] | ^^^^^^^^^^^^^^ @@ -8,7 +8,7 @@ LL | #![feature(const_generics, rustc_attrs)] = note: see issue #44580 for more information error: item has unused generic parameters - --> $DIR/closures.rs:18:19 + --> $DIR/closures.rs:19:19 | LL | pub fn unused() -> usize { | - generic parameter `T` is unused @@ -17,13 +17,13 @@ LL | let add_one = |x: usize| x + 1; | ^^^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:16:8 + --> $DIR/closures.rs:17:8 | LL | pub fn unused() -> usize { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/closures.rs:27:19 + --> $DIR/closures.rs:28:19 | LL | pub fn used_parent() -> usize { | - generic parameter `T` is unused @@ -32,7 +32,7 @@ LL | let add_one = |x: usize| x + 1; | ^^^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:47:13 + --> $DIR/closures.rs:48:13 | LL | pub fn unused_upvar() -> usize { | - generic parameter `T` is unused diff --git a/src/test/ui/polymorphization/const_parameters/functions.rs b/src/test/ui/polymorphization/const_parameters/functions.rs index 77539b94e489a..04c279de29e6a 100644 --- a/src/test/ui/polymorphization/const_parameters/functions.rs +++ b/src/test/ui/polymorphization/const_parameters/functions.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(const_generics, rustc_attrs)] //~^ WARN the feature `const_generics` is incomplete diff --git a/src/test/ui/polymorphization/const_parameters/functions.stderr b/src/test/ui/polymorphization/const_parameters/functions.stderr index c99a9b788ebc5..e379e32c1fceb 100644 --- a/src/test/ui/polymorphization/const_parameters/functions.stderr +++ b/src/test/ui/polymorphization/const_parameters/functions.stderr @@ -1,5 +1,5 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/functions.rs:2:12 + --> $DIR/functions.rs:3:12 | LL | #![feature(const_generics, rustc_attrs)] | ^^^^^^^^^^^^^^ @@ -8,7 +8,7 @@ LL | #![feature(const_generics, rustc_attrs)] = note: see issue #44580 for more information error: item has unused generic parameters - --> $DIR/functions.rs:14:8 + --> $DIR/functions.rs:15:8 | LL | pub fn unused() { | ^^^^^^ - generic parameter `T` is unused diff --git a/src/test/ui/polymorphization/drop_shims/simple.rs b/src/test/ui/polymorphization/drop_shims/simple.rs index ce56b7a358861..2695dc6d4f177 100644 --- a/src/test/ui/polymorphization/drop_shims/simple.rs +++ b/src/test/ui/polymorphization/drop_shims/simple.rs @@ -1,4 +1,5 @@ // check-pass +// compile-flags:-Zpolymorphize=on pub struct OnDrop(pub F); diff --git a/src/test/ui/polymorphization/drop_shims/transitive.rs b/src/test/ui/polymorphization/drop_shims/transitive.rs index b7ea07b6bc653..c22891171091a 100644 --- a/src/test/ui/polymorphization/drop_shims/transitive.rs +++ b/src/test/ui/polymorphization/drop_shims/transitive.rs @@ -1,4 +1,5 @@ // check-pass +// compile-flags:-Zpolymorphize=on pub struct OnDrop(pub F); diff --git a/src/test/ui/polymorphization/generators.rs b/src/test/ui/polymorphization/generators.rs index 1acba7c8bf14c..9eb34fb73490b 100644 --- a/src/test/ui/polymorphization/generators.rs +++ b/src/test/ui/polymorphization/generators.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(const_generics, generators, generator_trait, rustc_attrs)] //~^ WARN the feature `const_generics` is incomplete diff --git a/src/test/ui/polymorphization/generators.stderr b/src/test/ui/polymorphization/generators.stderr index b3e5a2de0270a..c59055ba9d654 100644 --- a/src/test/ui/polymorphization/generators.stderr +++ b/src/test/ui/polymorphization/generators.stderr @@ -1,5 +1,5 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/generators.rs:2:12 + --> $DIR/generators.rs:3:12 | LL | #![feature(const_generics, generators, generator_trait, rustc_attrs)] | ^^^^^^^^^^^^^^ @@ -8,7 +8,7 @@ LL | #![feature(const_generics, generators, generator_trait, rustc_attrs)] = note: see issue #44580 for more information error: item has unused generic parameters - --> $DIR/generators.rs:35:5 + --> $DIR/generators.rs:36:5 | LL | pub fn unused_type() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { | - generic parameter `T` is unused @@ -21,13 +21,13 @@ LL | | } | |_____^ error: item has unused generic parameters - --> $DIR/generators.rs:33:8 + --> $DIR/generators.rs:34:8 | LL | pub fn unused_type() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { | ^^^^^^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/generators.rs:61:5 + --> $DIR/generators.rs:62:5 | LL | pub fn unused_const() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { | - generic parameter `T` is unused @@ -40,7 +40,7 @@ LL | | } | |_____^ error: item has unused generic parameters - --> $DIR/generators.rs:59:8 + --> $DIR/generators.rs:60:8 | LL | pub fn unused_const() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { | ^^^^^^^^^^^^ - generic parameter `T` is unused diff --git a/src/test/ui/polymorphization/lifetimes.rs b/src/test/ui/polymorphization/lifetimes.rs index 4bde349a336ea..f26df45230a5c 100644 --- a/src/test/ui/polymorphization/lifetimes.rs +++ b/src/test/ui/polymorphization/lifetimes.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(rustc_attrs)] // This test checks that the polymorphization analysis doesn't break when the diff --git a/src/test/ui/polymorphization/lifetimes.stderr b/src/test/ui/polymorphization/lifetimes.stderr index 6c85e4f291611..2020256717c4d 100644 --- a/src/test/ui/polymorphization/lifetimes.stderr +++ b/src/test/ui/polymorphization/lifetimes.stderr @@ -1,11 +1,11 @@ error: item has unused generic parameters - --> $DIR/lifetimes.rs:9:8 + --> $DIR/lifetimes.rs:10:8 | LL | pub fn unused<'a, T>(_: &'a u32) { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/lifetimes.rs:16:19 + --> $DIR/lifetimes.rs:17:19 | LL | pub fn used<'a, T: Default>(_: &'a u32) -> u32 { | - generic parameter `T` is unused diff --git a/src/test/ui/polymorphization/normalized_sig_types.rs b/src/test/ui/polymorphization/normalized_sig_types.rs index fa76b7201e8c3..d732b1071d8a9 100644 --- a/src/test/ui/polymorphization/normalized_sig_types.rs +++ b/src/test/ui/polymorphization/normalized_sig_types.rs @@ -1,4 +1,5 @@ // build-pass +// compile-flags:-Zpolymorphize=on pub trait ParallelIterator: Sized { fn drive>(_: C) { diff --git a/src/test/ui/polymorphization/predicates.rs b/src/test/ui/polymorphization/predicates.rs index 390ac983aa007..82a94933b470e 100644 --- a/src/test/ui/polymorphization/predicates.rs +++ b/src/test/ui/polymorphization/predicates.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(rustc_attrs)] // This test checks that `T` is considered used in `foo`, because it is used in a predicate for diff --git a/src/test/ui/polymorphization/predicates.stderr b/src/test/ui/polymorphization/predicates.stderr index 1b266083463a2..c23730fc995e7 100644 --- a/src/test/ui/polymorphization/predicates.stderr +++ b/src/test/ui/polymorphization/predicates.stderr @@ -1,5 +1,5 @@ error: item has unused generic parameters - --> $DIR/predicates.rs:8:4 + --> $DIR/predicates.rs:9:4 | LL | fn bar() { | ^^^ - generic parameter `I` is unused diff --git a/src/test/ui/polymorphization/type_parameters/closures.rs b/src/test/ui/polymorphization/type_parameters/closures.rs index 1fbe13380b5b9..07ab1355a47cf 100644 --- a/src/test/ui/polymorphization/type_parameters/closures.rs +++ b/src/test/ui/polymorphization/type_parameters/closures.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(stmt_expr_attributes, rustc_attrs)] // This test checks that the polymorphization analysis correctly detects unused type diff --git a/src/test/ui/polymorphization/type_parameters/closures.stderr b/src/test/ui/polymorphization/type_parameters/closures.stderr index d68e6e25a1eb9..417feebbc5557 100644 --- a/src/test/ui/polymorphization/type_parameters/closures.stderr +++ b/src/test/ui/polymorphization/type_parameters/closures.stderr @@ -1,5 +1,5 @@ error: item has unused generic parameters - --> $DIR/closures.rs:18:19 + --> $DIR/closures.rs:19:19 | LL | pub fn unused() -> u32 { | - generic parameter `T` is unused @@ -8,13 +8,13 @@ LL | let add_one = |x: u32| x + 1; | ^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:15:8 + --> $DIR/closures.rs:16:8 | LL | pub fn unused() -> u32 { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/closures.rs:27:19 + --> $DIR/closures.rs:28:19 | LL | pub fn used_parent() -> u32 { | - generic parameter `T` is unused @@ -23,7 +23,7 @@ LL | let add_one = |x: u32| x + 1; | ^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:93:23 + --> $DIR/closures.rs:94:23 | LL | impl Foo { | - generic parameter `F` is unused @@ -35,7 +35,7 @@ LL | let add_one = |x: u32| x + 1; | ^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:91:12 + --> $DIR/closures.rs:92:12 | LL | impl Foo { | - generic parameter `F` is unused @@ -44,7 +44,7 @@ LL | pub fn unused_all() -> u32 { | ^^^^^^^^^^ - generic parameter `G` is unused error: item has unused generic parameters - --> $DIR/closures.rs:127:23 + --> $DIR/closures.rs:128:23 | LL | pub fn used_impl() -> u32 { | - generic parameter `G` is unused @@ -58,13 +58,13 @@ LL | | }; | |_________^ error: item has unused generic parameters - --> $DIR/closures.rs:125:12 + --> $DIR/closures.rs:126:12 | LL | pub fn used_impl() -> u32 { | ^^^^^^^^^ - generic parameter `G` is unused error: item has unused generic parameters - --> $DIR/closures.rs:114:23 + --> $DIR/closures.rs:115:23 | LL | impl Foo { | - generic parameter `F` is unused @@ -78,7 +78,7 @@ LL | | }; | |_________^ error: item has unused generic parameters - --> $DIR/closures.rs:112:12 + --> $DIR/closures.rs:113:12 | LL | impl Foo { | - generic parameter `F` is unused diff --git a/src/test/ui/polymorphization/type_parameters/functions.rs b/src/test/ui/polymorphization/type_parameters/functions.rs index 38f10148c2c52..aad957e1dd362 100644 --- a/src/test/ui/polymorphization/type_parameters/functions.rs +++ b/src/test/ui/polymorphization/type_parameters/functions.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(rustc_attrs)] // This test checks that the polymorphization analysis correctly detects unused type diff --git a/src/test/ui/polymorphization/type_parameters/functions.stderr b/src/test/ui/polymorphization/type_parameters/functions.stderr index be4c6576e9645..d629ff7bb4d3a 100644 --- a/src/test/ui/polymorphization/type_parameters/functions.stderr +++ b/src/test/ui/polymorphization/type_parameters/functions.stderr @@ -1,11 +1,11 @@ error: item has unused generic parameters - --> $DIR/functions.rs:13:8 + --> $DIR/functions.rs:14:8 | LL | pub fn unused() { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/functions.rs:44:12 + --> $DIR/functions.rs:45:12 | LL | impl Foo { | - generic parameter `F` is unused @@ -14,7 +14,7 @@ LL | pub fn unused_impl() { | ^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/functions.rs:50:12 + --> $DIR/functions.rs:51:12 | LL | impl Foo { | - generic parameter `F` is unused @@ -23,7 +23,7 @@ LL | pub fn unused_both() { | ^^^^^^^^^^^ - generic parameter `G` is unused error: item has unused generic parameters - --> $DIR/functions.rs:62:12 + --> $DIR/functions.rs:63:12 | LL | impl Foo { | - generic parameter `F` is unused diff --git a/src/test/ui/polymorphization/unsized_cast.rs b/src/test/ui/polymorphization/unsized_cast.rs index d2f3d4f13cdcc..b8facc1607010 100644 --- a/src/test/ui/polymorphization/unsized_cast.rs +++ b/src/test/ui/polymorphization/unsized_cast.rs @@ -1,4 +1,5 @@ // build-fail +// compile-flags:-Zpolymorphize=on #![feature(fn_traits, rustc_attrs, unboxed_closures)] // This test checks that the polymorphization analysis considers a closure diff --git a/src/test/ui/polymorphization/unsized_cast.stderr b/src/test/ui/polymorphization/unsized_cast.stderr index b8b96bbdf15a6..d4727acca9afd 100644 --- a/src/test/ui/polymorphization/unsized_cast.stderr +++ b/src/test/ui/polymorphization/unsized_cast.stderr @@ -1,5 +1,5 @@ error: item has unused generic parameters - --> $DIR/unsized_cast.rs:10:18 + --> $DIR/unsized_cast.rs:11:18 | LL | fn foo() { | - generic parameter `T` is unused @@ -8,7 +8,7 @@ LL | (|| Box::new(|| {}) as Box)(); | ^^^^^ error: item has unused generic parameters - --> $DIR/unsized_cast.rs:10:5 + --> $DIR/unsized_cast.rs:11:5 | LL | fn foo() { | - generic parameter `T` is unused @@ -17,7 +17,7 @@ LL | (|| Box::new(|| {}) as Box)(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/unsized_cast.rs:20:15 + --> $DIR/unsized_cast.rs:21:15 | LL | fn foo2() { | - generic parameter `T` is unused From 799d52eff7e96fc339327966b056ab89c061b255 Mon Sep 17 00:00:00 2001 From: David Wood Date: Wed, 22 Jul 2020 15:35:52 +0100 Subject: [PATCH 3/3] tests: add regression test for #74614 This commit adds a regression test for #74614 so that it is fixed before polymorphisation is re-enabled. Signed-off-by: David Wood --- src/test/ui/issues/issue-74614.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/ui/issues/issue-74614.rs diff --git a/src/test/ui/issues/issue-74614.rs b/src/test/ui/issues/issue-74614.rs new file mode 100644 index 0000000000000..f5e8deb29fbc8 --- /dev/null +++ b/src/test/ui/issues/issue-74614.rs @@ -0,0 +1,17 @@ +// build-pass + +fn test() { + std::mem::size_of::(); +} + +pub fn foo(_: T) -> &'static fn() { + &(test:: as fn()) +} + +fn outer() { + foo(|| ()); +} + +fn main() { + outer::(); +}