title: GCC/CLang disagree on partial specialization of template template parameter
body: <p>GCC and clang disagree about this code.</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#include &lt;type_traits&gt;
  
  template &lt;typename T, template &lt;typename...&gt; typename Tpl&gt; 
  struct storage {
      using type_t = T;
  
      template &lt;typename... Args&gt;
      using storage_tpl = Tpl&lt;Args...&gt;;
  };
  
  template &lt;typename T, template &lt;typename...&gt; typename&gt;
  struct F{
      constexpr static int x = 1;
  };
  
  template &lt;typename T &gt;
  struct F&lt;T, std::void_t&gt;{
      constexpr static int x = 2;
  };
  
  int f() {
      using S = storage&lt;int, std::void_t&gt;;
  
      static_assert(F&lt;int, S::storage_tpl&gt;().x == 2);
  
      return F&lt;int, S::storage_tpl&gt;().x;
  }
  </code></pre>
  
  <p>According to clang <code>S::storage_tpl</code> is not <code>std::void_t</code>; of consequence it selects the primary template F instead of the partial specialization and thus the assert.</p>
  
  <p>At first glance, it looks like GCC is right because it understands that the nested template is just an alias for <code>std::void_t</code> but maybe it is too smart and the standard requires that <code>S::storage_tpl</code> and <code>std::void_t</code> must be two different templates.</p>
  
  <p>Who is right?</p>