nickdesaulniers added a comment.

In D132568#3747971 <https://reviews.llvm.org/D132568#3747971>, @inclyc wrote:

>> Do we want to encode that in `test_promotion` in 
>> `clang/test/Sema/format-strings.c`? Seems like tests on shorts are missing.
>
> Tests for short and char "incompatibility" could be found elsewhere in this 
> file.
>
> format-strings.c
>
>   void should_understand_small_integers(void) {
>     printf("%hhu", (short) 10); // expected-warning{{format specifies type 
> 'unsigned char' but the argument has type 'short'}}
>     printf("%hu\n", (unsigned char)1); // warning with -Wformat-pedantic only
>     printf("%hu\n", (uint8_t)1);       // warning with -Wformat-pedantic only
>   }
>   /* ... */
>   void test13(short x) {
>     char bel = 007;
>     printf("bel: '0%hhd'\n", bel); // no-warning
>     printf("x: '0%hhd'\n", x); // expected-warning {{format specifies type 
> 'char' but the argument has type 'short'}}
>   }
>
> Do I need to explicitly test again in the `test_promotion`?

Feel free to delete or move existing test cases if they make more sense to 
remain together in your added block, rather than more isolated in other test 
functions.



================
Comment at: clang/lib/AST/FormatString.cpp:401
+      if (const auto *BT = argTy->getAs<BuiltinType>()) {
+        if (!Ptr) {
+          switch (BT->getKind()) {
----------------
aaron.ballman wrote:
> It's a bit strange that we have two switches over the same `BT->getKind()` 
> and the only difference is `!Ptr`; would it be easier to read if we combined 
> the two switches into one and had logic in the individual cases for `Ptr` vs 
> not `Ptr`?
I almost made the same recommendation myself.  For the below switch pair, and 
the pair above.


================
Comment at: clang/lib/AST/FormatString.cpp:408-410
+                T == C.ShortTy || T == C.UnsignedShortTy) {
+              return MatchPromotion;
+            }
----------------
nickdesaulniers wrote:
> `{}` aren't necessary
make sure to mark these done in phabricator UI


================
Comment at: clang/test/Sema/format-strings-scanf.c:271-272
+  scanf("%llx", &i); // expected-warning{{format specifies type 'unsigned long 
long *' but the argument has type 'int *'}}
+  scanf("%hf", // expected-warning{{length modifier 'h' results in undefined 
behavior or no effect with 'f' conversion specifier}}
+  &sc); // Is this a clang bug ?
+  scanf("%s", i); // expected-warning{{format specifies type 'char *' but the 
argument has type 'int'}}
----------------
aaron.ballman wrote:
> nickdesaulniers wrote:
> > Hmm...
> @nickdesaulniers -- are you thinking this might be a pedantic warning because 
> it's always valid to cast to a pointer to char and write into it? e.g.,
> ```
> short s;
> char *cp = (char *)&s;
> *cp = 0; // Not UB
> ```
No, was just curious about the comment `Is this a clang bug ?`. Looks like my 
comment has moved from the source location, and that you have a similar thread 
below. This one can be marked done.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D132568

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

Reply via email to