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

    <tr>
        <th>Summary</th>
        <td>
            Built-in analysis fails to converge on simple loops
        </td>
    </tr>

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

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

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

<pre>
    A number of (likely-related) simple loops cause the analysis to fail to converge. Below are a series of examples reduced from real code. I suspect they are all the same problem:

```
TEST(PointerNullabilityTest, NonConvergeBools1) {
  EXPECT_TRUE(checkDiagnostics(R"cc(
    bool cond();
    void target() {
      bool a = false;
      bool b = cond();
      while (!a || !b) {
        if (!cond()) return;
 if (cond()) {
          if (a) return;
          a = cond();
 } else {
          if (b) return;
          b = true;
        }
 }
    }
  )cc"));
}

TEST(PointerNullabilityTest, NonConvergeBools2) {
  EXPECT_TRUE(checkDiagnostics(R"cc(
    bool cond();
    void target() {
      bool c = false;
      while (cond() || cond()) {
        c = (3 == 4);
      }
    }
 )cc"));
}

TEST(PointerNullabilityTest, NonConvergeBools3) {
 EXPECT_TRUE(checkDiagnostics(R"cc(
    bool cond();
    void target() {
      if (cond())
        ;
      while (cond() || cond())
 ;
    }
  )cc"));
}

TEST(PointerNullabilityTest, NonConvergeBools4) {
  EXPECT_TRUE(checkDiagnostics(R"cc(
    bool cond();

    void target(int m, int n, bool b) {
      bool g = m == 0 ;
      while (cond() || cond() || g) {
        bool c = m == 0 ;
 g = false;
      }
    }
  )cc"));
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVluPszYQ_TXmZZSIDJfAAw-bm9SXT5-2qdS3ysBA3DU4ss1u8-8rQ8hlN7RSpK0aRWAYzznjwzEMN0bULVHGohWLNh7v7EHp7NTwtvRyVZ6yF2i7JicNqgKGiRRvJE8zTZJbKhmmYERzlARSqaOBgneGwB4IeMvlyQgDVkHFhXTnQrXvpGuaw4qk-gCuCTgY0oKMw6e_uMMyoKnsCiqh0qoBTVxCoUqawy9gOnOkwjqK05AvZc9neENw1CqX1LDghfkb5o_H2D__-8v99tc9w-SnEq0l_aOTkudCCnvak7EM1_BDtetzpSulpFm4ZbLlakgH2P7-c7ve_7F__W3LMCkOVLxtBK9bZawoDMPklSEWBcNkzADIlXKLaEt3F1MWrK6xdyVKsFzXZIfoLdklmQMLNlBxaegu-xzO-_AEA8DHQUiCPrTgwJZrtlwDw0X-gA5AVOepN3iYgibb6faKPEy7n_MFa0TjjxAuPz5ZPltugKShaeT8H5EHYazuPssGDvpKcg3dXDBM3YPEYXEXgMuMJx2F_wtHFZOOurjlij965l-e9oDJMAncwI3Dr2acUPubxA7uC_3PtX6wSz7Z8DnxR9Vus7_fuuE3WndKVNFaaFwxbtC6wfDKmzJ23ZuwGR3oP6XweKd-6PObDfSQp57cW0-_asavmFdmQZkGKfcoW8Rp7PtxEPneIYuqRVRWCwzKaBlHechjitMwrYIiisIqQE9k6GPgp5gu4ggxnYdVmhMGFS3jMPHLkIU-NVzIuZTvzVzp2hPGdJTFyyQIPclzkqZvFRALyduaBS8lt7yS6sNVHm08nbnUWd7VhoW-FMaaK5gVVlK26oS0M9FeWwTXH5jbBgFUe9dXeJ2W2cHao3Gfdtwx3NXCHrp8XqiG4c4xnE-zo1Z_UmEZ7vraDcNdX_7fAQAA__-gkGpD">