68 lines
1.8 KiB
Rust
68 lines
1.8 KiB
Rust
// build-fail
|
|
// compile-flags:-Zpolymorphize=on
|
|
#![feature(generic_const_exprs, rustc_attrs)]
|
|
//~^ WARN the feature `generic_const_exprs` 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<const T: usize>() -> usize {
|
|
//~^ ERROR item has unused generic parameters
|
|
let add_one = |x: usize| x + 1;
|
|
//~^ 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<const T: usize>() -> usize {
|
|
let x: usize = T;
|
|
let add_one = |x: usize| x + 1;
|
|
//~^ 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<const T: usize>() -> usize {
|
|
let x = || {
|
|
let y: usize = T;
|
|
y
|
|
};
|
|
|
|
x()
|
|
}
|
|
|
|
// Closure uses a value as an upvar, which used the generic parameter.
|
|
#[rustc_polymorphize_error]
|
|
pub fn unused_upvar<const T: usize>() -> usize {
|
|
let x: usize = T;
|
|
let y = || x;
|
|
//~^ ERROR item has unused generic parameters
|
|
y()
|
|
}
|
|
|
|
// Closure uses generic parameter in substitutions to another function.
|
|
#[rustc_polymorphize_error]
|
|
pub fn used_substs<const T: usize>() -> usize {
|
|
let x = || unused::<T>();
|
|
x()
|
|
}
|
|
|
|
fn main() {
|
|
no_parameters();
|
|
let _ = unused::<1>();
|
|
let _ = used_parent::<1>();
|
|
let _ = used_binding::<1>();
|
|
let _ = unused_upvar::<1>();
|
|
let _ = used_substs::<1>();
|
|
}
|