title: error: no viable overloading with clang, compiles with gcc
body: <p>The following program compiles fine with g++ (version 10.1.0) but not with clang++ (10.0.0)</p>
  <pre><code>#include &lt;iostream&gt;
  
  template &lt;typename U&gt;
  struct A { U x; };
  
  namespace tools {
    template &lt;typename U&gt;
    void operator+=(A&lt;U&gt;&amp; lhs, const A&lt;U&gt;&amp; rhs) { lhs.x += rhs.x; }
  }
  
  namespace impl {
    template &lt;typename U = int&gt;
    void f() {
      A&lt;U&gt; a{3};
      A&lt;U&gt; b{2};
      a += b;
      std::cout &lt;&lt; a.x &lt;&lt; std::endl;
    }
  }
  
  namespace impl {
    using namespace tools;
  }
  
  int main()
  {
    impl::f();
  }
  </code></pre>
  <p>The error is:</p>
  <pre><code>name.cpp:16:7: error: no viable overloaded '+='
      a += b;
      ~ ^  ~
  name.cpp:27:9: note: in instantiation of function template specialization 'impl::f&lt;int&gt;' requested here
    impl::f();
  </code></pre>
  <p>Clearly, moving the <code>using namespace tools</code> part before the template function <code>impl::f()</code> removes the error of clang.</p>
  <p><strong>Additional note</strong>
  An important point here is that <code>f</code> is a template function. Without template parameters the code compiles neither with gcc, nor with clang.</p>
  <p>What compiler is correct here? gcc or clang?</p>