mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			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>();
 | |
| }
 | 
