delcypher added inline comments.

================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:5529
+def warn_call_function_without_prototype : Warning<
+  "calling function %0 with arguments when function has no prototype">, 
InGroup<
+  DiagGroup<"strict-calls-without-prototype">>, DefaultIgnore;
----------------
aaron.ballman wrote:
> This diagnostic doesn't tell me what's wrong with the code (and in fact, 
> there's very possibly nothing wrong with the code whatsoever). Further, why 
> does calling a function *with no arguments* matter when it has no prototype? 
> I would imagine this should flag any call to a function without a prototype 
> given that the function without a prototype may still expect arguments. e.g.,
> ```
> // Header.h
> int f();
> 
> // Source.c
> int f(a) int a; { ... }
> 
> // Caller.c
> #include "Header.h"
> 
> int main() {
>   return f();
> }
> ```
> I think the diagnostic text should be updated to something more like `cannot 
> verify %0 is being called with the correct number or %plural{1:type|:types}1 
> of arguments because it was declared without a prototype` (or something along 
> those lines that explains what's wrong with the code).
@aaron.ballman  Thanks for the helpful feedback.

> This diagnostic doesn't tell me what's wrong with the code (and in fact, 
> there's very possibly nothing wrong with the code whatsoever).

That's a fair criticism.  I think the diagnostic message you suggest is a lot 
more helpful so I'll go for something like that.

> Further, why does calling a function *with no arguments* matter when it has 
> no prototype?

The reason was to avoid the warning being noisy. E.g. I didn't the warning to 
fire in this situation.

```
// Header.h
int f(); // The user forgot to put `void` between parentheses

// Source.c
int f(void) { ... }

// Caller.c
#include "Header.h"

int main() {
  return f();
}
```

Forgetting to put `void` in the declaration of `f()` is a pretty common thing 
to do because a lot of people read `int f()` as declaring a function that takes 
no arguments (it does in C++ but not in C).

I don't want the warning to be noisy because I was planning on switching it on 
by default in open source and in a downstream use-case make it an error.

How about this as a compromise? Split the warning into two separate warnings

* `strict-call-without-prototype` -  Warns on calls to functions without a 
prototype when no arguments are passed. Not enabled by default
* `call-without-prototype` -Warns on calls to functions without a prototype 
when arguments are passed.  Enable this by default.

Alternatively we could enable both by default. That would still allow me to 
make `call-without-prototype` an error and `strict-call-without-prototype` not 
be an error for my downstream use-case.

Thoughts?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D116635/new/

https://reviews.llvm.org/D116635

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to