checker: check error in for_c_stmt with optional call (#14190)
							parent
							
								
									eb03fad934
								
							
						
					
					
						commit
						09f8b6a380
					
				| 
						 | 
				
			
			@ -13,6 +13,16 @@ fn (mut c Checker) for_c_stmt(node ast.ForCStmt) {
 | 
			
		|||
	}
 | 
			
		||||
	c.expr(node.cond)
 | 
			
		||||
	if node.has_inc {
 | 
			
		||||
		if node.inc is ast.AssignStmt {
 | 
			
		||||
			for right in node.inc.right {
 | 
			
		||||
				if right is ast.CallExpr {
 | 
			
		||||
					if right.or_block.stmts.len > 0 {
 | 
			
		||||
						c.error('optionals are not allowed in `for statement increment` (yet)',
 | 
			
		||||
							right.pos)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		c.stmt(node.inc)
 | 
			
		||||
	}
 | 
			
		||||
	c.check_loop_label(node.label, node.pos)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
vlib/v/checker/tests/for_c_stmt_with_optional_call.vv:15:31: error: optionals are not allowed in `for statement increment` (yet)
 | 
			
		||||
   13 |     for t := 0; t < tests; t++ {
 | 
			
		||||
   14 |         mut v := []bool{len: nmax, init: false}
 | 
			
		||||
   15 |         for x := 0; !v[x]; x = rand.intn(n) or { 0 } {
 | 
			
		||||
      |                                     ~~~~~~~
 | 
			
		||||
   16 |             v[x] = true
 | 
			
		||||
   17 |             sum++
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
import rand
 | 
			
		||||
import math { abs }
 | 
			
		||||
 | 
			
		||||
const nmax = 20
 | 
			
		||||
 | 
			
		||||
fn ana(n int) f64 {
 | 
			
		||||
	return 1.0 // haven't started
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn avg(n int) f64 {
 | 
			
		||||
	tests := 1e4
 | 
			
		||||
	mut sum := 0
 | 
			
		||||
	for t := 0; t < tests; t++ {
 | 
			
		||||
		mut v := []bool{len: nmax, init: false}
 | 
			
		||||
		for x := 0; !v[x]; x = rand.intn(n) or { 0 } {
 | 
			
		||||
			v[x] = true
 | 
			
		||||
			sum++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return f64(sum) / tests
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
	println(' N   average   analytical   (error)')
 | 
			
		||||
	println('=== ========= ============ =========')
 | 
			
		||||
	for n in 1 .. nmax + 1 {
 | 
			
		||||
		a := avg(n)
 | 
			
		||||
		b := ana(n)
 | 
			
		||||
		println('${n:3} ${a:9.4f} ${b:12.4f} (${(abs(a - b) / b * 100):6.2f}%)')
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue