jyknight added a comment.

Starting by looking at the test cases, I've got some suggestions on making the 
diagnostics a bit less confusing.



================
Comment at: clang/test/CodeGen/2009-06-01-addrofknr.c:8
 
-static int func(f)
+static int func(f) // expected-warning {{this function declaration without a 
prototype is deprecated in all versions of C and changes behavior in C2x}}
   void *f;
----------------
This message seems vaguer than necessary, since we know _for sure_ this is 
invalid.

Can we say something like: "K&R-style function definitions are deprecated in 
all versions of C and not supported in C2x"?


================
Comment at: clang/test/Parser/declarators.c:5
 
-void f0();
+void f0(); /* expected-warning {{a function declaration without a prototype is 
deprecated in all versions of C}} */
 void f1(int [*]);
----------------
Perhaps we should add an explanation to the message like
 `(specify '(void)' if you intended to accept no arguments)`
to make it clearer to folks who aren't familiar with this weirdness yet?


================
Comment at: clang/test/Sema/implicit-decl.c:25
+Boolean _CFCalendarDecomposeAbsoluteTimeV(const char *componentDesc, int32_t 
**vector, int32_t count) { // expected-error {{conflicting types}} \
+                                                                               
                         // expected-warning {{this function declaration with a 
prototype changes behavior in C2x because it is preceded by a function without 
a prototype}}
  return 0;
----------------
It's not "preceded by a function without a prototype", though, it's preceeded 
by a implicit declaration due to a call. Which we would've already diagnosed 
with the default-on -Wimplicit-function-declaration diagnostic.

Although...what _is_ the desired behavior of an implicit function declaration 
in C2x mode? If we permit it _at all_, it must still create a non-prototype 
function declaration, I expect. In that case this decl with types would still 
be valid, so the warning is just wrong.



================
Comment at: clang/test/Sema/knr-def-call.c:15
+void f2(float); // expected-note{{previous declaration is here}} \
+                   expected-warning {{this function declaration with a 
prototype changes behavior in C2x because it is followed by a function without 
a prototype}}
+void f2(x) float x; { } // expected-warning{{promoted type 'double' of K&R 
function parameter is not compatible with the parameter type 'float' declared 
in a previous prototype}} \
----------------
I think we don't want to emit a warning here. If a declaration with params 
doesn't match a K&R definition, we already emit a conflicting-types error.

[[Well...except for one case, I've noticed -- we don't current emit any warning 
when a definition with no parameters fails to match a preceding declaration 
with params, e.g. `void f(int); void f() { }`. I'm quite surprised -- I'm 
willing to say that such code is 100% just a bug, not intentional. I note that 
GCC unconditionally rejects it. I think we should also be emitting an 
unconditional error in that case.]]]

Anyhow, when you have a K&R style definition with parameters, that -- all by 
itself -- is definitely invalid in C2x, so we don't need to emit any warning on 
the declaration.


================
Comment at: clang/test/Sema/warn-deprecated-non-prototype.c:46
+                         strict-note {{this function declaration without a 
prototype changes behavior in C2x}}
+void order1(int i);   // both-warning {{this function declaration with a 
prototype changes behavior in C2x because it is preceded by a function without 
a prototype}}
+
----------------
Maybe something like "this function declaration will conflict with the 
preceding declaration in C2x, because the preceding declaration does not 
specify arguments."


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

https://reviews.llvm.org/D122895

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

Reply via email to