<div dir="ltr">gcc has -Wstrict-prototypes which will catch this, but clang doesn't implement it.<div><br></div><div>however, both gcc and clang have -Wmissing-prototypes which should catch these if users enable it.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Aug 30, 2015 at 5:32 PM, Aaron Ballman via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sun, Aug 30, 2015 at 4:53 PM, Piotr Dziwinski <<a href="mailto:piotrdz@gmail.com">piotrdz@gmail.com</a>> wrote:<br>
> @Aaron: Yes, I'm aware of that. I wanted to show that my check does not take<br>
> this into account.<br>
><br>
> In C++ this code is equivalent, so I think nothing should be reported,<br>
> unless we really want to get rid of that void, but I suppose this other<br>
> check does it already.<br>
<br>
</span>I think that in C++, it would make sense for this to be reported as a<br>
consistency issue. For instance, the declaration without void could be<br>
in a header while the definition is in a source file.<br>
<span class=""><br>
> And when it comes to C, in well-formed C code, we should never see those two<br>
> definitions of allright() and allright(void), as they are declarations of<br>
> different functions. If I try to add empty bodies {} to define them, this<br>
> example won't even compile.<br>
<br>
</span>Correct, but it also strikes me as weird that your test case is a .c<br>
file and there are no diagnostics triggered helping the user to<br>
understand that these are declaring different things. It's not until<br>
you add the definition that you get a diagnostic. This shouldn't be a<br>
clang-tidy diagnostic, but a frontend diagnostic. I'm not suggesting<br>
you have to do that work, either. Merely commenting that 1) they're<br>
different in C, 2) C++ programmer may be unaware of those differences,<br>
3) this can cause real bugs, and 4) we currently fail to help the user<br>
in a meaningful way.<br>
<br>
<a href="http://coliru.stacked-crooked.com/a/59ba90b4d3ec5828" rel="noreferrer" target="_blank">http://coliru.stacked-crooked.com/a/59ba90b4d3ec5828</a><br>
<br>
~Aaron<br>
<div class="HOEnZb"><div class="h5"><br>
><br>
> So anyway, I still don't understand the problem here, unless somebody<br>
> explains it in clearer terms.<br>
><br>
> Best regards,<br>
> Piotr Dziwinski<br>
><br>
><br>
> On 2015-08-30 22:43, Aaron Ballman wrote:<br>
>><br>
>> On Sun, Aug 30, 2015 at 4:39 PM, Piotr Dziwinski via cfe-commits<br>
>> <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
>>><br>
>>> piotrdz added a comment.<br>
>>><br>
>>> @Eugene: I don't understand, what does declaring function with "void"<br>
>>> argument have in common with this review? I only check here variable<br>
>>> declarations inside functions.<br>
>>><br>
>>> Maybe you meant my other review for inconsistent declaration parameter<br>
>>> names? If so, this is how it behaves currently:<br>
>>><br>
>>>    $ cat test.c<br>
>>>    void allright();<br>
>>>    void allright(void);<br>
>>><br>
>>>    void notallright(int a);<br>
>>>    void notallright(int b);<br>
>>><br>
>>>    $ clang-tidy<br>
>>> -checks='-*,readability-inconsistent-declaration-parameter-name' test.c --<br>
>>> -std=c11<br>
>>>    1 warning generated.<br>
>>>    /work/clang-trunk/test.c:4:6: warning: function 'notallright' has<br>
>>> other declaration with different parameter name(s)<br>
>>> [readability-inconsistent-declaration-parameter-name]<br>
>>>    void notallright(int a);<br>
>>>         ^<br>
>>>    /work/clang-trunk/test.c:5:6: note: other declaration seen here<br>
>>>    void notallright(int b);<br>
>>><br>
>>> So I see no reason to add specific checks for functions with "void"<br>
>>> parameter, unless you see something wrong with this behavior?<br>
>><br>
>> In C, void allright(); is a function accepting a variable number of<br>
>> arguments, and void alright(void); is a function accepting no<br>
>> arguments. In C++, they are both functions accepting no arguments.<br>
>><br>
>> ~Aaron<br>
><br>
><br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div>