[clang] format string checking for conpile-time evaluated str literal
authorYingChi Long <me@inclyc.cn>
Wed, 3 Aug 2022 02:07:31 +0000 (10:07 +0800)
committerYingChi Long <me@inclyc.cn>
Thu, 4 Aug 2022 13:07:30 +0000 (21:07 +0800)
commitf417583f319bd60d1e32cdf9d0242e42f86101bf
tree000ade2999b3011d8c60c2e608f04bd066f88926
parentb8985ba0adb5fd881bb301fbc79370b86396e658
[clang] format string checking for conpile-time evaluated str literal

This patch enhances clang's ability to check compile-time determinable
string literals as format strings, and can give FixIt hints at literals
(unlike gcc). Issue https://github.com/llvm/llvm-project/issues/55805
mentiond two compile-time string cases. And this patch partially fixes
one.

```
constexpr const char* foo() {
  return "%s %d";
}
int main() {
   printf(foo(), "abc", "def");
   return 0;
}
```

This patch enables clang check format string for this:

```
<source>:4:24: warning: format specifies type 'int' but the argument has type 'const char *' [-Wformat]
  printf(foo(), "abc", "def");
         ~~~~~         ^~~~~
<source>:2:42: note: format string is defined here
constexpr const char *foo() { return "%s %d"; }
                                         ^~
                                         %s
1 warning generated.
```

Reviewed By: aaron.ballman

Signed-off-by: YingChi Long <me@inclyc.cn>
Differential Revision: https://reviews.llvm.org/D130906
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaChecking.cpp
clang/test/SemaCXX/format-strings.cpp