Skip to content

Commit b1f8bd6

Browse files
committed
mir: use attribute over -Z polymorphize-errors
This commit replaces the `-Z polymorphize-errors` debugging flag with a `#[rustc_polymorphize_error]` attribute for use on functions. Signed-off-by: David Wood <[email protected]>
1 parent 5ce29d3 commit b1f8bd6

21 files changed

+125
-76
lines changed

src/librustc_feature/builtin_attrs.rs

+1
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
568568
),
569569
rustc_attr!(TEST, rustc_synthetic, AssumedUsed, template!(Word)),
570570
rustc_attr!(TEST, rustc_symbol_name, AssumedUsed, template!(Word)),
571+
rustc_attr!(TEST, rustc_polymorphize_error, AssumedUsed, template!(Word)),
571572
rustc_attr!(TEST, rustc_def_path, AssumedUsed, template!(Word)),
572573
rustc_attr!(TEST, rustc_mir, AssumedUsed, template!(List: "arg1, arg2, ...")),
573574
rustc_attr!(TEST, rustc_dump_program_clauses, AssumedUsed, template!(Word)),

src/librustc_mir/monomorphize/polymorphize.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use rustc_middle::ty::{
1616
query::Providers,
1717
Const, Ty, TyCtxt,
1818
};
19+
use rustc_span::symbol::sym;
1920
use std::convert::TryInto;
2021

2122
/// Provide implementations of queries relating to polymorphization analysis.
@@ -77,7 +78,7 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> u64 {
7778

7879
// Emit errors for debugging and testing if enabled.
7980
let is_full = unused_parameters == 0;
80-
if tcx.sess.opts.debugging_opts.polymorphize_errors && !is_full {
81+
if !is_full {
8182
emit_unused_generic_params_error(tcx, def_id, generics, unused_parameters);
8283
}
8384

@@ -169,16 +170,17 @@ fn mark_used_by_predicates<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, used_paramete
169170
}
170171
}
171172

172-
/// Emit an error for the function represented by `def_id`, labelling each generic parameter which
173-
/// was unused.
173+
/// Emit errors for the function annotated by `#[rustc_polymorphize_error]`, labelling each generic
174+
/// parameter which was unused.
174175
fn emit_unused_generic_params_error<'tcx>(
175176
tcx: TyCtxt<'tcx>,
176177
def_id: DefId,
177178
generics: &'tcx ty::Generics,
178179
unused_parameters: u64,
179180
) {
180181
debug!("emit_unused_generic_params_error: def_id={:?}", def_id);
181-
if !def_id.is_local() {
182+
let base_def_id = tcx.closure_base_def_id(def_id);
183+
if !tcx.get_attrs(base_def_id).iter().any(|a| a.check_name(sym::rustc_polymorphize_error)) {
182184
return;
183185
}
184186

src/librustc_session/options.rs

-2
Original file line numberDiff line numberDiff line change
@@ -951,8 +951,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
951951
"enable polonius-based borrow-checker (default: no)"),
952952
polymorphize: bool = (true, parse_bool, [TRACKED],
953953
"perform polymorphization analysis"),
954-
polymorphize_errors: bool = (false, parse_bool, [TRACKED],
955-
"emit errors from polymorphization analysis for debugging"),
956954
pre_link_arg: (/* redirected to pre_link_args */) = ((), parse_string_push, [UNTRACKED],
957955
"a single extra argument to prepend the linker invocation (can be used several times)"),
958956
pre_link_args: Vec<String> = (Vec::new(), parse_list, [UNTRACKED],

src/librustc_span/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,7 @@ symbols! {
921921
rustc_peek_liveness,
922922
rustc_peek_maybe_init,
923923
rustc_peek_maybe_uninit,
924+
rustc_polymorphize_error,
924925
rustc_private,
925926
rustc_proc_macro_decls,
926927
rustc_promotable,

src/test/ui/polymorphization/const_parameters/closures.rs

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
11
// build-fail
2-
// compile-flags: -Zpolymorphize-errors
3-
#![feature(const_generics)]
2+
#![feature(const_generics, rustc_attrs)]
43
//~^ WARN the feature `const_generics` is incomplete
54

65
// This test checks that the polymorphization analysis correctly detects unused const
76
// parameters in closures.
87

98
// Function doesn't have any generic parameters to be unused.
9+
#[rustc_polymorphize_error]
1010
pub fn no_parameters() {
1111
let _ = || {};
1212
}
1313

1414
// Function has an unused generic parameter in parent and closure.
15+
#[rustc_polymorphize_error]
1516
pub fn unused<const T: usize>() -> usize {
16-
//~^ ERROR item has unused generic parameters
17+
//~^ ERROR item has unused generic parameters
1718
let add_one = |x: usize| x + 1;
18-
//~^ ERROR item has unused generic parameters
19+
//~^ ERROR item has unused generic parameters
1920
add_one(3)
2021
}
2122

2223
// Function has an unused generic parameter in closure, but not in parent.
24+
#[rustc_polymorphize_error]
2325
pub fn used_parent<const T: usize>() -> usize {
2426
let x: usize = T;
2527
let add_one = |x: usize| x + 1;
26-
//~^ ERROR item has unused generic parameters
28+
//~^ ERROR item has unused generic parameters
2729
x + add_one(3)
2830
}
2931

3032
// Function uses generic parameter in value of a binding in closure.
33+
#[rustc_polymorphize_error]
3134
pub fn used_binding<const T: usize>() -> usize {
3235
let x = || {
3336
let y: usize = T;
@@ -38,14 +41,16 @@ pub fn used_binding<const T: usize>() -> usize {
3841
}
3942

4043
// Closure uses a value as an upvar, which used the generic parameter.
44+
#[rustc_polymorphize_error]
4145
pub fn unused_upvar<const T: usize>() -> usize {
4246
let x: usize = T;
4347
let y = || x;
44-
//~^ ERROR item has unused generic parameters
48+
//~^ ERROR item has unused generic parameters
4549
y()
4650
}
4751

4852
// Closure uses generic parameter in substitutions to another function.
53+
#[rustc_polymorphize_error]
4954
pub fn used_substs<const T: usize>() -> usize {
5055
let x = || unused::<T>();
5156
x()

src/test/ui/polymorphization/const_parameters/closures.stderr

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes
2-
--> $DIR/closures.rs:3:12
2+
--> $DIR/closures.rs:2:12
33
|
4-
LL | #![feature(const_generics)]
4+
LL | #![feature(const_generics, rustc_attrs)]
55
| ^^^^^^^^^^^^^^
66
|
77
= note: `#[warn(incomplete_features)]` on by default
88
= note: see issue #44580 <https://github.com/rust-lang/rust/issues/44580> for more information
99

1010
error: item has unused generic parameters
11-
--> $DIR/closures.rs:17:19
11+
--> $DIR/closures.rs:18:19
1212
|
1313
LL | pub fn unused<const T: usize>() -> usize {
1414
| - generic parameter `T` is unused
@@ -17,13 +17,13 @@ LL | let add_one = |x: usize| x + 1;
1717
| ^^^^^^^^^^^^^^^^
1818

1919
error: item has unused generic parameters
20-
--> $DIR/closures.rs:15:8
20+
--> $DIR/closures.rs:16:8
2121
|
2222
LL | pub fn unused<const T: usize>() -> usize {
2323
| ^^^^^^ - generic parameter `T` is unused
2424

2525
error: item has unused generic parameters
26-
--> $DIR/closures.rs:25:19
26+
--> $DIR/closures.rs:27:19
2727
|
2828
LL | pub fn used_parent<const T: usize>() -> usize {
2929
| - generic parameter `T` is unused
@@ -32,7 +32,7 @@ LL | let add_one = |x: usize| x + 1;
3232
| ^^^^^^^^^^^^^^^^
3333

3434
error: item has unused generic parameters
35-
--> $DIR/closures.rs:43:13
35+
--> $DIR/closures.rs:47:13
3636
|
3737
LL | pub fn unused_upvar<const T: usize>() -> usize {
3838
| - generic parameter `T` is unused

src/test/ui/polymorphization/const_parameters/functions.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
// build-fail
2-
// compile-flags: -Zpolymorphize-errors
3-
#![feature(const_generics)]
2+
#![feature(const_generics, rustc_attrs)]
43
//~^ WARN the feature `const_generics` is incomplete
54

65
// This test checks that the polymorphization analysis correctly detects unused const
76
// parameters in functions.
87

98
// Function doesn't have any generic parameters to be unused.
9+
#[rustc_polymorphize_error]
1010
pub fn no_parameters() {}
1111

1212
// Function has an unused generic parameter.
13+
#[rustc_polymorphize_error]
1314
pub fn unused<const T: usize>() {
14-
//~^ ERROR item has unused generic parameters
15+
//~^ ERROR item has unused generic parameters
1516
}
1617

1718
// Function uses generic parameter in value of a binding.
19+
#[rustc_polymorphize_error]
1820
pub fn used_binding<const T: usize>() -> usize {
1921
let x: usize = T;
2022
x
2123
}
2224

2325
// Function uses generic parameter in substitutions to another function.
26+
#[rustc_polymorphize_error]
2427
pub fn used_substs<const T: usize>() {
2528
unused::<T>()
2629
}

src/test/ui/polymorphization/const_parameters/functions.stderr

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes
2-
--> $DIR/functions.rs:3:12
2+
--> $DIR/functions.rs:2:12
33
|
4-
LL | #![feature(const_generics)]
4+
LL | #![feature(const_generics, rustc_attrs)]
55
| ^^^^^^^^^^^^^^
66
|
77
= note: `#[warn(incomplete_features)]` on by default
88
= note: see issue #44580 <https://github.com/rust-lang/rust/issues/44580> for more information
99

1010
error: item has unused generic parameters
11-
--> $DIR/functions.rs:13:8
11+
--> $DIR/functions.rs:14:8
1212
|
1313
LL | pub fn unused<const T: usize>() {
1414
| ^^^^^^ - generic parameter `T` is unused

src/test/ui/polymorphization/generators.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// build-fail
2-
// compile-flags: -Zpolymorphize-errors
3-
#![feature(const_generics, generators, generator_trait)]
2+
#![feature(const_generics, generators, generator_trait, rustc_attrs)]
43
//~^ WARN the feature `const_generics` is incomplete
54

65
use std::marker::Unpin;
@@ -30,6 +29,7 @@ where
3029

3130
// This test checks that the polymorphization analysis functions on generators.
3231

32+
#[rustc_polymorphize_error]
3333
pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
3434
//~^ ERROR item has unused generic parameters
3535
|| {
@@ -39,20 +39,23 @@ pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
3939
}
4040
}
4141

42+
#[rustc_polymorphize_error]
4243
pub fn used_type_in_yield<Y: Default>() -> impl Generator<(), Yield = Y, Return = u32> + Unpin {
4344
|| {
4445
yield Y::default();
4546
2
4647
}
4748
}
4849

50+
#[rustc_polymorphize_error]
4951
pub fn used_type_in_return<R: Default>() -> impl Generator<(), Yield = u32, Return = R> + Unpin {
5052
|| {
5153
yield 3;
5254
R::default()
5355
}
5456
}
5557

58+
#[rustc_polymorphize_error]
5659
pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
5760
//~^ ERROR item has unused generic parameters
5861
|| {
@@ -62,6 +65,7 @@ pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return =
6265
}
6366
}
6467

68+
#[rustc_polymorphize_error]
6569
pub fn used_const_in_yield<const Y: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
6670
{
6771
|| {
@@ -70,6 +74,7 @@ pub fn used_const_in_yield<const Y: u32>() -> impl Generator<(), Yield = u32, Re
7074
}
7175
}
7276

77+
#[rustc_polymorphize_error]
7378
pub fn used_const_in_return<const R: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin
7479
{
7580
|| {

src/test/ui/polymorphization/generators.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes
2-
--> $DIR/generators.rs:3:12
2+
--> $DIR/generators.rs:2:12
33
|
4-
LL | #![feature(const_generics, generators, generator_trait)]
4+
LL | #![feature(const_generics, generators, generator_trait, rustc_attrs)]
55
| ^^^^^^^^^^^^^^
66
|
77
= note: `#[warn(incomplete_features)]` on by default
@@ -27,7 +27,7 @@ LL | pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> +
2727
| ^^^^^^^^^^^ - generic parameter `T` is unused
2828

2929
error: item has unused generic parameters
30-
--> $DIR/generators.rs:58:5
30+
--> $DIR/generators.rs:61:5
3131
|
3232
LL | pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
3333
| - generic parameter `T` is unused
@@ -40,7 +40,7 @@ LL | | }
4040
| |_____^
4141

4242
error: item has unused generic parameters
43-
--> $DIR/generators.rs:56:8
43+
--> $DIR/generators.rs:59:8
4444
|
4545
LL | pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
4646
| ^^^^^^^^^^^^ - generic parameter `T` is unused

src/test/ui/polymorphization/lifetimes.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
// build-fail
2-
// compile-flags: -Zpolymorphize-errors
2+
#![feature(rustc_attrs)]
33

44
// This test checks that the polymorphization analysis doesn't break when the
55
// function/closure doesn't just have generic parameters.
66

77
// Function has an unused generic parameter.
8+
#[rustc_polymorphize_error]
89
pub fn unused<'a, T>(_: &'a u32) {
9-
//~^ ERROR item has unused generic parameters
10+
//~^ ERROR item has unused generic parameters
1011
}
1112

13+
#[rustc_polymorphize_error]
1214
pub fn used<'a, T: Default>(_: &'a u32) -> u32 {
1315
let _: T = Default::default();
1416
let add_one = |x: u32| x + 1;
15-
//~^ ERROR item has unused generic parameters
17+
//~^ ERROR item has unused generic parameters
1618
add_one(3)
1719
}
1820

src/test/ui/polymorphization/lifetimes.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
error: item has unused generic parameters
2-
--> $DIR/lifetimes.rs:8:8
2+
--> $DIR/lifetimes.rs:9:8
33
|
44
LL | pub fn unused<'a, T>(_: &'a u32) {
55
| ^^^^^^ - generic parameter `T` is unused
66

77
error: item has unused generic parameters
8-
--> $DIR/lifetimes.rs:14:19
8+
--> $DIR/lifetimes.rs:16:19
99
|
1010
LL | pub fn used<'a, T: Default>(_: &'a u32) -> u32 {
1111
| - generic parameter `T` is unused

src/test/ui/polymorphization/predicates.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
// build-fail
2-
// compile-flags: -Zpolymorphize-errors
2+
#![feature(rustc_attrs)]
33

44
// This test checks that `T` is considered used in `foo`, because it is used in a predicate for
55
// `I`, which is used.
66

7+
#[rustc_polymorphize_error]
78
fn bar<I>() {
8-
//~^ ERROR item has unused generic parameters
9+
//~^ ERROR item has unused generic parameters
910
}
1011

12+
#[rustc_polymorphize_error]
1113
fn foo<I, T>(_: I)
1214
where
1315
I: Iterator<Item = T>,

src/test/ui/polymorphization/predicates.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: item has unused generic parameters
2-
--> $DIR/predicates.rs:7:4
2+
--> $DIR/predicates.rs:8:4
33
|
44
LL | fn bar<I>() {
55
| ^^^ - generic parameter `I` is unused

src/test/ui/polymorphization/too-many-generic-params.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// build-pass
2-
// compile-flags: -Zpolymorphize-errors
2+
#![feature(rustc_attrs)]
33

44
// This test checks that the analysis doesn't panic when there are >64 generic parameters, but
55
// instead considers those parameters used.
66

7+
#[rustc_polymorphize_error]
78
fn bar<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA,
89
AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW,
910
AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ, BK, BL>()

0 commit comments

Comments
 (0)