diff --git a/src/librustc_feature/builtin_attrs.rs b/src/librustc_feature/builtin_attrs.rs index 4e2aea34fe7fb..879f06f89a70a 100644 --- a/src/librustc_feature/builtin_attrs.rs +++ b/src/librustc_feature/builtin_attrs.rs @@ -568,6 +568,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), rustc_attr!(TEST, rustc_synthetic, AssumedUsed, template!(Word)), rustc_attr!(TEST, rustc_symbol_name, AssumedUsed, template!(Word)), + rustc_attr!(TEST, rustc_polymorphize_error, AssumedUsed, template!(Word)), rustc_attr!(TEST, rustc_def_path, AssumedUsed, template!(Word)), rustc_attr!(TEST, rustc_mir, AssumedUsed, template!(List: "arg1, arg2, ...")), rustc_attr!(TEST, rustc_dump_program_clauses, AssumedUsed, template!(Word)), diff --git a/src/librustc_mir/monomorphize/polymorphize.rs b/src/librustc_mir/monomorphize/polymorphize.rs index b06bf061d1f5e..2a1f8fb843fb3 100644 --- a/src/librustc_mir/monomorphize/polymorphize.rs +++ b/src/librustc_mir/monomorphize/polymorphize.rs @@ -16,6 +16,7 @@ use rustc_middle::ty::{ query::Providers, Const, Ty, TyCtxt, }; +use rustc_span::symbol::sym; use std::convert::TryInto; /// Provide implementations of queries relating to polymorphization analysis. @@ -77,7 +78,7 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> u64 { // Emit errors for debugging and testing if enabled. let is_full = unused_parameters == 0; - if tcx.sess.opts.debugging_opts.polymorphize_errors && !is_full { + if !is_full { emit_unused_generic_params_error(tcx, def_id, generics, unused_parameters); } @@ -169,8 +170,8 @@ fn mark_used_by_predicates<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, used_paramete } } -/// Emit an error for the function represented by `def_id`, labelling each generic parameter which -/// was unused. +/// Emit errors for the function annotated by `#[rustc_polymorphize_error]`, labelling each generic +/// parameter which was unused. fn emit_unused_generic_params_error<'tcx>( tcx: TyCtxt<'tcx>, def_id: DefId, @@ -178,7 +179,8 @@ fn emit_unused_generic_params_error<'tcx>( unused_parameters: u64, ) { debug!("emit_unused_generic_params_error: def_id={:?}", def_id); - if !def_id.is_local() { + let base_def_id = tcx.closure_base_def_id(def_id); + if !tcx.get_attrs(base_def_id).iter().any(|a| a.check_name(sym::rustc_polymorphize_error)) { return; } diff --git a/src/librustc_session/options.rs b/src/librustc_session/options.rs index 11fc40998b1c8..6b2097240e215 100644 --- a/src/librustc_session/options.rs +++ b/src/librustc_session/options.rs @@ -951,8 +951,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "enable polonius-based borrow-checker (default: no)"), polymorphize: bool = (true, parse_bool, [TRACKED], "perform polymorphization analysis"), - polymorphize_errors: bool = (false, parse_bool, [TRACKED], - "emit errors from polymorphization analysis for debugging"), 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)"), pre_link_args: Vec = (Vec::new(), parse_list, [UNTRACKED], diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs index 5d332ddf5f3df..22a5115c7f556 100644 --- a/src/librustc_span/symbol.rs +++ b/src/librustc_span/symbol.rs @@ -921,6 +921,7 @@ symbols! { rustc_peek_liveness, rustc_peek_maybe_init, rustc_peek_maybe_uninit, + rustc_polymorphize_error, rustc_private, rustc_proc_macro_decls, rustc_promotable, diff --git a/src/test/ui/polymorphization/const_parameters/closures.rs b/src/test/ui/polymorphization/const_parameters/closures.rs index da83cc1bee402..7bbcaebea0125 100644 --- a/src/test/ui/polymorphization/const_parameters/closures.rs +++ b/src/test/ui/polymorphization/const_parameters/closures.rs @@ -1,33 +1,36 @@ // build-fail -// compile-flags: -Zpolymorphize-errors -#![feature(const_generics)] +#![feature(const_generics, rustc_attrs)] //~^ WARN the feature `const_generics` is incomplete // This test checks that the polymorphization analysis correctly detects unused const // parameters in closures. // Function doesn't have any generic parameters to be unused. +#[rustc_polymorphize_error] pub fn no_parameters() { let _ = || {}; } // Function has an unused generic parameter in parent and closure. +#[rustc_polymorphize_error] pub fn unused() -> usize { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let add_one = |x: usize| x + 1; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters add_one(3) } // Function has an unused generic parameter in closure, but not in parent. +#[rustc_polymorphize_error] pub fn used_parent() -> usize { let x: usize = T; let add_one = |x: usize| x + 1; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters x + add_one(3) } // Function uses generic parameter in value of a binding in closure. +#[rustc_polymorphize_error] pub fn used_binding() -> usize { let x = || { let y: usize = T; @@ -38,14 +41,16 @@ pub fn used_binding() -> usize { } // Closure uses a value as an upvar, which used the generic parameter. +#[rustc_polymorphize_error] pub fn unused_upvar() -> usize { let x: usize = T; let y = || x; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters y() } // Closure uses generic parameter in substitutions to another function. +#[rustc_polymorphize_error] pub fn used_substs() -> usize { let x = || unused::(); x() diff --git a/src/test/ui/polymorphization/const_parameters/closures.stderr b/src/test/ui/polymorphization/const_parameters/closures.stderr index 73a071f346a15..eb872eac74c91 100644 --- a/src/test/ui/polymorphization/const_parameters/closures.stderr +++ b/src/test/ui/polymorphization/const_parameters/closures.stderr @@ -1,14 +1,14 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/closures.rs:3:12 + --> $DIR/closures.rs:2:12 | -LL | #![feature(const_generics)] +LL | #![feature(const_generics, rustc_attrs)] | ^^^^^^^^^^^^^^ | = note: `#[warn(incomplete_features)]` on by default = note: see issue #44580 for more information error: item has unused generic parameters - --> $DIR/closures.rs:17:19 + --> $DIR/closures.rs:18: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:15:8 + --> $DIR/closures.rs:16:8 | LL | pub fn unused() -> usize { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/closures.rs:25:19 + --> $DIR/closures.rs:27: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:43:13 + --> $DIR/closures.rs:47: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 1c19f9480b4ee..77539b94e489a 100644 --- a/src/test/ui/polymorphization/const_parameters/functions.rs +++ b/src/test/ui/polymorphization/const_parameters/functions.rs @@ -1,26 +1,29 @@ // build-fail -// compile-flags: -Zpolymorphize-errors -#![feature(const_generics)] +#![feature(const_generics, rustc_attrs)] //~^ WARN the feature `const_generics` is incomplete // This test checks that the polymorphization analysis correctly detects unused const // parameters in functions. // Function doesn't have any generic parameters to be unused. +#[rustc_polymorphize_error] pub fn no_parameters() {} // Function has an unused generic parameter. +#[rustc_polymorphize_error] pub fn unused() { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters } // Function uses generic parameter in value of a binding. +#[rustc_polymorphize_error] pub fn used_binding() -> usize { let x: usize = T; x } // Function uses generic parameter in substitutions to another function. +#[rustc_polymorphize_error] pub fn used_substs() { unused::() } diff --git a/src/test/ui/polymorphization/const_parameters/functions.stderr b/src/test/ui/polymorphization/const_parameters/functions.stderr index a503ec519427d..c99a9b788ebc5 100644 --- a/src/test/ui/polymorphization/const_parameters/functions.stderr +++ b/src/test/ui/polymorphization/const_parameters/functions.stderr @@ -1,14 +1,14 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/functions.rs:3:12 + --> $DIR/functions.rs:2:12 | -LL | #![feature(const_generics)] +LL | #![feature(const_generics, rustc_attrs)] | ^^^^^^^^^^^^^^ | = note: `#[warn(incomplete_features)]` on by default = note: see issue #44580 for more information 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 diff --git a/src/test/ui/polymorphization/generators.rs b/src/test/ui/polymorphization/generators.rs index dd7c3497de2c9..1acba7c8bf14c 100644 --- a/src/test/ui/polymorphization/generators.rs +++ b/src/test/ui/polymorphization/generators.rs @@ -1,6 +1,5 @@ // build-fail -// compile-flags: -Zpolymorphize-errors -#![feature(const_generics, generators, generator_trait)] +#![feature(const_generics, generators, generator_trait, rustc_attrs)] //~^ WARN the feature `const_generics` is incomplete use std::marker::Unpin; @@ -30,6 +29,7 @@ where // This test checks that the polymorphization analysis functions on generators. +#[rustc_polymorphize_error] pub fn unused_type() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { //~^ ERROR item has unused generic parameters || { @@ -39,6 +39,7 @@ pub fn unused_type() -> impl Generator<(), Yield = u32, Return = u32> + Unpin } } +#[rustc_polymorphize_error] pub fn used_type_in_yield() -> impl Generator<(), Yield = Y, Return = u32> + Unpin { || { yield Y::default(); @@ -46,6 +47,7 @@ pub fn used_type_in_yield() -> impl Generator<(), Yield = Y, Return } } +#[rustc_polymorphize_error] pub fn used_type_in_return() -> impl Generator<(), Yield = u32, Return = R> + Unpin { || { yield 3; @@ -53,6 +55,7 @@ pub fn used_type_in_return() -> impl Generator<(), Yield = u32, Retu } } +#[rustc_polymorphize_error] pub fn unused_const() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { //~^ ERROR item has unused generic parameters || { @@ -62,6 +65,7 @@ pub fn unused_const() -> impl Generator<(), Yield = u32, Return = } } +#[rustc_polymorphize_error] pub fn used_const_in_yield() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { || { @@ -70,6 +74,7 @@ pub fn used_const_in_yield() -> impl Generator<(), Yield = u32, Re } } +#[rustc_polymorphize_error] pub fn used_const_in_return() -> impl Generator<(), Yield = u32, Return = u32> + Unpin { || { diff --git a/src/test/ui/polymorphization/generators.stderr b/src/test/ui/polymorphization/generators.stderr index 9e3ee130234da..b3e5a2de0270a 100644 --- a/src/test/ui/polymorphization/generators.stderr +++ b/src/test/ui/polymorphization/generators.stderr @@ -1,7 +1,7 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/generators.rs:3:12 + --> $DIR/generators.rs:2:12 | -LL | #![feature(const_generics, generators, generator_trait)] +LL | #![feature(const_generics, generators, generator_trait, rustc_attrs)] | ^^^^^^^^^^^^^^ | = note: `#[warn(incomplete_features)]` on by default @@ -27,7 +27,7 @@ LL | pub fn unused_type() -> impl Generator<(), Yield = u32, Return = u32> + | ^^^^^^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/generators.rs:58:5 + --> $DIR/generators.rs:61: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:56:8 + --> $DIR/generators.rs:59: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 873a9c7baaab4..4bde349a336ea 100644 --- a/src/test/ui/polymorphization/lifetimes.rs +++ b/src/test/ui/polymorphization/lifetimes.rs @@ -1,18 +1,20 @@ // build-fail -// compile-flags: -Zpolymorphize-errors +#![feature(rustc_attrs)] // This test checks that the polymorphization analysis doesn't break when the // function/closure doesn't just have generic parameters. // Function has an unused generic parameter. +#[rustc_polymorphize_error] pub fn unused<'a, T>(_: &'a u32) { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters } +#[rustc_polymorphize_error] pub fn used<'a, T: Default>(_: &'a u32) -> u32 { let _: T = Default::default(); let add_one = |x: u32| x + 1; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters add_one(3) } diff --git a/src/test/ui/polymorphization/lifetimes.stderr b/src/test/ui/polymorphization/lifetimes.stderr index 5629857f85e65..6c85e4f291611 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:8:8 + --> $DIR/lifetimes.rs:9:8 | LL | pub fn unused<'a, T>(_: &'a u32) { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/lifetimes.rs:14:19 + --> $DIR/lifetimes.rs:16:19 | LL | pub fn used<'a, T: Default>(_: &'a u32) -> u32 { | - generic parameter `T` is unused diff --git a/src/test/ui/polymorphization/predicates.rs b/src/test/ui/polymorphization/predicates.rs index 49f8668cff810..390ac983aa007 100644 --- a/src/test/ui/polymorphization/predicates.rs +++ b/src/test/ui/polymorphization/predicates.rs @@ -1,13 +1,15 @@ // build-fail -// compile-flags: -Zpolymorphize-errors +#![feature(rustc_attrs)] // This test checks that `T` is considered used in `foo`, because it is used in a predicate for // `I`, which is used. +#[rustc_polymorphize_error] fn bar() { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters } +#[rustc_polymorphize_error] fn foo(_: I) where I: Iterator, diff --git a/src/test/ui/polymorphization/predicates.stderr b/src/test/ui/polymorphization/predicates.stderr index b7bc2ccce57bf..1b266083463a2 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:7:4 + --> $DIR/predicates.rs:8:4 | LL | fn bar() { | ^^^ - generic parameter `I` is unused diff --git a/src/test/ui/polymorphization/too-many-generic-params.rs b/src/test/ui/polymorphization/too-many-generic-params.rs index 3bb77a1c1e629..4b296c0190887 100644 --- a/src/test/ui/polymorphization/too-many-generic-params.rs +++ b/src/test/ui/polymorphization/too-many-generic-params.rs @@ -1,9 +1,10 @@ // build-pass -// compile-flags: -Zpolymorphize-errors +#![feature(rustc_attrs)] // This test checks that the analysis doesn't panic when there are >64 generic parameters, but // instead considers those parameters used. +#[rustc_polymorphize_error] fn bar() diff --git a/src/test/ui/polymorphization/type_parameters/closures.rs b/src/test/ui/polymorphization/type_parameters/closures.rs index cf5a4b1cec5f3..1fbe13380b5b9 100644 --- a/src/test/ui/polymorphization/type_parameters/closures.rs +++ b/src/test/ui/polymorphization/type_parameters/closures.rs @@ -1,31 +1,36 @@ // build-fail -// compile-flags: -Zpolymorphize-errors +#![feature(stmt_expr_attributes, rustc_attrs)] // This test checks that the polymorphization analysis correctly detects unused type // parameters in closures. // Function doesn't have any generic parameters to be unused. +#[rustc_polymorphize_error] pub fn no_parameters() { let _ = || {}; } // Function has an unused generic parameter in parent and closure. +#[rustc_polymorphize_error] pub fn unused() -> u32 { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters + let add_one = |x: u32| x + 1; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters add_one(3) } // Function has an unused generic parameter in closure, but not in parent. +#[rustc_polymorphize_error] pub fn used_parent() -> u32 { let _: T = Default::default(); let add_one = |x: u32| x + 1; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters add_one(3) } // Function uses generic parameter in value of a binding in closure. +#[rustc_polymorphize_error] pub fn used_binding_value() -> T { let x = || { let y: T = Default::default(); @@ -36,6 +41,7 @@ pub fn used_binding_value() -> T { } // Function uses generic parameter in generic of a binding in closure. +#[rustc_polymorphize_error] pub fn used_binding_generic() -> Option { let x = || { let y: Option = None; @@ -46,26 +52,32 @@ pub fn used_binding_generic() -> Option { } // Function and closure uses generic parameter in argument. +#[rustc_polymorphize_error] pub fn used_argument(t: T) -> u32 { let x = |_: T| 3; x(t) } // Closure uses generic parameter in argument. +#[rustc_polymorphize_error] pub fn used_argument_closure() -> u32 { let t: T = Default::default(); + let x = |_: T| 3; x(t) } // Closure uses generic parameter as upvar. +#[rustc_polymorphize_error] pub fn used_upvar() -> T { let x: T = Default::default(); + let y = || x; y() } // Closure uses generic parameter in substitutions to another function. +#[rustc_polymorphize_error] pub fn used_substs() -> u32 { let x = || unused::(); x() @@ -75,14 +87,16 @@ struct Foo(F); impl Foo { // Function has an unused generic parameter from impl and fn. + #[rustc_polymorphize_error] pub fn unused_all() -> u32 { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let add_one = |x: u32| x + 1; -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters add_one(3) } // Function uses generic parameter from impl and fn in closure. + #[rustc_polymorphize_error] pub fn used_both() -> u32 { let add_one = |x: u32| { let _: F = Default::default(); @@ -94,10 +108,11 @@ impl Foo { } // Function uses generic parameter from fn in closure. + #[rustc_polymorphize_error] pub fn used_fn() -> u32 { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let add_one = |x: u32| { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let _: G = Default::default(); x + 1 }; @@ -106,10 +121,11 @@ impl Foo { } // Function uses generic parameter from impl in closure. + #[rustc_polymorphize_error] pub fn used_impl() -> u32 { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let add_one = |x: u32| { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let _: F = Default::default(); x + 1 }; @@ -118,6 +134,7 @@ impl Foo { } // Closure uses generic parameter in substitutions to another function. + #[rustc_polymorphize_error] pub fn used_substs() -> u32 { let x = || unused::(); x() diff --git a/src/test/ui/polymorphization/type_parameters/closures.stderr b/src/test/ui/polymorphization/type_parameters/closures.stderr index 914cb628bd0c2..d68e6e25a1eb9 100644 --- a/src/test/ui/polymorphization/type_parameters/closures.stderr +++ b/src/test/ui/polymorphization/type_parameters/closures.stderr @@ -1,20 +1,20 @@ error: item has unused generic parameters - --> $DIR/closures.rs:15:19 + --> $DIR/closures.rs:18:19 | LL | pub fn unused() -> u32 { | - generic parameter `T` is unused -LL | +... LL | let add_one = |x: u32| x + 1; | ^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:13:8 + --> $DIR/closures.rs:15:8 | LL | pub fn unused() -> u32 { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/closures.rs:23:19 + --> $DIR/closures.rs:27:19 | LL | pub fn used_parent() -> u32 { | - generic parameter `T` is unused @@ -23,11 +23,11 @@ LL | let add_one = |x: u32| x + 1; | ^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:80:23 + --> $DIR/closures.rs:93:23 | LL | impl Foo { | - generic parameter `F` is unused -LL | // Function has an unused generic parameter from impl and fn. +... LL | pub fn unused_all() -> u32 { | - generic parameter `G` is unused LL | @@ -35,16 +35,16 @@ LL | let add_one = |x: u32| x + 1; | ^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/closures.rs:78:12 + --> $DIR/closures.rs:91:12 | LL | impl Foo { | - generic parameter `F` is unused -LL | // Function has an unused generic parameter from impl and fn. +... LL | pub fn unused_all() -> u32 { | ^^^^^^^^^^ - generic parameter `G` is unused error: item has unused generic parameters - --> $DIR/closures.rs:111:23 + --> $DIR/closures.rs:127: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:109:12 + --> $DIR/closures.rs:125:12 | LL | pub fn used_impl() -> u32 { | ^^^^^^^^^ - generic parameter `G` is unused error: item has unused generic parameters - --> $DIR/closures.rs:99:23 + --> $DIR/closures.rs:114:23 | LL | impl Foo { | - generic parameter `F` is unused @@ -78,7 +78,7 @@ LL | | }; | |_________^ error: item has unused generic parameters - --> $DIR/closures.rs:97:12 + --> $DIR/closures.rs:112: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 3caf2631a57a3..38f10148c2c52 100644 --- a/src/test/ui/polymorphization/type_parameters/functions.rs +++ b/src/test/ui/polymorphization/type_parameters/functions.rs @@ -1,32 +1,37 @@ // build-fail -// compile-flags: -Zpolymorphize-errors +#![feature(rustc_attrs)] // This test checks that the polymorphization analysis correctly detects unused type // parameters in functions. // Function doesn't have any generic parameters to be unused. +#[rustc_polymorphize_error] pub fn no_parameters() {} // Function has an unused generic parameter. +#[rustc_polymorphize_error] pub fn unused() { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters } // Function uses generic parameter in value of a binding. +#[rustc_polymorphize_error] pub fn used_binding_value() { let _: T = Default::default(); } // Function uses generic parameter in generic of a binding. +#[rustc_polymorphize_error] pub fn used_binding_generic() { let _: Option = None; } // Function uses generic parameter in argument. -pub fn used_argument(_: T) { -} +#[rustc_polymorphize_error] +pub fn used_argument(_: T) {} // Function uses generic parameter in substitutions to another function. +#[rustc_polymorphize_error] pub fn used_substs() { unused::() } @@ -35,33 +40,39 @@ struct Foo(F); impl Foo { // Function has an unused generic parameter from impl. + #[rustc_polymorphize_error] pub fn unused_impl() { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters } // Function has an unused generic parameter from impl and fn. + #[rustc_polymorphize_error] pub fn unused_both() { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters } // Function uses generic parameter from impl. + #[rustc_polymorphize_error] pub fn used_impl() { let _: F = Default::default(); } // Function uses generic parameter from impl. + #[rustc_polymorphize_error] pub fn used_fn() { -//~^ ERROR item has unused generic parameters + //~^ ERROR item has unused generic parameters let _: G = Default::default(); } // Function uses generic parameter from impl. + #[rustc_polymorphize_error] pub fn used_both() { let _: F = Default::default(); let _: G = Default::default(); } // Function uses generic parameter in substitutions to another function. + #[rustc_polymorphize_error] pub fn used_substs() { unused::() } diff --git a/src/test/ui/polymorphization/type_parameters/functions.stderr b/src/test/ui/polymorphization/type_parameters/functions.stderr index a34e677a76550..be4c6576e9645 100644 --- a/src/test/ui/polymorphization/type_parameters/functions.stderr +++ b/src/test/ui/polymorphization/type_parameters/functions.stderr @@ -1,20 +1,20 @@ error: item has unused generic parameters - --> $DIR/functions.rs:11:8 + --> $DIR/functions.rs:13:8 | LL | pub fn unused() { | ^^^^^^ - generic parameter `T` is unused error: item has unused generic parameters - --> $DIR/functions.rs:38:12 + --> $DIR/functions.rs:44:12 | LL | impl Foo { | - generic parameter `F` is unused -LL | // Function has an unused generic parameter from impl. +... LL | pub fn unused_impl() { | ^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/functions.rs:43:12 + --> $DIR/functions.rs:50: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:53:12 + --> $DIR/functions.rs:62: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 3bc25d18981f0..d2f3d4f13cdcc 100644 --- a/src/test/ui/polymorphization/unsized_cast.rs +++ b/src/test/ui/polymorphization/unsized_cast.rs @@ -1,10 +1,10 @@ // build-fail -// compile-flags: -Zpolymorphize-errors -#![feature(fn_traits, unboxed_closures)] +#![feature(fn_traits, rustc_attrs, unboxed_closures)] // This test checks that the polymorphization analysis considers a closure // as using all generic parameters if it does an unsizing cast. +#[rustc_polymorphize_error] fn foo() { let _: T = Default::default(); (|| Box::new(|| {}) as Box)(); @@ -12,6 +12,7 @@ fn foo() { //~^^ ERROR item has unused generic parameters } +#[rustc_polymorphize_error] fn foo2() { let _: T = Default::default(); (|| { diff --git a/src/test/ui/polymorphization/unsized_cast.stderr b/src/test/ui/polymorphization/unsized_cast.stderr index 61fd38841177b..b8b96bbdf15a6 100644 --- a/src/test/ui/polymorphization/unsized_cast.stderr +++ b/src/test/ui/polymorphization/unsized_cast.stderr @@ -17,7 +17,7 @@ LL | (|| Box::new(|| {}) as Box)(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: item has unused generic parameters - --> $DIR/unsized_cast.rs:19:15 + --> $DIR/unsized_cast.rs:20:15 | LL | fn foo2() { | - generic parameter `T` is unused