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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect result in clang++ OpenMP for parallel loop increments > 1
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    I posted this initially to https://stackoverflow.com/questions/77385488/clang-openmp-loop-continues-counting-beyond-loop-condition-limit

It seems that clang (tried <= 17) miscompiles the following simple `-fopenmp` program:

```c++
#include <iostream>
#include <omp.h>

using namespace std;

int main(const int, const char **) {

  const size_t n = 13; // triggers the issue
  // const uint32_t n = 13; // fixes the issue

#pragma omp parallel for
  for (uint32_t i = 0; i < n; i += 2) { // `+= 1` fixes the issue, as does `+= 2lu` or `+= 2llu`; `+= 2u` does not
    cerr << "i = " << i << ", n = " << n << endl;
  }

}
```

Despite my `i < n`, where `n = 13` this prints an infinite series of numbers on `clang++ -fopenmp`:

```
i = 0, n = 13
i = 2, n = 13
i = 4, n = 13
i = 6, n = 13
i = 8, n = 13
i = 10, n = 13
i = 12, n = 13     <- this should be impossible
i = 14, n = 13
...
```


This happens with clang++ 11, 14, and 16, but not with GCC. It's also fixed if `-fopenmp` is removed.

The issue dissappears if I do `+= 1` instead of `+= 2`.

According to https://stackoverflow.com/questions/7448812/openmp-loop-increment, a "loop increment greater than 1" is legal.

The issue also disappears if I change the type of `n` from `size_t` to `uint32_t`.

And it disappears when changing to `+= 2lu` or `+= 2llu`; but `+= 2u` does not fix it.


## Observation regarding warnings

With `-Wall` and `+= 2`, `clang++` prints these warnings:

```
clang-openmp-for-loop-test.cpp:49:3: warning: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 9223372034707292167 to 2147483655 [-Wconstant-conversion]
  for (uint32_t i = 0; i < n; i += 2) {
 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clang-openmp-for-loop-test.cpp:49:3: warning: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 9223372034707292167 to 2147483655 [-Wconstant-conversion]
  for (uint32_t i = 0; i < n; i += 2) {
 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clang-openmp-for-loop-test.cpp:49:3: warning: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 9223372034707292167 to 2147483655 [-Wconstant-conversion]
  for (uint32_t i = 0; i < n; i += 2) {
 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 warnings generated.
```

There are multiple things I don't understand about these warnings:

1. Why is the same warning (at same code position) emitted 3 times?
2. Where is the value `9223372034707292167` coming from? It's a `-Wconstant-conversion` warning, surely it should warn about some constants I actually use. The value `2147483655` is the `maximum 32-bit-signed integer + 8`.
3. How comes this type-related warning goes away when I change `+= 2` to `+= 1`? Surely the _type_ of those two literals are the same?

I have the suspicion that these warnings accidentally reveal some internal transformations that clang does, and may give a hint on what's wrong.


## Environment

Ubuntu 22.04.

```sh
sudo apt install clang14 libomp-14-dev gcc+12 libstdc++-12-dev
```

(The `gcc+12 libstdc++-12-dev` are needed just for `#include <iostream>` to work, as clang uses GCC's stdlib headers.)

Compile:

```sh
clang++ myprogram.cpp -o myprogram -fopenmp -O2 -Wall -Wextra
```

Run:

```sh
OMP_NUM_THREADS=1 ./myprogram 2>&1 | head -n20
```

---

Our understanding on StackOverflow so far is:

> Still, this is also a clang compiler error: clang initially goes to the implicit cast route, and then messes up the loop (it should either produce a compilation error because of the illegal code, or handle it correctly as an extension like gcc does).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEuT27gR_jWYSxdZJKjnQYcZjZX1wZmttbd8nALJFok1CDAAKFk55LenGqAkyh7NJpVDLjul0lB49Lv766ZwTjYaccPmT2z-_CAG3xq70S1_KE192nyE3jiPNfhWOpBaeimUOoE30HrfO1Y8Mr5jfOe8qL6ZA9q9Mse0Mh3ju38M6Lw02jG-Wy6L1Xy2WjG-q5TQTWJ61F2fKGP6pDLaSz2gSyoz0GOTlHgyur5s15IIJUp20rPsmWWP8fujB4fYOfCt8BAoA-MrbyXWwIotK54hXzK-hk66ynS9VEiHEfZGKXOUugEnu14hsEWW7KNUbJFBb01jRUcKTvixRRY_FeNP9ImrvJC6UkONxFMa5y3S1Q9vbZuuT9vrXvgeHAmiRYeuFxWC8zUrnqYnpPbQCakZX1VGOw9Se8a3EH9UrbDA-GP4rIEtb-7CeMrJf-KrBw3BKgUrniA6D7yVTYM2WkY6N-D55nggEhik9gV_m8Refsef7l_0761oOgGm66EXViiFCvbGnrnsDYm_utCXgX5G5OlxC3p85E-0wUclz7zJJXEnJ9f9KArfgnBQG3STk1wNdJYYT9bCYtDquhjOhdva-LPEABVaG0NsC4zzKDLj_LwmJ5skgv7xgD4_oK7Vxd0AbPl8Y73Lz3PsTXef0fXSI3QnEvlsLBJ-C8cWbYjri7sWWUzk3krtHQgNUu8pqxEcWokOzB700JUUC0bT3ZBTMdhhkh_38mKM1tF_F7XzYrrB723M7m0s7m2s7m3kd7nnN-zJlWS1JFrGtWZQNZQIsuuNc7JUeHP5DRHTNH3HQ_H7CxFvRd-jdnCUvoWpYfOcqEbaQteQB33LwVPIxeN_225T-OgZXzoQypkQ5TXI_Y-FSzqw2JkD1umtAGM6QC2dI0GEdXT9I9TmxwyS2nkUNUXDJBHYIrsh-VhVxtZUuf57OJjNVityxG6KA1JXFjuMlU1QrtAyXJahsSg8Wqr2GnLKJelAYSPUHV2DpWp5q2_VCt1gKBD-1OOopQ6lw5qOfsRSGfIlGOdcmX4yga5B-imHY4s6chgN8x-XHHL3vbJD3gbp058Di_GC8QJeSof2IMi-YLER0S9HYbXUjZte-ErRRDHzVShFPCjgbr1M5r9N_YiIoWj4Fh1eKb9bB26gfm9sdLNH59Oq71nxOFuz4rFgxeOZID0SHstKekKdA1pHOkXH8OWgQ8NSgzIk2zJYeLIcYHE5utjBQagB4-U150Wx5FkxW2ZLvub5Ilzm-Ww5WxWL-RzY_Cn5GpBOaJ9cmbP58_8IVON1Nv_wrz_7-8twfxnu_2G44pLS0KBGK_wVQN6CtS-huRAWoRuUl9RB-zZcJ0DRjC89DLpGS7rVIEoz-PdrR57C1_ZEFZ0qsxPd5SQZQPi4VJkaaSgJAwEpi530NKEU4GWHjhW7SI4TOZJxJBgdwxbZG26h8laZjliR51ixu0BtLJVv-WiRXUKIb8ENFtWJwGBsIWhvVNuZIHgkQQYSlR_CHDU4TOHLVLprdIxgTrKzRdaJ77IbOih4UkqfXIMPG6QIeYLVFZyKFH4xR1IpNMJE5dRjYlGRWy9mbQhdxFGcImpdkPEWDW5BLA9otYPPUV-S7pWIvxKM-tY4BH80oKRHK5QLEXL258U34_AGrTiMu4PrZUVpFwa52zgBUVWyRu2DySweUKhoU1LfaqHAW6Hd3tguIODNOEgQeu6rOnGCRh4QBLQ0URkNx1ZETx-t0c19gP2gD9IaHbqTye7v5aD9AJyn2Sx9EwldGxfcUBsQvQ_NlVAqipfPQMnSdH2Sz5IaD9BUNFrmnJadr8c5M8k57b7XZvLVlxgp71MgwLcIGrHGGv4YnI8lhhx8b4qNMXA09ts4S0XLDg4d9aXBfM7XSpbQoqCcTxlfT6XbxtH7XrdwttG0J-5O4whOhRsSc124zCGQvHAIfQwkX_G7t-IdA_026D9j__Lp19e___7p9csvv314fP7MiuccUsZ3V86czMEXObDlNugKiebZO1yTJJn-fBnspCpSDhoNn6lZfhmbZaDWXliQP7VWxQf47KVS5IP4OmacBMToj_H9hgW01ljCtbh-fW0TEt6bOBtfME84D9YMHs9p4qkadOjIv0MfTodGnPHVtb6h9C1a6K2ph4oyKrKPLWiQAEqsxOAwVgYEqUKrHko4sTIWWqFrhRCQ11qsvDpRfAkN-N2jDkCs5DektBgzeZ0-1JuiXhdr8YCbfLFeLVbFep4_tJs8r-bzqlxXOK_2WPP1usqXyPl6gfNqXVcPcsMzXuRZkeWLYp3naVFk-XKxzmflvBTlbM9mGXZCqlSpQ5ca2zyEOWKzzBar5YMSJSoX3pVxPsYqZ_PnB7uh80k5NI7NMiWdd1cKXnqFm4961BAsukFRGbgZAV961J9-Dbl4eUNyO_04oBDIHwarNrfTViN9O5TjmEV8x39Jb80fWHnGd0GNMHmRJv8OAAD__7nuA_w">