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

    <tr>
        <th>Summary</th>
        <td>
            [LLDB] Operators <= and >= return a wrong result when comparing with a floating point NaN in expression evaluation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            lldb
      </td>
    </tr>

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

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

<pre>
    Operators `<=` and `>=` are defined through `operator<` ([Scalar.cpp:857](https://github.com/llvm/llvm-project/blob/7812fcf3d79ef7fe9ec6bcdfc8fd9143864956cb/lldb/source/Utility/Scalar.cpp#L857)), which in turn calls a compare function. If the compare function returns `cmpUnordered`,  `operator<` return `false`, which gets negated and operators `<=` and `>=` return an incorrect value `true`. 

Source file with 2 comparisons, to see the operator results from the compiler:
```
#include <limits>

int main() {
  float fnan = std::numeric_limits<float>::quiet_NaN();
  double dnan = std::numeric_limits<double>::quiet_NaN();
  bool float_comparison = 1.0f <= fnan;
  bool double_comparison = 1.0 >= dnan;
  return 0;
}
```
LLDB log:
```
(lldb) expr float_comparison
(bool) $0 = false
(lldb) expr double_comparison
(bool) $1 = false
(lldb) expr 1.0f <= fnan
(bool) $2 = true
(lldb) expr 1.0 >= dnan
(bool) $3 = true
```

Maybe operators `<=` and `>=` should analyze result separately, like in [APFloat.h:1240](https://github.com/llvm/llvm-project/blob/7812fcf3d79ef7fe9ec6bcdfc8fd9143864956cb/llvm/include/llvm/ADT/APFloat.h#L1240).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VU1v4zYQ_TX0ZVBBIvV50MGJa6BAmhbY7jmgqJHELk2qJLVp-usLknaSJl5selnAkCyK8_TmPc4Md07OGrEn1Q2pDju--cXY_ssm1TruBjM-9b-taLk31gGpc8JuCTuQOgeux7Tw82XBIow4SY0j-MWabV7CBnMOD5F1DoS2pLr5JLjiNhPrSti-rRpSHQhtF-9XR9ie0COhx1n6ZRsyYU6EHpX6ern9tFrzJwpP6HFQZiD02LQFncTExqbDqZmwQ1EPYpxEO41dUbK2LruqFkMEGMPNmc0KJPT42Usl_ROhx1eUKLsLnGgXf7fwuEixgNTgN6tBcKUccBDmtIacp00LL43O4JcJ_ILvXoDFEBj1E6f1szZ2RItjUI_ewhWRUkB4MXHl8Lwx0ZjRO9A4c49jNMF80J8zKNcgtTDWovDwlasNwzZvt_CZDEh-IPk-XT9FlWCSCuFR-gXoOTfpjHaBkjfgEGPWFxpg0W3KO5isOT3rIRXa4GxCr_PzLz1SJrVQ24hA2K2SJ-ldoP2KidQeTlzqcHpoB6S5SesAkzLcw6S5BsIO4PwYPsP2ejuhleLhAncbN0Y1wuu_Non-4Z7fJ0TCngFHsw0KYfw-Ytr5AcjBGJWIPrzoF8GLLJ8geRZzeBuUPnElCpKvkearoLPH-fMSaQ5XNb-7O9yAMvO3PWlTqXSAf6_2HfvnXYFmtISWeSSXTuxVkHfZXEMpvofyTrMrIDSCxEP9LYz_KHgFgr2FeCNQvP7Knwb8cAW6xWwqFC1XT__guVDA4cot96ieQkUp-QVDqyHVzf73Y1A9WwjbF7TMf2CTjDjnonxZ2B_-CNdnWpTdRV60y3Zjz8aOdXyHfdEUeVe2dV3tlr6bSlazihZFm7fIm26qClaGf3nTta3YyZ7mtMwZzYuKFTnLuBBF29Sia1taDtiRMscTlyoLLDJj5510bsO-rbqy2Sk-oHJxfFGaPKZhkNk-yjBssyNlrqTz7gXAS6_iyAtlQKoDvJpx6WBF79IBufRNeLRGzxfXHhfUl26o59QeeSqT8Lya0LLu-X3wMhw5dC6MAgwdl4epsNus6v-3mTF1R-gxZv9vAAAA___hf1Yo">