<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Nov 9, 2016 at 2:34 AM, Stephan Bergmann <span dir="ltr"><<a href="mailto:sbergman@redhat.com" target="_blank">sbergman@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 11/09/2016 11:12 AM, James Dennett wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
On Wed, Nov 9, 2016 at 2:06 AM, David Chisnall via cfe-dev<br></span><span class="">
<<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a> <mailto:<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><wbr>>> wrote:<br>
<br>
    On 9 Nov 2016, at 07:55, Stephan Bergmann via cfe-dev<br></span><div><div class="h5">
    <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a> <mailto:<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><wbr>>> wrote:<br>
    ><br>
    > What I observe with various versions of Clang:<br>
    ><br>
    >> $ cat test.cc<br>
    >> #include <iostream><br>
    >> int main() {<br>
    >>    char a[1/0];<br>
    >>    std::cout << sizeof a << '\n';<br>
    >> }<br>
    >><br>
    >> $ clang++ -Weverything test.cc<br>
    >> test.cc:3:11: warning: variable length arrays are a C99 feature<br>
    >>      [-Wvla-extension]<br>
    >>    char a[1/0];<br>
    >>          ^<br>
    >> test.cc:3:11: warning: variable length array used [-Wvla]<br>
    >> 2 warnings generated.<br>
    >><br>
    >> $ ./a.out<br>
    >> 0<br>
    ><br>
    > Is there a specific reason to not emit a warning/error about the undefined behavior in evaluating the constant bounds expression, 1/0?<br>
<br>
    I believe that the issue here is that 1/0 is *not* a constant<br>
    expression, it is undefined behaviour (typically, run-time trap).<br>
    We probably should have a special return value for attempting to<br>
    evaluate something that should be an ICE and finding that the result<br>
    is undefined, which would allow this to become a more helpful error<br>
    along the lines of ‘array length is an undefined value, this will<br>
    abort at run time’.<br>
<br>
    Currently, I believe that the undefined value is simply marked as<br>
    something that can not be evaluated at compile time and so this is<br>
    equivalent to:<br>
<br>
    int foo(int d)<br>
    {<br>
      char a[1/d];<br>
      std::cout << sizeof a << '\n';<br>
    }<br>
<br>
    This is valid code when d > 0, but if d == 0 it will likely trap.<br>
<br>
    David<br>
<br>
<br>
A constant expression that would give undefined behavior is ill-formed,<br>
</div></div></blockquote>
<br>
No, 1/0 is not a core constant expression, because evaluating it "would have undefined behavior as spedified in Clauses 1 through 16" ([expr.const]), so is not a constant expression. </blockquote><div><br></div><div>The language requires a constant expression there.  1/0 is indeed not such a thing, and hence a diagnostic is required.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> So apparently the non-standard C99 vla extension kicks in as David explained.  (Question is whether that extension can be disabled?)<div class="HOEnZb"><div class="h5"><br></div></div></blockquote><div><br></div><div>Right, the extension kicks in, and it's only standard-conforming if a diagnostic is issued (as it is by default).  In this case the extension can't work (the size isn't defined), so that shouldn't happen -- not because it violates the standard, but because it's nonsensical.</div><div><br></div><div>-- James</div><div><br></div></div></div></div>