aaron.ballman added a comment.

In D112579#3630647 <https://reviews.llvm.org/D112579#3630647>, @fcloutier wrote:

> I'm afraid that's also not possible: `D` is a `Decl`, so it doesn't have 
> `getType()`. `Decl` is the tightest-fitting superclass of `BlockDecl`, 
> `FunctionDecl` and `ObjCMethodDecl` (because `BlockDecl` is a direct subclass 
> of it).
>
> One option could be to cast the `Decl` to a `FunctionDecl` and then use 
> `FDecl->isVariadic()`, similarly to how it goes for `BlockDecl` and 
> `ObjCMethodDecl`. I'm not sure that it's equivalent, but if you believe it is 
> and like it better, I can do that.

Ahhhhhh, I had forgotten about `BlockDecl` not being a `ValueDecl`. In that 
case, I think the code is fine as-is, sorry for the noise!

I think this generally LG; I found a few minor nits in the documentation and 
some questions on the tests. The test stuff can be handled in a follow-up if 
you think it's worthwhile.



================
Comment at: clang/include/clang/Basic/AttrDocs.td:3147
+
+As an extension to GCC's behavior, Clang accepts the format attribute on
+non-variadic functions. Clang checks non-variadic format functions for the same
----------------



================
Comment at: clang/include/clang/Basic/AttrDocs.td:3165
+
+Using the format attribute on a non-variadic function emits a GCC compatibility
+diagnostic.
----------------



================
Comment at: clang/test/SemaCXX/attr-format.cpp:76
+  format("bare string");
+  format("%s", 123); // expected-warning{{format specifies type 'char *' but 
the argument has type 'int'}}
+  format("%s %s %u %d %i %p\n", "hello", s, 10u, x, y, &do_format);
----------------
This pointed out an interesting test case. What should the behavior be for:
```
format("%p", 0);
```
Because that sure feels like a more reasonable thing for someone to write 
expecting it to be treated as a null pointer constant.


================
Comment at: clang/test/SemaCXX/attr-format.cpp:77-78
+  format("%s", 123); // expected-warning{{format specifies type 'char *' but 
the argument has type 'int'}}
+  format("%s %s %u %d %i %p\n", "hello", s, 10u, x, y, &do_format);
+  format("%s %s %u %d %i %p\n", "hello", s, 10u, x, y, do_format);
+  format("bad format %s"); // expected-warning{{more '%' conversions than data 
arguments}}
----------------
This likely isn't specific to your changes, but the `%p` in these examples 
should be warning the user (a function or function pointer is not a pointer to 
void or a pointer to a character type, so that call is UB).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D112579

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

Reply via email to