Skip to content

Commit b520bba

Browse files
committed
polymorphize: remove predicate logic
This commit removes all logic which marks parameters as used based on their presence in predicates - given rust-lang#75675, this will enable more polymorphization and avoid the symbol clashes that predicate logic previously sidestepped. Signed-off-by: David Wood <david@davidtw.co>
1 parent 234099d commit b520bba

File tree

3 files changed

+43
-45
lines changed

3 files changed

+43
-45
lines changed

compiler/rustc_mir/src/monomorphize/polymorphize.rs

-44
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
7474
vis.visit_body(body);
7575
debug!("unused_generic_params: (after visitor) unused_parameters={:?}", unused_parameters);
7676

77-
mark_used_by_predicates(tcx, def_id, &mut unused_parameters);
78-
debug!("unused_generic_params: (end) unused_parameters={:?}", unused_parameters);
79-
8077
// Emit errors for debugging and testing if enabled.
8178
if !unused_parameters.is_empty() {
8279
emit_unused_generic_params_error(tcx, def_id, generics, &unused_parameters);
@@ -113,47 +110,6 @@ fn mark_used_by_default_parameters<'tcx>(
113110
}
114111
}
115112

116-
/// Search the predicates on used generic parameters for any unused generic parameters, and mark
117-
/// those as used.
118-
fn mark_used_by_predicates<'tcx>(
119-
tcx: TyCtxt<'tcx>,
120-
def_id: DefId,
121-
unused_parameters: &mut FiniteBitSet<u32>,
122-
) {
123-
let def_id = tcx.closure_base_def_id(def_id);
124-
let predicates = tcx.explicit_predicates_of(def_id);
125-
debug!("mark_used_by_predicates: predicates_of={:?}", predicates);
126-
127-
let mut current_unused_parameters = FiniteBitSet::new_empty();
128-
// Run to a fixed point to support `where T: Trait<U>, U: Trait<V>`, starting with an empty
129-
// bit set so that this is skipped if all parameters are already used.
130-
while current_unused_parameters != *unused_parameters {
131-
debug!(
132-
"mark_used_by_predicates: current_unused_parameters={:?} = unused_parameters={:?}",
133-
current_unused_parameters, unused_parameters
134-
);
135-
current_unused_parameters = *unused_parameters;
136-
137-
for (predicate, _) in predicates.predicates {
138-
// Consider all generic params in a predicate as used if any other parameter in the
139-
// predicate is used.
140-
let any_param_used = {
141-
let mut vis = HasUsedGenericParams { unused_parameters };
142-
predicate.visit_with(&mut vis).is_break()
143-
};
144-
145-
if any_param_used {
146-
let mut vis = MarkUsedGenericParams { tcx, def_id, unused_parameters };
147-
predicate.visit_with(&mut vis);
148-
}
149-
}
150-
}
151-
152-
if let Some(parent) = predicates.parent {
153-
mark_used_by_predicates(tcx, parent, unused_parameters);
154-
}
155-
}
156-
157113
/// Emit errors for the function annotated by `#[rustc_polymorphize_error]`, labelling each generic
158114
/// parameter which was unused.
159115
fn emit_unused_generic_params_error<'tcx>(

src/test/ui/polymorphization/predicates.rs

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ fn bar<I>() {
1212

1313
#[rustc_polymorphize_error]
1414
fn foo<I, T>(_: I)
15+
//~^ ERROR item has unused generic parameters
1516
where
1617
I: Iterator<Item = T>,
1718
{
@@ -20,6 +21,7 @@ where
2021

2122
#[rustc_polymorphize_error]
2223
fn baz<I, T>(_: I)
24+
//~^ ERROR item has unused generic parameters
2325
where
2426
std::iter::Repeat<I>: Iterator<Item = T>,
2527
{
@@ -40,6 +42,7 @@ where
4042
#[rustc_polymorphize_error]
4143
fn next(&mut self) -> Option<Self::Item> {
4244
self.find(|_| true)
45+
//~^ ERROR item has unused generic parameters
4346
}
4447
}
4548

@@ -53,6 +56,7 @@ impl Baz<u32> for u16 {}
5356

5457
#[rustc_polymorphize_error]
5558
fn quux<A, B, C: Default>() -> usize
59+
//~^ ERROR item has unused generic parameters
5660
where
5761
A: Baz<B>,
5862
B: Baz<C>,
@@ -69,6 +73,7 @@ impl Foobar<u32, u32> for () {}
6973

7074
#[rustc_polymorphize_error]
7175
fn foobar<F, G>() -> usize
76+
//~^ ERROR item has unused generic parameters
7277
where
7378
(): Foobar<F, G>,
7479
{
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,45 @@
1+
error: item has unused generic parameters
2+
--> $DIR/predicates.rs:14:4
3+
|
4+
LL | fn foo<I, T>(_: I)
5+
| ^^^ - generic parameter `T` is unused
6+
7+
error: item has unused generic parameters
8+
--> $DIR/predicates.rs:23:4
9+
|
10+
LL | fn baz<I, T>(_: I)
11+
| ^^^ - generic parameter `T` is unused
12+
13+
error: item has unused generic parameters
14+
--> $DIR/predicates.rs:44:19
15+
|
16+
LL | impl<'a, I, T: 'a, E> Iterator for Foo<'a, I, E>
17+
| - - generic parameter `E` is unused
18+
| |
19+
| generic parameter `I` is unused
20+
...
21+
LL | self.find(|_| true)
22+
| ^^^^^^^^
23+
24+
error: item has unused generic parameters
25+
--> $DIR/predicates.rs:58:4
26+
|
27+
LL | fn quux<A, B, C: Default>() -> usize
28+
| ^^^^ - - generic parameter `B` is unused
29+
| |
30+
| generic parameter `A` is unused
31+
32+
error: item has unused generic parameters
33+
--> $DIR/predicates.rs:75:4
34+
|
35+
LL | fn foobar<F, G>() -> usize
36+
| ^^^^^^ - generic parameter `F` is unused
37+
138
error: item has unused generic parameters
239
--> $DIR/predicates.rs:9:4
340
|
441
LL | fn bar<I>() {
542
| ^^^ - generic parameter `I` is unused
643

7-
error: aborting due to previous error
44+
error: aborting due to 6 previous errors
845

0 commit comments

Comments
 (0)