title: Does [temp.res]/8 in C++ standard make this program ill-formed?
body: <p>Let's consider a very basic case of a template class for which only specializations are valid:</p>
  
  <pre><code>template&lt;bool B&gt;
  struct OnlyTrue; // { static_assert(B != B, "Only true!"; };
  
  template&lt;&gt; struct OnlyTrue&lt;true&gt; { static constexpr bool value = true; };
  
  static constexpr bool b = OnlyTrue&lt;true&gt;::value;
  </code></pre>
  
  <p>An example above <em>effectively</em> disallows using <code>OnlyTrue&lt;false&gt;</code> in the program by making it incomplete. An alternative would be uncommenting <code>static_assert</code> - and making it complete, albeit uncompilable. The benefit of this approach would be that a more human-friendly diagnostic would be generated if instantiated with disallowed value. (See <a href="https://stackoverflow.com/questions/53488151/mapping-an-integral-template-parameter-value-onto-a-primitive-type/53488311?noredirect=1#comment93849450_53488311">Mapping an integral template parameter value onto a primitive type</a> for a bit more meaningful example of the same technique).</p>
  
  <p>Now to the question - would [temp.res]/8 in latest C++ standard, in particular, 8.1:</p>
  
  <blockquote>
    <p>The program is ill-formed, no diagnostic required, if: ... no valid
    specialization can be generated for a template or a substatement of a
    <code>constexpr if</code> statement within a template and the template is not
    instantiated ...</p>
  </blockquote>
  
  <p>Make the above snippet ill-formed with <strong>no diagnostic required</strong>?</p>