<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Apr 13, 2014 at 1:55 PM, Kyle Sluder <span dir="ltr"><<a href="mailto:kyle@ksluder.com" target="_blank">kyle@ksluder.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="auto"><div class=""><div>On Apr 13, 2014, at 1:29 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>> wrote:<br>
<br></div><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Apr 13, 2014 at 12:38 PM, Kyle Sluder <span dir="ltr"><<a href="mailto:kyle@ksluder.com" target="_blank">kyle@ksluder.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>On Apr 12, 2014, at 2:34 AM, David Chisnall <<a href="mailto:David.Chisnall@cl.cam.ac.uk" target="_blank">David.Chisnall@cl.cam.ac.uk</a>> wrote:<br>


><br>
> For _Error, you can use C11's _Static_assert():<br>
><br>
> #define fail(msg) _Static_assert(0, msg)<br>
><br>
> There's no standard equivalent for #warning, unfortunately.<br>
<br>
</div>That workaround is sufficient for my use case, but the output is noisy and as you note it doesn’t work for those who treat warning differently from errors.<br>
<br>
So, can anyone opine on whether such a patch would be accepted?</blockquote><div><br></div><div>I don't think we want _Warning and _Error. You can use #pragma message to emit a warning (as _Pragma("message \"...\"") within your macro).</div>
</div></div></div></div></blockquote><div><br></div></div><div>Such a macro definition is sadly impossible because the C99 spec is too strict: _Pragma only accepts a single string literal. No implicit concatenation of string literals is allowed.</div>
<div><br></div><div>If the clang folks are fine with relaxing that, then _Pragma becomes sufficient for my purposes. But I presume it was so strictly defined in the spec for some reason.</div></div></blockquote><div><br></div>
<div>You don't need string literal concatenation to make this work. Here's a hint, from C11 6.10.9/2:</div><div><br></div><div>#define PRAGMA(x) _Pragma(#x)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="auto"><div class=""><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>I'd much prefer to add support for something like '#pragma clang error "blah"' rather than adding something like _Error(...), if _Static_assert is somehow insufficient, but I'd like to understand what's wrong with _Static_assert first.</div>

</div></div></div>
</div></blockquote><br></div><div>Well, for starters, it can’t be used to produce a warning. That alone makes it worth contemplating alternatives, in my view.</div></div></blockquote><div><br></div><div>I explained how to get a warning above =) I was only talking about the error case here.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="auto"><div>But even for the error-producing use case, the error output contains a lot of noise about failing nonsensical assertion conditions. The best thing about #error and #warning is that I get to control the output, and that lets me match clang’s much-lauded user-friendliness in my own error messages.</div>
</div></blockquote><div><br></div><div>OK, if you don't like the 'static assertion failed' text added by _Static_assert, then use this:</div><div><br></div><div>#define pragma(...) _Pragma(#__VA_ARGS__)</div><div>
#define warning(msg) pragma(GCC warning(msg))</div><div>#define error(msg) pragma(GCC error(msg))</div></div></div></div>