<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/135913>135913</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Incorrect format string determination from manifestly constant-evaluated contexts
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:diagnostics
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hubert-reinterpretcast
</td>
</tr>
</table>
<pre>
Clang does not observe the surrounding manifestly constant-evaluated context when attempting `-Wformat` diagnostics.
In the case below, the program semantics uses the `"%d\n"` format string.
Clang diagnoses on the basis of the `"%!\n"` string instead.
https://godbolt.org/z/cGsM5Mjn5
### Source (`<stdin>`)
```cpp
#include <stdio.h>
#include <stdarg.h>
constexpr auto const_string() {
if consteval {
return "%d\n";
}
return "%!\n";
}
constexpr auto getvprintf [[gnu::format(__printf__, 1, 0)]](const char *format) {
return [=](va_list vp) {
return vprintf(format, vp);
};
}
constexpr auto myvprintf = getvprintf(const_string());
void q(int x, ...) {
va_list ap;
va_start(ap, x);
myvprintf(ap);
va_end(ap);
}
int main(void) {
q(0, 42);
}
```
### Compiler invocation command
```
clang++ -fsyntax-only -Wall -Wextra -pedantic -std=c++2c -xc++ -
```
### Actual compiler output
```
<stdin>:17:39: warning: invalid conversion specifier '!' [-Wformat-invalid-specifier]
17 | constexpr auto myvprintf = getvprintf(const_string());
| ^~~~~~~~~~~~~~
<stdin>:8:12: note: format string is defined here
8 | return "%!\n";
| ~^
1 warning generated.
```
### Expected compiler output
(No warning)
### Compiler version info (`clang++ -v`)
```
clang version 21.0.0git (https://github.com/llvm/llvm-project.git 77f0708b9d4feee8b8a67a5f571be741be4e26af)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/wandbox/clang-head/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/13
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/14
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/14
Candidate multilib: .;@m64
Selected multilib: .;@m64
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVs2O4ygXfRqyQbYw_s0iC1fSafWiv023VMsIw7VDfxg8gFOpWfSzj7ATV5LqKc1o2rLiCO7POdzDBeac7DTABuVPKN-t2OiPxm6OYwPWRxak9mAHC54z51eNEa-brWK6w8KAw9p4bBoH9gTYHwG70VozaiF1h3umZQvOq1fMjXaeaR_BiamReRBhyMPZ45cjaMy8h37wwQsVJHpuje2ZRwXBQrJOG-cldzEi9Rc9peHMAW5AmRdEt9PIYE1nWY8d9EwHazw6cNMUKgiiFNFcoHyrw9-C4DkDdt5K3YXIF1JzOnDYzJka5qTDpr2PhGhyE2sOgqV2HpgIwRCpj94PDqU1ontE950RjVE-NrZDdP8nonv-2X3Nv_7Q-WyOaDq_-JsZLQeMaBXSpVvnhdQo_TQlXwfTgswvH4bZU2quRgH4Ym3iY7D_xRSz3TJH6qkqcB4sZqM3c5EOM5mQna4xKp8QqTGW7TwbyrcMYmzBj1bjh9VN52lU7qbvndHNwk1ms9F7LB3402Cl9i2edPnU6TEsZlpfpEGrw2E2OByCBpLwMy1QvgsvraaImB-ZxYgubm-crrjyJ5ReXE7soKTz-DTcGi6mF0SIVtdo29n0lvKHtPrXhVW6uyF5hXu3-ktgROqTkQL_gWgltcfnkDiO41uQV-hsuIA5sYPzzIaVYkNwON8AXXBcZpeJEzuAFvejC5mQu2dSh5UyUtykD8hISJLRR7erWB9lvjX9IBVYLPXJcOal0ZibvmdaPLjxsDMRfUL0CUete9WenSOj1SuOnplSOHqGs7cMRwOIae_jyHmB0h2fnSjH0ZlfA3yEqeZ-ZCrAmKGZ0Q-jf_S42ZJpnZQordM1Smv8wqwOxUvrwIkpOTW5E1gXuLkBuGwlBDWWYRvQMmjv2uuii0u02AVJTvJLSozKLf4tUsLTE8Kh_NPP2-cdsyqwo4GNNh7C965nYumwgFZqEPgIFi7Bqyn4h3v-DcPb8xPloSkl10XEHWiw4aCIPyrYp_MAfD5N3pWMVv8zS03mxvlL_V0LJHVrLl33TnGn9433KsrFlyYxiUknfQjw0PmlP45NzE2P6F6p0_UTDdb8AO7j4FWWLSlJ1axF1gJA1VSsKFne5mXSQJklDWRAC9bOOL4z24EPFTlXxaHIolH_X5sXHSmpx3MUWiWpvx8tMIF7I0AF08E4eZ5OUOeZUiB20oZxRPdm8IjuX5gWjTmHoylwi47ABKL7RmpE6n041DFnWkjBPODP2-103jGlpq17iTQ6G-jJJhDnHNH9BeEbMrpP0t8dMEOk_gZqlsJ_jrRdQPWj8jK4pDWOg3gz0hd3yf7WYtHKSmxSsU7XbAWbpMyyskqqlK6Om5LSomA5SUSeZQkv1usS0hxaSqqSJFW2khtKaE6ypCB5WiY0blm2XpdNmSV5wkm2RhmBnkkVBz2Fq8VKOjfCJknzdZKuFGtAueleR-ks6bS-uU-FDZnvVnYzybEZO4cyEg4R9xbQS69g80VzYy1w_9ACBHiwvdRz926t6f_Zpc-tRqs2_26fILqf2LlJQRPB04b-FQAA__8LV0Wk">