title: Why this constant expression is not constant
body: <p>I have the following C listing:</p>
  
  <pre class="lang-c prettyprint-override"><code>static const int constant = (0 | ((((1 &lt;&lt; 6) - 1) &lt;&lt; ((((0 + 8) + 8) + 3) + 7)) &amp; ((1) &lt;&lt; ((((0 + 8) + 8) + 3) + 7))) | ((((1 &lt;&lt; 7) - 1) &lt;&lt; (((0 + 8) + 8) + 3)) &amp; ((0) &lt;&lt; (((0 + 8) + 8) + 3))) | ((((1 &lt;&lt; 3) - 1) &lt;&lt; ((0 + 8) + 8)) &amp; ((0) &lt;&lt; ((0 + 8) + 8))) | ((((1 &lt;&lt; 8) - 1) &lt;&lt; 0) &amp; ((1) &lt;&lt; 0)));
  
  int main(int argc, char** argv)
  {
      return constant;
  }
  
  </code></pre>
  
  <p>When I am trying to compile this with GCC-9.1 using this command line:</p>
  
  <pre><code>gcc-9 -Werror -Wpedantic main.c
  </code></pre>
  
  <p>I am getting this error:</p>
  
  <pre><code>main.c:1:29: error: initializer element is not a constant expression [-Werror=pedantic]
  </code></pre>
  
  <p>Why is that? Is this a compiler bug? Clearly, <code>constant</code> is initialized with a constant expression.</p>