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

    <tr>
        <th>Summary</th>
        <td>
            [FR] clang-tidy check for implicit inline
        </td>
    </tr>

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

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

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

<pre>
    The [`inline` keyword](https://en.cppreference.com/w/cpp/language/inline) is widely misunderstood. On top of that there are many instances where inline is implicit. I think it's therefore best to eliminate the `inline` keyword from code where possible.

I propose a checker that checks if the `inline` keyword may be required in the context that it is in and propose a fix to remove it where it isn't.

```c++
template <typename T> inline T f()
//                    ~~~~~~
//                    ^ Templated functions behave like inline functions.
{
    return T{};
}

template <> inline double f<double>() = delete;
// ~~~~~~
//          ^ Deleted functions are implicitly inline

inline int g(float a) // May be OK, no diagnostic.
{
 return static_cast<int>(a - 5.F);
}

  inline int g(double) = delete;
//~~~~~~
//^ Deleted functions are implicitly inline

class C
{
  public:
    inline C& operator=(const C&) = delete;
//  ~~~~~~
//  ^ Deleted functions are implicitly inline.
 inline int Get42() const { return 42; }
//  ~~~~~~
//  ^ Functions defined inside the class are implicitly inline
    static constexpr inline int C_STATIC = 42;
//                   ~~~~~~
//                   ^ constexpr static is implicitly inline 
};

constexpr inline int Get42() { return 42; }
//        ~~~~~~
//        ^ Constexpr functions are implicitly inline

static constexpr inline int NAMESPACE_STATIC = 42; // OK

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyclk1zozgQhn-NfOmKCwvwx4FDgsPU1NRstnZ8nxKiMdoIiZWaJL7sb98SYJvZZJKdpSh_INH9vk83QsJ7dTSIGUvvWLpfiJ4a67JCaGk_oVuUtjplhwYhjK8jZbQyyNYRPOLp2bqKpXvGtw1R51l8y3jBeIFmKbvOYY0OjcSltC3jxTPjhew6xgstzLEXR2S8mOLxHSgPz6pCfYJW-d5U6DxZWy3hwQDZDmwN1AgCatAhCIfQCnMCZTwJI9HD8zAwBgzRVNtpJRUt4TNQo8wjKGJ848cItXUIJXoCsoBatcoIwjAGb9mE2tkWpK1wytNZ71WpccmiPYtux8_P0DnbWY8gQDYoH9GNooc_HlT98wStOEGJ4PCvXjmsQJlhrrSG8IXGMIoGYwaEqWapavUSXDhs7ROGSROKMNswvqEfRLJ1NJ6S8btwDlcJ204HAizO6dShES3CgcX3Z6IHqBnfMr6bogyVhjeOv4fjo1ksvYfDlLOCujeSlDUeSmzEE4JWj5daXgbPNjaT5hDHIfXOwCFc3OxZfHees597nrubeapsX2qEmsX5-JPF96NJYPEeKtRIeI05mnnPX3C1H-6aewrNeu5GfZqSz-Wdm9YQHBnf1toKAjHIGBN8HZvj4QvjORgLlRJHYz0p-YrJBMSTICW_S-GJxbkyNFoTcAPpsghl_AkqgH-pmci8x-Q1kv8JQmrhPeSv6tz1pVYyLDCXwk8qc8bXYDt0gqxjcViMpDWehoH3C_lmJX9B-IR-zusTUsKnDhplsM3duSQJZ_EdXHF_oKK4ZK-wVmZYEryqxjVqBPUOz4Bo7IFRCL50bq40__7tcHv4nA98BmUfPLH_6bEOuq_ppvyztfgiEq69d8k8dsBbYudYPwb6kd4gMr-k-YXufI_nb7df77_9fpvfv-J6foYfvry5Ci-qLK528U4sMFttoihKd5vtatFk8RqlTNLdukyrdB3VIolX9bZMa15v09WGL1TGIx6vVqt0lSS7ZLWMt-s0ksiTtSwTUSYsibAVSi-1fmqX1h0Xyvsesw2Pd5uFFiVqP7z3OZfhnXxDqjoxzsM-wGXhppuyP3qWRFp58tcwpEgPO4biD5bu4Xrz-KKD2roLyQnSonc6-3GbcFTU9OW0Owixp6-bztk_UVLYHgS9nvFikPxPAAAA___MPaHg">