# XO0503: one variable or overlapping places passed to two `var` parameters of one call

A call may not pass the same variable, or two places that overlap (`x` and `x.f`, `xs[i]` and `xs[j]` unless both indexes are different literals, a `var` receiver and an argument naming it), to two `var` parameters. The Go backend passes `var` arguments by reference and the native backends copy them in and out, so aliased writes would differ; with aliasing ruled out both conventions give one result. Copy one of the places into a temporary, pass the temporary, and store it back after the call, or take a single `var` parameter of a struct that holds both values. See core 5.2 and decision 0111.

## Example

```xo
fn both(var a: List[Int], var b: List[Int]) {
  a.push(1)
  b.push(2)
}

fn f() -> Int {
  var xs = [0]
  both(xs, xs)
  xs.len()
}
```

## Fix

```xo
fn both(var a: List[Int], var b: List[Int]) {
  a.push(1)
  b.push(2)
}

fn f() -> Int {
  var xs = [0]
  var ys = xs
  both(xs, ys)
  xs.len() + ys.len()
}
```

Run `xo explain XO0503` for this text in a terminal, or see
[section 10.6 of the specification](../../spec/core/#106-diagnostic-codes).

