struct St {
mut:
	x f64
}

fn (s &St) get_f64() f64 {
	return s.x
}

struct Gen {
	s shared St
}

fn (g Gen) set_val() bool {
	lock g.s {
		g.s.x = 6.25
		if g.s.x == 6.25 {
			return true
		}
		g.s.x == 7.125
	}
	return false
}

fn (g &Gen) inc_val() {
	shared q := St{
		x: 1.0
	}
	shared v := St{
		x: 0.25
	}
	lock q, g.s, v {
		g.s.x += q.x
		g.s.x += v.x
	}
}

fn test_lock_selector_expression() {
	g := Gen{
		s: St{
			x: 12.5
		}
	}
	g.set_val()
	g.inc_val()
	a := rlock g.s {
		g.s.get_f64()
	}
	assert a == 7.5
}
