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

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] performance-noexcept-move-constructor do not handle conditional noexcept properly
        </td>
    </tr>

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

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

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

<pre>
    Hi!

It seems that this issue has been discussed in https://github.com/llvm/llvm-project/issues/68101 and partially resolved. The problem is now observed in clang version 19.1.0 and possibly in the trunk as well.

To summarize, I have an external class that does not have a noexcept move constructor. When I try to mark the move constructor for my class using type traits, the check fails.

Previously, a workaround solved the case where the class in question had a template parameter. This allowed the check to allow the use of type traits with noexcept. Maybe the check should only be triggered when the user explicitly specifies noexcept(false)?

```cpp
#include <type_traits>

/* External class */
struct NotMarkedNoexcept {
    int x;
    NotMarkedNoexcept() = default;
    // NOLINTNEXTLINE(performance-noexcept-move-constructor)
 NotMarkedNoexcept(NotMarkedNoexcept&& rhs);
};

struct Complicated {
 static constexpr bool NOEXCEPT_MOVE = std::is_nothrow_move_constructible_v<NotMarkedNoexcept>;

    Complicated() = default;
    Complicated(Complicated&&) noexcept(NOEXCEPT_MOVE) = default; // Warning

    NotMarkedNoexcept inner;
};

int main() {}
```

```text
[<source>:14:41: warning: noexcept specifier on the move constructor evaluates to 'false' [performance-noexcept-move-constructor]](javascript:;)
   14 | Complicated(Complicated&&) noexcept(NOEXCEPT_MOVE) = default; // Warning
 |                                         ^
1 warning generated.
Suppressed 1 warnings (1 NOLINT).
```

https://godbolt.org/z/E4E65jdhh
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0VlFvozgQ_jXOy6gRmADJQx5omugq7WZXuup236oBT4K3xuZsk5T99ScDadPt6lSddBVSYzye-eabbzygc_KoidYsvWXp3Qw7Xxu73lNVC5yVRvTrPyTjMYsKFhX3HhxR48DX6MHX0oF0riOo0UFJpEFIV3XOkQCpofa-dSwpGN8xvjtKX3flvDIN4zulTpd_N601P6jyjO8GZ47xXbaMoxhQC2jReolK9WDJGXUiMYeHmqC1plTUgHSgzRlM6ciexrCVQn2EE1knjYZ4NY_n0ejLOCdL1QcjXxN42-knQAdnUmo-pvhgwHVNg1b-JMY3cA81nghQAz17shpV8O8mCoShEN9PRqANPVfUemjMiaAy2nnbVd7YOXyrScM9eNuDN9CgfRow_GoIB2Oh6acgnZP6CL5vA1iU3gVI4VhVU_UEB5TKTcC_WjpJ0znVBxuEs7FPaE2nBYy8jefQEZxrsjQuhyhSw98dOR_oqlEAgqemVegp0I8NebKBdekAlTLni68Bgzfjy-FV5wjM4RownKWvX3iZw2fsS7o67mrTKQFGqx7ChpXHI1kSAaS--LRAz62SlfSqB9dSJQ9yIH70yvjygMoR4yuW7EY6WBaNT9W2YckTqSvVCQKWbAK-x4nQZDsdCCItYPu2yowPG1Ex1gf2xn9G-0Rif6k0y29ZVAAASO3hmSWX5TtTxpeMr4AldyDogJ3yr8Zji8D-y6f7_cN--_3h0_1-y_iyJXswtkFd0c0l3ZugmZsrzYS8o-K3AX_zLmM8A1u7ga0Qn-V304-XNDemCXyjJ3FJ0Hn0shqlSs-thdIYBfsv2--b7deHx89f_toOqTkvQssnhXSP2vjamvNjAPz4AliWih5PLNm8B5dsX5AEVq5g_Bt5b83erLLhWV1L5Q3k9z4vpfiGVkt9fAXzvvRSa7LvOQw6aFDqC-T8NuxeSfIXhXp69mGd3rJk40xnKxqIKOIFS4pFzJICzhOapHi9Yy6NYMHo398ldELVoScXupTxfOqSHFh6-zFlpXfh4csfeEJXWRlqVIRMR8kBxAtg-eb_LsEQ46N_LA0tHV84gyNpsgFLuCn_7NrW0jChXixCmy_jqfkYX83fF-uXUWZEaZSfG3tkfPeT8d12sc3SH6KuZ2KdiFWywhmt4zxZ8SxLeTSr17iiZZlnB1xkWVpSXGHOscwXZYYRL0U1k2se8TTicRytkpRH8ySN4zwVSxHz9HA4rNgiogalmoepGWLPhnm5jnmWR3ymsCTlhkHO-TADb7wUPeM8DHa7HmZt2R0dW0RKOu9e_Xjp1fAJcHUsvYMPSQSEmSagFmqQn5BhkqB6VWprTUtW9bPOqvV__yqYEj2t-T8BAAD__58v0r8">