Skip to content

Commit

Permalink
polymorphize: visit promoted MIR
Browse files Browse the repository at this point in the history
This commit makes polymorphization visited the MIR of unevaluated
constants with available promoted MIR instead of visiting the
substitutions of that constant - which will mark all of the generic
parameters as used.

Signed-off-by: David Wood <david@davidtw.co>
  • Loading branch information
davidtwco committed Aug 7, 2020
1 parent 1e0e618 commit 659d44a
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 2 deletions.
7 changes: 7 additions & 0 deletions src/librustc_mir/monomorphize/polymorphize.rs
Expand Up @@ -245,6 +245,13 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for UsedGenericParametersVisitor<'a, 'tcx> {
self.unused_parameters.clear(param.index);
false
}
ty::ConstKind::Unevaluated(_, _, Some(p)) => {
// If there is a promoted, don't look at the substs - since it will always contain
// the generic parameters, instead, traverse the promoted MIR.
let promoted = self.tcx.promoted_mir(self.def_id);
self.visit_body(&promoted[p]);
false
}
_ => c.super_visit_with(self),
}
}
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/polymorphization/promoted-function-1.rs
@@ -0,0 +1,12 @@
// build-fail
// compile-flags: -Zpolymorphize=on
#![crate_type = "lib"]
#![feature(rustc_attrs)]

fn foo<'a>(_: &'a ()) {}

#[rustc_polymorphize_error]
pub fn test<T>() {
//~^ ERROR item has unused generic parameters
foo(&());
}
8 changes: 8 additions & 0 deletions src/test/ui/polymorphization/promoted-function-1.stderr
@@ -0,0 +1,8 @@
error: item has unused generic parameters
--> $DIR/promoted-function-1.rs:9:8
|
LL | pub fn test<T>() {
| ^^^^ - generic parameter `T` is unused

error: aborting due to previous error

2 changes: 2 additions & 0 deletions src/test/ui/polymorphization/promoted-function.rs
@@ -1,4 +1,6 @@
// run-pass
// compile-flags:-Zpolymorphize=on

fn fop<T>() {}

fn bar<T>() -> &'static fn() {
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/polymorphization/unsized_cast.rs
Expand Up @@ -17,6 +17,7 @@ fn foo<T: Default>() {
fn foo2<T: Default>() {
let _: T = Default::default();
(|| {
//~^ ERROR item has unused generic parameters
let call: extern "rust-call" fn(_, _) = Fn::call;
call(&|| {}, ());
//~^ ERROR item has unused generic parameters
Expand Down
18 changes: 16 additions & 2 deletions src/test/ui/polymorphization/unsized_cast.stderr
Expand Up @@ -17,13 +17,27 @@ LL | (|| Box::new(|| {}) as Box<dyn Fn()>)();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: item has unused generic parameters
--> $DIR/unsized_cast.rs:21:15
--> $DIR/unsized_cast.rs:22:15
|
LL | fn foo2<T: Default>() {
| - generic parameter `T` is unused
...
LL | call(&|| {}, ());
| ^^^^^

error: aborting due to 3 previous errors
error: item has unused generic parameters
--> $DIR/unsized_cast.rs:19:5
|
LL | fn foo2<T: Default>() {
| - generic parameter `T` is unused
LL | let _: T = Default::default();
LL | / (|| {
LL | |
LL | | let call: extern "rust-call" fn(_, _) = Fn::call;
LL | | call(&|| {}, ());
LL | |
LL | | })();
| |______^

error: aborting due to 4 previous errors

0 comments on commit 659d44a

Please sign in to comment.