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

    <tr>
        <th>Summary</th>
        <td>
            bug: clangd: fix of 'modernize-use-override' leaves extra spaces
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          pavel-the-best
      </td>
    </tr>
</table>

<pre>
    ## Example
```c++
struct Base {
 virtual void f();
};

struct Derived : Base {
    void f() override final {
    }
};
```

Diagnostic `'override' is redundant since the function is already declared 'final' (fix available) [modernize-use-override]` is shown on `Derived::f`, and fix `remove 'override'` is suggested.

## Expected behavior
When applying the suggested fix the relevant line turns into:
```c++
    void f() final {
```

## Actual behavior
The relevant line turns into:
```c++
    void f()  final {
```

Note the extra space before `final`.

This seems to be a problem with `clangd`, because `clang-tidy -config="{Checks: '-*,modernize-use-override' }" --fix example.cpp` behaves exactly as expected: no extra spaces.

## Context
```
$ clangd --version
clangd version 17.0.3
Features: linux
Platform: x86_64-pc-linux-gnu
$ clang-tidy --version
LLVM (http://llvm.org/):
  LLVM version 17.0.3
  Optimized build.
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVE2vqzYQ_TVmMyICEyAsWCQ3zer1Y_HULitjD-DW2Mg23OT9-spAcm_uu6_qohJSyIx95syZMzDnZKcRa5KfSH6O2OR7Y-uRzahi32PcoPNRY8StJjQjNIOfrmwYFZLkTJIjKZL14YSewrNEnbcT93BiDoGUWxBmaf3EFMxGCmgJPRBakWzLkvL89v4e5IxWziiAZMePgABPWGBmtFYKhFZqpp4PBvzvC93Zv697lqzTxnnJIWRoeYcltATpwKKYtGDag5OaI_geoZ0099LokGfKIhM3EMgVs4E5LRdC4T6hh1Zegc1MKtYoDLRJfhqMQKvlN4wnh_GjYH4mRRIwXW9eNRgdGG2CkOxIsmO7UHwBpgUEYFIkFgczIzwTv-NMXYfOo9i97_gx2BG5RwEN9myWxq7ZP3rUwMZR3aTulm4fKEvJELGocA6SKKkR_GS1A6m9CST_xSffTfDD4D6dz8b2yBczPXP9-j9y-U9kfjF-dQBevWXgRsYRGmyNxTCLde5F8iT31z5MAnFw4A00CAxGaxqFA7xK34d7XDHdiW22DXI2OXzEYy_FDWJudCs7kp0JpaQ8vfTI_3ZhSwgtY0KPhL78wFbBh2W4BnEcJojrRu_4OAafLJKiC2Hu1Q1YeF2tEeC1ed-s-8xJL0Z7vPrPdaN7WNuDOJ7ROmn0mtmiWwzScpfssjV1QeYni0t7SurpuoZ_U8y3xg4hfD0Ufxb7eOTxciDu9PSh4Kbbc9EvX37_OWxl7_0YHEIvhF6Umoedsd3yr3oYB2A5_RlBgF9HLwf5LazPJNVjwe7NR6LORJVVLMI6LaqKHqoqyaO-zlOR8FwURcp4lZc0S1K-b4vm0GKaNdk-kjVNaJamSZEW-YHmO7bnVc73tOFF2VQiIfsEBybV7k47ks5NWJfpPq0ixRpUbvm8U6rxFZZk8Ex-jmwd7sTN1DmyT5R03r2heOkV1s3UBXk3R2bHZedNG1z2Y3sp3Bz05pNosqoOKruHzJ30_dTsuBk2zbefeLTmL-Se0MtC1hF6WZr5JwAA__8teP2j">