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

    <tr>
        <th>Summary</th>
        <td>
            Clang's `-Wmissing-prototypes` isn't helpful for explicitly `extern "C"` function definitions.
        </td>
    </tr>

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

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

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

<pre>
    I really like `-Wmissing-prototypes` for a lot of stuff, but it is firing on one pattern where it seems pretty unhelpful:

```
toolchain/parse/parse_fuzzer.cpp:18:16: error: no previous prototype for function 'LLVMFuzzerTestOneInput' [-Werror,-Wmissing-prototypes]
   18 | extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data,
      | ^
toolchain/parse/parse_fuzzer.cpp:18:12: note: declare 'static' if the function is not intended to be used outside of this translation unit
   18 | extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data,
 |            ^
      |            static
```

The code in question is following LibFuzzer's documented guidance to define the fuzzer entry point:

```cpp
extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data,
                                      std::size_t size) {
```

The warning is technically correct that this definition has no prior prototype. However, by making it `extern "C"` there is a very clear signal that this is a known C ABI external entry point that we need to define, but may not have a header to declare for us. And suggesting to add `static` when the function is declared explicitly `extern "C"` seems pretty confusing.

Ideally I'd like to just disable this warning for `extern "C"` functions as it seems unlikely to be correct. If folks are specifically interested in retaining that, I'd love a flag to control that narrow behavior.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0lc1u4zYQx5-GvgxiyLTlj4MOjlOjBrboZdE9LihyZHFDkyo5tNd5-mIkOc6i2QYosEIgxsZ4Pn4z86dKyR49YiXKR1E-TVSmNsRKt8obh1FP6mCu1QEiKueu4OwzglgWD19ONiXrjw9dDBTo2mESywKaEEGBCwShgUS5aYTcQZ0JLIFN0Nho_RGCh-AROkWE0cOlxYhskRBPCbqIRFfIvkXXNdmJ-VYUT6K4vZfF-Nd_pBCcbpX1Qu47FRPezq9NfnnBONVdJ-bb2ZpfSzHfAsYYIv_jA8c625A56FhHX0OTvSYbPAi5-vTprz_2vavPmOhPjwffZRJyBaJ8fPgyeJO7d5GUT0OSADBbg1jtAL_3JQspd0JKsJ7gZwHWOvhEkH3fIgO6VVHILRhFSsjdq2eA3rMof_sfROQAgpBPg9qpiFx1IkVWc5W2AWrxjsQmtufM0Rs0QAFqhJzQQMiUrEFuPrU2AUXlk1P9z7K39MthsNM3zyuSO6U3z1jie0M1vD-3CDoYBOvh74zpVn4TnAsXHuRPth6SZWJggs4n9IQGjtka5TUyHYON9ThCZGNAT_EKXbCefjbc3KP-m18zMB89iQxnNt8m-4JfCfgQcgNi9fgBsIuKntFw-1G33upeOXSIETUBtYqG4eix2J5pq9KwjDbE-yZO4fdwwTPD3UF9hZN67h0TK9CPWFh7aFCRBArOGK-gHaoIjEK5N2F7g2cfLh52sH08jEOo3NuuDPYXBI_DhA89vInZSV37HWjVGUFBi8pgHMyGBWINyWkKW28g5eORZ8cf2UIZw-mPs7csWPz8vxZs9GMAv3fOakvu-n7RPyimDr7JLEHTt005mEG7D0KuzKDgFOBbTgTGJlU7HMDcGse5vxvrlmACle5qnT27dNdRB8Y-T-HQ8J48J2AeqUNtm3EUWDkiJl4T6yEiKdsHZuZMeEw09Gwbp3puOniKYWykVzGGC9TYqrMNcTox1dxs5hs1wWq2mq3kZrNelpO2mmO9WUq9XpgG66VZrhUWRq31amVmaoHzia1kIRfFspDFfLGQ5bRWm1IVcl4WRpeFLMWiwJOyburc-TQN8TixKWWsNovZfD1xqkaX-stTSu2UPzKr8mkSK7Z_qPMxiUXhbKJ090CWHFa7wXyV_utCtckLuSIYr8K-OR_NxOsg3TcsTSc5uqol6hLvtdwLuT9aanM91eEk5J6TGw9O4RtqEnLf15qE3A_lniv5TwAAAP__yCCobA">