<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/138100>138100</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] `clang diagnostic` breaks `_Pragma`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Eisenwave
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/bsjasnK8T
```cpp
#define DO_PRAGMA_(...) _Pragma(#__VA_ARGS__)
#define DO_PRAGMA(...) DO_PRAGMA_(__VA_ARGS__)
#define DIAGNOSTIC_IGNORED(...) DO_PRAGMA(clang diagnostic ignored __VA_ARGS__)
DIAGNOSTIC_IGNORED(-Wdeprecated)
```
This doesn't work and produces the error:
```
clang++: warning: argument unused during compilation: '-S' [-Wunused-command-line-argument]
<source>:6:1: error: expected string literal in pragma diagnostic
6 | DIAGNOSTIC_IGNORED(-Wdeprecated)
| ^
<source>:4:33: note: expanded from macro 'DIAGNOSTIC_IGNORED'
4 | #define DIAGNOSTIC_IGNORED(...) DO_PRAGMA(clang diagnostic ignored __VA_ARGS__)
| ^
<source>:2:24: note: expanded from macro 'DO_PRAGMA'
2 | #define DO_PRAGMA(...) DO_PRAGMA_(__VA_ARGS__)
| ^
<source>:1:25: note: expanded from macro 'DO_PRAGMA_'
1 | #define DO_PRAGMA_(...) _Pragma(#__VA_ARGS__)
| ^
<scratch space>:5:27: note: expanded from here
5 | clang diagnostic ignored -Wdeprecated
|
```
If we instead write
```cpp
#define DIAGNOSTIC_IGNORED(...) DO_PRAGMA(lmao __VA_ARGS__)
```
The code is preprocessed as expected, and the `-E` output is:
```cpp
#pragma lmao -Wdeprecated
```
Such uses of `_Pragma` ough to be valid.
The error is specific to `clang diagnostic` inside `_Pragma`. If we write `clang dogs` instead, it works.
GCC accepts this code (with `GCC diagnostic` of course).
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0lV9vozgXxj-Nc3MURAwkcMEFzT9Vr97pqK12LpGxT8AzYCPbNLv76VcmZNqk6U7nYiOiBMnnOT-f4_OYWStrhZiT5I4kmxkbXKNNvpUW1ZG94KzS4q-8ca63JCoI3RG6q7WodOsCbWpCd38Tuqvsd2bV_9JnEhZkGZ4e3vf-lUYCD1IhbB7Kr4_F_v9FSWgaBAGhGZRfDas7RmhKaFSWfxRl8bh_KktCs9uxr6EXcu9DL6Lvi_2Xh6fn-3V5v__y8Ljd3JAhNOUtUzUIyWqlrZMcZK20QQG35G-Kzr8J7A1y5lBMK8_lIGHx3EgLQqNVhK4cHLX5AUwJ6I0WA0cLrkFAY7Txtb6MHdkIvfNPVMCRGSVV7f8yUw8dKgeDGiwKEIORqgauu162zEmt_CpCV_MnQldAkrv5t9PSOdddx5SYt1Lh_KxDko3PHa2tHgxHEm1JVCxJVCy8zhkP8M8euUMB1o35WunQsBakgn5s6ptCkrAAAFgCWa1vd-N94WD8-ACSbN8DxSQqosiDKO1wAmJKoICD0R10jBvtd30r3WrSj0_6_-FB-cUuqP_Gn9nFa_YzPL2G_90Z-QWbbzdNfoetfIVbfAT36eG_RccNc7wB27MzpOejq48hGzQ4iSWjGHzYu4sj-Cb_1SDeH-CIIJV1yAQcjXT4r673ySPVdkzf8JkL90DgWiBIC73B3miO1g88sz-HkdD16CjeSMgynG_JMgQ9uH5wIO2Vq_xEneZ1RLiqwluAp4E3MFi0oA9e_dy_MUXdgNNQIbywVorg5JHPZz_zzLZHLg-S-3U--1UfvIxUVgq81A7gVPGx0m8CdW2nEN8Iv3F5slQ7Jd-v18A4x955Y5X2VDxC06N0jRfyCy7z6wNwPRiLhGbBTOSRyKKMzTBfrOJlmGbZKp41eZyKJKqSOMUqZlVaVRFLssUyZYvogAfOZjKnIU3CJFyEaZJFUVBVaRUvKaWHLOUrzkgcYsdkG7TtS-fv0Zm0dsB8EaWLMJy1rMLWjlcypZPxU387m9wHzKuhtiQOW2mdfZVw0rXjPX6KSDYfVbkyyH7YyyrPBtNeX_PSNUMVcN0RuvNZpp95b_R35I7Q3UhtCd1N4C85_ScAAP__LpV3gw">