struct A {
pub mut:
	v []int
}

struct B {
pub mut:
	a []A
}

fn foo(b int, a mut []int) {
	a[0] = 7
	//a << 4
}

fn test_mut() {
	mut numbers := [1,2,3]
	foo(7, mut numbers)
	assert numbers.len == 3
	// TODO bring back once << works with mutable args
	//assert numbers.len == 4
	//assert numbers[0] == 7
	//assert numbers[3] == 4
	println(numbers)
	n := 1
	mut b := &n
	*b = 10
	//mut b := mut a
	//b = 10
}

fn test_mut_2() {
	zero := 0

	mut b := B{}
	b.a << A{}

	b.a[0].v = [9, 8, 7]

	b.a[0].v << 6
	b.a[zero].v << 5

	b.a[0].v[zero] = 3
	b.a[0].v[b.a[zero].v[zero]]+= 2 -1 // TODO
	b.a[0].v[b.a[0].v[zero]]+= 2 - 1 // TODO

	assert b.a[0].v.len == 5
	assert b.a[0].v[0] == 3
	assert b.a[0].v[1] == 8
	assert b.a[0].v[2] == 7
	assert b.a[0].v[3] == 8
	assert b.a[0].v[4] == 5
}