<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">