<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/138257>138257</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Statement expressions allow jumping past initialization
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          AaronBallman
      </td>
    </tr>
</table>

<pre>
    In C++, both Clang and GCC diagnose when a jump statement will jump over an initialization. However, statement expressions seem to be allowed to do so:
```
void f(void) {          

 for (int i=({ goto ouch; int x = 10; x;});i<0;++i)

ouch:
  ;
}

void g(void) { 
  ({ 
    goto ouch;  
    int i = 12;
  });

ouch:
 ;
}
```
https://godbolt.org/z/Eda59KqPT

It's possible that this is intentional given that statement expressions tend to be hidden behind macros, but this seems inconsistent and somewhat dangerous to allow.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJxsU8tu2zoQ_ZrRZhBDGtkWvdDCj6vboJsC7Q9Q4lhiQJGuSNlpvr4g5SZNGoOAyXmcczQP6b3uLXMNmwNsTpmcw-Cmei8nZw_SmFHarHXqV_1o8Qh0SOeIrQsDHo20PUqr8P_jEZWWvXWe8TawRYlP83hBH2TgkW3AmzZmsbkrTygtaquDlka_yKCdXeEXd-MrTxH-LY2fLxN7r5316JlHDA5bRmmMu7GKL-XQOyj3kO9hm99Pvr86rfAMJOIFaIdQHfD1F4PzPZ7dhEBC24AayhOQiFG9Cw7d3A1QHjD6nhHKExZ5fD9DeYDqBLSD8qChPEbrUhgdjQl4SU4UGN35PqYkV9LVf9C1BC7s6Y7vRfwxJqGLGFpwEV_F_EP9jvmv0gwhXHyMoQao6Z1qnQkrN_VAzQtQ85-Sm93Xn99-LIiPAajyeHHe69YwhkEGDIP2GI8NbGP_pMFeX9ku7s8bGNiqewMHrRRbbHnQVuEou8n5NFjzHTs2O8J3znrtI0maNO9GvkUGJW3Pk5t9BEzjsMpUXapduZMZ10W13haiqoo8G-quK7ekRFvK9XkrBIt8rdbiXKhyU6zPVGS6ppw2-SangnJBu1UpWHTFWVbVTqiKOljnPEptVsZcx1iqTHs_c12UgjZVZmTLxqcdIrJ8w-QForhSUx2THtq597DOjfbBv8EEHQzX3z8tV_qqtDPa9niRPnzYmWyeTP2hmzoMc7vq3AjURJb738Nlck_cBaAmafNAzV38tabfAQAA__-NOD_p">