parent
							
								
									fdba3607af
								
							
						
					
					
						commit
						cf82bd3407
					
				| 
						 | 
				
			
			@ -4379,7 +4379,8 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) ast.Type {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if fixed_size <= 0 {
 | 
			
		||||
			c.error('fixed size cannot be zero or negative', init_expr.position())
 | 
			
		||||
			c.error('fixed size cannot be zero or negative (fixed_size: $fixed_size)',
 | 
			
		||||
				init_expr.position())
 | 
			
		||||
		}
 | 
			
		||||
		idx := c.table.find_or_register_array_fixed(array_init.elem_type, int(fixed_size),
 | 
			
		||||
			init_expr)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,6 +55,34 @@ fn eval_comptime_const_expr(expr ast.Expr, nlevel int) ?ast.ComptTimeConstValue
 | 
			
		|||
						return none
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			} else if left is u64 && right is i64 {
 | 
			
		||||
				match expr.op {
 | 
			
		||||
					.plus { return i64(left) + i64(right) }
 | 
			
		||||
					.minus { return i64(left) - i64(right) }
 | 
			
		||||
					.mul { return i64(left) * i64(right) }
 | 
			
		||||
					.div { return i64(left) / i64(right) }
 | 
			
		||||
					.mod { return i64(left) % i64(right) }
 | 
			
		||||
					.xor { return i64(left) ^ i64(right) }
 | 
			
		||||
					.pipe { return i64(left) | i64(right) }
 | 
			
		||||
					.amp { return i64(left) & i64(right) }
 | 
			
		||||
					.left_shift { return i64(left) << i64(right) }
 | 
			
		||||
					.right_shift { return i64(left) >> i64(right) }
 | 
			
		||||
					else { return none }
 | 
			
		||||
				}
 | 
			
		||||
			} else if left is i64 && right is u64 {
 | 
			
		||||
				match expr.op {
 | 
			
		||||
					.plus { return i64(left) + i64(right) }
 | 
			
		||||
					.minus { return i64(left) - i64(right) }
 | 
			
		||||
					.mul { return i64(left) * i64(right) }
 | 
			
		||||
					.div { return i64(left) / i64(right) }
 | 
			
		||||
					.mod { return i64(left) % i64(right) }
 | 
			
		||||
					.xor { return i64(left) ^ i64(right) }
 | 
			
		||||
					.pipe { return i64(left) | i64(right) }
 | 
			
		||||
					.amp { return i64(left) & i64(right) }
 | 
			
		||||
					.left_shift { return i64(left) << i64(right) }
 | 
			
		||||
					.right_shift { return i64(left) >> i64(right) }
 | 
			
		||||
					else { return none }
 | 
			
		||||
				}
 | 
			
		||||
			} else if left is u64 && right is u64 {
 | 
			
		||||
				match expr.op {
 | 
			
		||||
					.plus { return left + right }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
vlib/v/checker/tests/fixed_array_size_err.vv:4:8: error: fixed size cannot be zero or negative
 | 
			
		||||
    2 |
 | 
			
		||||
vlib/v/checker/tests/fixed_array_size_err.vv:4:8: error: fixed size cannot be zero or negative (fixed_size: -1)
 | 
			
		||||
    2 | 
 | 
			
		||||
    3 | fn main() {
 | 
			
		||||
    4 |     a := [size]int{}
 | 
			
		||||
      |           ~~~~
 | 
			
		||||
    5 |     b := [0]byte{}
 | 
			
		||||
    6 |     println(a)
 | 
			
		||||
vlib/v/checker/tests/fixed_array_size_err.vv:5:8: error: fixed size cannot be zero or negative
 | 
			
		||||
vlib/v/checker/tests/fixed_array_size_err.vv:5:8: error: fixed size cannot be zero or negative (fixed_size: 0)
 | 
			
		||||
    3 | fn main() {
 | 
			
		||||
    4 |     a := [size]int{}
 | 
			
		||||
    5 |     b := [0]byte{}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
const (
 | 
			
		||||
	size = 5
 | 
			
		||||
	size     = 5
 | 
			
		||||
	u64_size = u64(5)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
struct Foo {
 | 
			
		||||
| 
						 | 
				
			
			@ -13,3 +14,33 @@ fn test_fixed_array_const_size() {
 | 
			
		|||
		bar: [byte(0), 0, 0, 0, 0]!
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_fixed_array_const_u64_size() {
 | 
			
		||||
	a := [2 * u64_size]f64{}
 | 
			
		||||
	println(a)
 | 
			
		||||
	assert '$a' == '[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const n = u64(5_000)
 | 
			
		||||
 | 
			
		||||
const nn = 5_000
 | 
			
		||||
 | 
			
		||||
fn test_u64_const_used_as_fixed_array_size() {
 | 
			
		||||
	mut a := [2 * n]f64{}
 | 
			
		||||
	dump(a.len)
 | 
			
		||||
	assert a.len == 10000
 | 
			
		||||
 | 
			
		||||
	mut b := [n * 2]f64{}
 | 
			
		||||
	dump(b.len)
 | 
			
		||||
	assert b.len == 10000
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_int_const_used_as_fixed_array_size() {
 | 
			
		||||
	mut aa := [2 * nn]f64{}
 | 
			
		||||
	dump(aa.len)
 | 
			
		||||
	assert aa.len == 10_000
 | 
			
		||||
 | 
			
		||||
	mut bb := [nn * 2]f64{}
 | 
			
		||||
	dump(bb.len)
 | 
			
		||||
	assert aa.len == 10_000
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue