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

    <tr>
        <th>Summary</th>
        <td>
            Overzealous -Wstrict-prototypes warnings on function definitions
        </td>
    </tr>

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

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

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

<pre>
    Consider the following, _foo.c_:

```c
int foo() {
    return 42;
}
```

Current clang (19.0.0git c3598b161a4d868b1cd10a7ee7ac37d68e5a36fe) with `-pedantic` or `-Wstrict-prototypes` produces a warning for this code:

```
clang -c -Wstrict-prototypes foo.c 
foo.c:1:8: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]
    1 | int foo() {
      |        ^
      |         void
```

The discussion in [[RFC] Enabling -Wstrict-prototypes by default in C](https://discourse.llvm.org/t/rfc-enabling-wstrict-prototypes-by-default-in-c/60521) largely focusses on encouraging users to write declarations as `int foo(void);` but I am interested in the application of this warning to function **definitions**.

The diagnostic message above is somewhat confusing as this is a function definition, not just a function declaration. More importantly, I believe there is no confusion about a function definition with an empty parameter list. In particular C17 N2176 Â§6.7.6.3/14 says [similar text appears in earlier versions; emphasis added]

> An identifier list declares only the identifiers of the parameters of the function. **An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.** The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied. [Footnote 147: See â€œfuture language directions” (6.11.6).]

I would take this to mean that a function **definition** with an empty parameter list effectively provides a prototype, and therefore that the warning is spurious in this case. It seems unfortunate to encourage users to hypercorrect their code to define such functions as `int foo(void) { return 42; }` when the `void` doesn't add anything in a function **definition**.


I also tried to find the chapter and verse of the standard saying that this scenario is â€œdeprecated in all versions of C”. I guess this is based on Â§6.11.6, which says

> The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.

Based on the two â€œâ€¦empty list…” sentences in the paragraph quoted above whose footnote refers to Â§6.11.6 and the fact that the obsolescent feature we're trying to get rid of in Â§6.11.6 is non-prototype declarations, I think this sentence intends only to refer to the latter and should perhaps read

> The use of function declarators **(that are not part of definitions of the respective functions)** with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.

in which case it would not provide motivation for emitting this warning on function **definitions**. (I did not see a defect report to this effect or otherwise relating to Â§6.11.6.)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8V12P47oN_TXKCxHDlhM7echDJrMB5qEt0Bbo4wVt0bH2OpIryUnTX1_QsvOxO7uL24e7WMx4bIciD885ZNB7fTJEO7F-E-v3BQ6htW739YzOt9h1i8qq2-5gjdeKHISWoLFdZ6_anIQ8wG-NtUn9m8j3In0X6fyzSOP_Ov6tTYDGWiE3Qm5BlG_xNgCAozA4Aysp8umuKN-_ifIc-jA4RyZA3aE5gZCbbJukSXrSAep8vd1UWZHhSm2KTZXVKkuxJCqxzktVbGiNedEQ53DVoQVRpMueFJqga1GkYN14618-OF2HZe9ssOHWk-eHvbNqqMkDwhWd0eYEjWVEtIfaKvoRBPHPmO6yhk-iw4ghxBfHa5HvM5HvNyLfz4fxJUIzmDpoa0BR3aHD8ZprsUMAhHtM0B4U9Y5qDKRAG8Cugws5r63xYBs4gFi_fVbq-v3RnAxEeYCfdA_GF6Z_Yv3lB0_gYrX6SVP_2RIo7evBc36c7kjHt78fD2L9Dl8MVh0D_hl41Q0UNTh0gT_H7wu5aUPoPXdEHoU8cmg7OE9J113OiXUnIY9ByKNr6iVNwZfX72Ivq9tyir3UZlkLeSzStcwYhg7dibobNJazJg_WABk-Bk-c6uDJeQgWrk4Heu6XB_TMswesIzpyywooUqiGAB-AZ8adHPmpgSw97PtO17Hrtoncm8kY7IMdQu6F3CtqtNHjkfFG8j3meDLWB13DmbzHEwFW9jLSx9szXVsMUFvTDJ6PQB-P1P6VivMxbAjGBvg6-PADsibwF-sI9Lm3LqAJ3Y0_9AEVdZouxFW68Xhj54Ot4aSG8PmZUclogM59uEGPDs8UyEGnfUjgw_CtoOuhQweHrIS_yqwsQByk2JdFUiZFkgt5zFbg8eaZd16fNb8c6D-BESd0nhtA6DpN7q4ikb_xoS16xkMpUnftTD_zL7A3oBWZoBs95TShMTKmu41tfbzhY1vpUcf9zlx7MnV3P5c8BmWFfw_46E8YGE9GgUPhM3ZjaAyPD_qeak7Ex_vP50KLY1cemSUxEWAm_ZFUmCL_VzrGgjaNdeeogMgKztEM54oc-3f0hO9BZEIPrB5SCTf5aG0wNhBkq5Kt9R9EIL5IsUnF9tAMYXAEbNkDa0JpR3XU0fTKO0-eIsmypBBym3zT-A-42qFTEPB3iooJFs6EJpaBPxbqhOjPOA3UNJzNhd2nd_ai1TiU7rbFgkKjopQaVtu9l7NXMBr94LQdfLQWnmHoKYGPAJ7o7GFgoMNgMBBnP1sbPYytvfXkausYG46u3TgH-dFYEIEf6vZe6w9tjyfKyxoAvAEUKVxbirYninR8t0hBWfJGyDKw4gDNLbRjQebXqL6439wo7LyF4DSp0UB1xA3qFnsGnHFkvdNMKR_QKHSK3WJ03QgtA1qTQactg3tn0i9m8J1OCXzAaSD_MNgKPSkeKrNTRa4d4Nrquh3N6luvYR0OMdVP5Ocjq-6UIhNa4sEl5GZU5MyfZVTYE-3GjeIpEjeNPc-ArbztiEsP0BCybF5gfpurYOzC1T6QmS72xcM57rceKvNkAhneuqYJyEmdHPYt_HuwDGucV9fWet5MJ1E7aiaSPqM3qwIaHBk7ieKTGuBKQpasHHebZuuJAjitGFz92pRoaeaxN7wM-zjemKW_TzyZShrHu1HzGLAxab7gpDoMM_98O5pJT67F3oMjVH-081EAQm6i_zh68eCnPWGmuSO2XjaZh355Q3mypz-XSNpMxGebAh0mh53OYw-Esw36EicDL-Z01iFEiT5tSfzwV1sSF_IBSsfwnihOKbY5R7y3xCZpP1kxzx3LbnvVnqHrMEykeaZJIuR2oXa52uZbXNAuK7PVqixWm3LR7tZ1gSXm26xoVs22xqbMN0WVp81KrppmSwu9k6lcpas8zTK5SYtEVvU6L7abdbqtK5XWYpXSGXV3X3EX2vuBdtt0vS0WHVbU-fFLnpSGrjA-FFLydz63488sq-HkxSplJfpHlKBDR7u_Xcj9l7DjgfHZEj7B61_wfUJ2Mbhu97qUn3Rohyqp7VnIIx83_eKwX6nm9XxM0gt5HIv4XwAAAP__Ud3m7A">