title: Cannot add-assign within `Vec` of user-defined type
body: <p>Consider this code (<a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=ff4a0a18d3e322ae3d4d2db380829595" rel="nofollow noreferrer">Rust Playground</a>):</p>
  <pre><code>#[derive(Clone, Copy, Debug)]
  struct X(i32);
  
  impl std::ops::AddAssign for X {
      fn add_assign(&amp;mut self, rhs: Self) {
          self.0 += rhs.0;
      }
  }
  
  fn main() {
      let mut ary_i32 = [1_i32; 2];
      ary_i32[0] += ary_i32[1]; // OK
  
      let mut ary_x = [X(1); 2];
      ary_x[0] += ary_x[1]; // OK
  
      let mut vec_i32 = vec![1_i32; 2];
      vec_i32[0] += vec_i32[1]; // OK
  
      let mut vec_x = vec![X(1); 2];
      vec_x[0] += vec_x[1]; // error[E0502]: cannot borrow `vec_x` as immutable because it is also borrowed as mutable
  }
  
  </code></pre>
  <p>Why I get E0502 only on <code>vec_x</code> line?
  I could not understand why only the operations for <code>ary_x</code> and <code>vec_i32</code> are permitted. Does borrow checker treat builtin types (<code>i32</code>, <code>array</code>) specially?</p>