mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 9479792cb4
			
		
	
	
		9479792cb4
		
	
	
	
	
		
			
			Rustc of course already WF-checked the field types at the definition site, but for error tainting of consts to work properly, there needs to be an error emitted at the use site. Previously, with no use-site error, we proceeded with CTFE and ran into ICEs since we are running code with type errors. Emitting use-site errors also brings struct-like constructors more in line with fn-like constructors since they already emit use-site errors for WF issues.
		
			
				
	
	
		
			32 lines
		
	
	
		
			612 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			612 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![feature(generic_const_exprs)]
 | |
| #![allow(incomplete_features, unused)]
 | |
| 
 | |
| const fn complex_maths(n : usize) -> usize {
 | |
|   2 * n + 1
 | |
| }
 | |
| 
 | |
| pub struct Example<const N: usize> {
 | |
|   a: [f32; N],
 | |
|   b: [f32; complex_maths(N)],
 | |
|   //~^ ERROR unconstrained generic
 | |
| }
 | |
| 
 | |
| impl<const N: usize> Example<N> {
 | |
|   pub fn new() -> Self {
 | |
|     Self {
 | |
|       a: [0.; N],
 | |
|       b: [0.; complex_maths(N)],
 | |
|       //~^ ERROR: unconstrained generic constant
 | |
|       //~| ERROR: unconstrained generic constant
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| impl Example<2> {
 | |
|   pub fn sum(&self) -> f32 {
 | |
|     self.a.iter().sum::<f32>() + self.b.iter().sum::<f32>()
 | |
|   }
 | |
| }
 | |
| 
 | |
| fn main() {}
 |