title: __PRETTY_FUNCTION__ in constant expression
body: <p>Please refer to this snippet:</p>
  
  <pre><code>#include &lt;type_traits&gt;
  #include &lt;string_view&gt;
  
  constexpr std::size_t strlen(char const* s) {
      std::size_t n = 0;
      while (*s++ != '\0')
          ++n;
      return n;
  }
  
  template &lt;std::size_t&gt;
  struct X {};
  
  int main() {
      constexpr auto pf = __PRETTY_FUNCTION__; // gcc ok; clang ok; (1)
      static_assert(std::string_view(__PRETTY_FUNCTION__) == std::string_view("int main()")); // gcc ok; clang ok; (2)
      X&lt;strlen(__PRETTY_FUNCTION__)&gt; x; // gcc not ok; clang ok; (3)
  }
  </code></pre>
  
  <p>Clang 8 compiles it, but GCC 8.3 dos not. See on <a href="https://godbolt.org/z/uQbRp4" rel="noreferrer">godbolt</a>. GCC fails on line <code>(3)</code> although lines <code>(1)</code> and <code>(2)</code> are ok.
  If I am able to declare <code>pf</code> in line <code>(1)</code> and use <code>__PRETTY_FUNCTION__</code> in <code>static_assert</code> it means that the expression <code>__PRETTY_FUNCTION__</code> is core constant expression. And if I'm not able do declare <code>X&lt;strlen(__PRETTY_FUNCTION__)&gt; x</code> it means that <code>strlen(__PRETTY_FUNCTION__)</code> is not an integral constant expression.</p>
  
  <p>So why <code>strlen(__PRETTY_FUNCTION__)</code> is not an integral constant expression? Is it implied by the standard, or is it a GCC bug?</p>