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

    <tr>
        <th>Summary</th>
        <td>
            _LIBCPP_DISABLE_NODISCARD_EXT should not affect _LIBCPP_NODISCARD_AFTER_CXX17
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          higher-performance
      </td>
    </tr>
</table>

<pre>
    This is a hybrid bug report/feature request.

The `_LIBCPP_NODISCARD_AFTER_CXX17` flag in libc++ is defined as follows:
https://github.com/llvm/llvm-project/blob/3c355e2881887fea6f4b31e26b68aefa4d216fd0/libcxx/include/__config#L867-L871

Unfortunately this has 2 issues:
- `_LIBCPP_DISABLE_NODISCARD_EXT` now controls both standard _and_ non-standard extensions to the `[[nodiscard]]` annotations, which is contrary to what its name would suggest.
- It is impossible to turn on standard C++20 `[[nodiscard]]` without also enabling non-standard extensions, which can make valid C++ code fail to compile, and thus makes migrations to C++20 unnecessarily difficult.

Could the conditions be changed to alleviate this? I think they could be changed to something like
```
#  if _LIBCPP_STD_VER > 17 || !defined(_LIBCPP_DISABLE_NODISCARD)
```
if backward compatibility is not needed, or something like
```
#  if _LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD_AFTER_CXX17) || !defined(_LIBCPP_DISABLE_NODISCARD_EXT)
```
if backward compatibility is needed.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVdtu4zYQ_Rr5ZWBDoq5-0EPiCxAg2C6y7iJvBimOJDY06YpUHP99h3ISZ9tugC1qDERR5MycOXOxsPJc73rlgIRDfxaDkiDGDgY82sFHbNsi9-OA9OHPEZ1fRPE6im8uz12PEBXx_v7udvX16_7Lb-u7b6ubh_X-ZrvbPOxXj49JSefQat6BMqCVaCJ2SxL8SWyVQQncQWu1ticXpa-Ge--P045tSTrl-1EsGnugjdbPb8v8ONg_sAkohbaClrRJ8xxZVSVVVRLyos1EmiArRFFxbHkmWVK0Mg4GCMvLC70o0-hRIr3t9401reoilt5XRTm_r8rkY7i_m5Y4GQ33qM_gA209gWcUjCNu3tHPP5JClNzc3m8-kLN53AVSjD0B-fOD1Q6E9T04z43kg4Q9rXu6YObvn_DFo3HKGgfeku-J-Ci_JTFWKtfQpShfByHb3BjruQ_XI7aCU6-aPlA--ePDOdg49dyD8g4MPyCc7KgluLHrrkmew50PWupwtM4poXHyPQ4GrLmiXV1SyuJPIZ0oiXb0wLWzgIYLrUz3sxivoBtu4MCfEJ65Vu--KBCJ0HKlAyIqjKPSGJTIEpEzukmHnqobLjSEe1egozHYoHN8UJRJqdpWNaP-sbhXEyOBaWJNqosVQbuem47KlgxyrfFZUTlMxRClW7gLb-YpqJ1JL1j4UcXZA4YrHTXDE776I9ouctmyFEC18FZB33br_ffNA0TpBpISonJFAhFLXhsoYtVPiy1iy3_1QeYFb55OgfZAH5EklFb-HPJNtQMGUQbTK7DD_wf6n4g3X_7WHR9HB1v-WrRTa_2niKdoFzOsk4J-WZqzeCbrVC7TJZ955TXWn3oF10_JDtTxtqWhBJ9Oxdk46PqXp9zrnGHbvMrLfNbXZZEsmySXTJRZkiUo4ixulixuC1zylomZ5gK1q6euXM9UzWLGkphlLE5ZHC-QoyzLqojjvFzybBllMR6oqxbB8cIO3WyoJwz0l-DoUCvn3fWQ01ToiLs3-3ykHh_qXnU9DvMjDjQvD9w0OJuQ1xPsvwDtEQa1">