<div dir="ltr"><div dir="ltr">On Sat, Aug 3, 2019 at 5:55 PM Sebastian Pipping <<a href="mailto:sebastian@pipping.org">sebastian@pipping.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello Nico,<br>
<br>
<br>
On 29.07.19 15:16, Nico Weber wrote:<br>
> As you can see by the weird "default : break" at the end, clang-format<br>
> gets confused about the whole switch statement. It looks like the macros<br>
> confuse it. Just adding semicolons after it is sufficient to unconfuse it:<br>
> <br>
> [..]<br>
>   LEAD_CASE(2); LEAD_CASE(3); LEAD_CASE(4);<br>
> [..]<br>
> <br>
> If you're able to change expat's source, this might be a good approach.<br>
<br>
interesting idea!<br>
<br>
<br>
> Else, you can explicitly tell clang-format the name of macros that<br>
> should be handled as statements in your .clang-format file like so:<br>
> <br>
> StatementMacros: ['LEAD_CASE']<br>
<br>
Good to know!<br>
<br>
<br>
> You can fix this by doing `XCS("foo" "bar")` (with a linebreak in<br>
> between foo and bar) instead of `XCS("foo") XCS("bar")`. Semantically<br>
> they do the same thing as far as I can tell, but clang-format does much<br>
> better with the first form.<br>
<br>
Things get interesting here because XCS is either<br>
<br>
  # define XCS(s) _XCS(s)<br>
  # define _XCS(s) L ## s<br>
<br>
or<br>
<br>
  # define XCS(s) s<br>
<br>
depending of macro XML_UNICODE_WCHAR_T to turn string literals into<br>
wide or narrow string literals.  For the first version, XCS("foo" "bar")<br>
results in invalid C syntax, mixing wide L"foo" with narrow "bar".  As a<br>
result, I needed to turn off BreakStringLiterals altogether for now.<br></blockquote><div><br></div><div>FWIW, C++11 added "If one string-literal has no encoding-prefix, it is treated as a string-literal of the same encoding-prefix as the other operand." to [lex.string]p13, so in C++11 `L"foo" "bar"` is the same as `L"foo" L"bar"`. But granted, it's implementation-defined in C++ before C++11.</div><div><br></div><div>The C standard says "If any of the tokens are wide string literal tokens, the resulting multibyte character sequence is treated as a wide string literal; otherwise, it is treated as a character string literal." in 6.4.5 String Literals p4. C89 still said "If a character string literal token is adjacent to a wide string literal token, the behavior is undefined", I think this changed in C99.</div><div><br></div><div>So if you need to support compilers that don't implement the C99 behavior (which you likely do need to do :) ), then you're right.</div><div><br></div><div>We should probably have a bug for making clang-format handle string literals surrounded by a macro call without semicolons that aren't in StatementMacros the same as bare string literals.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Best<br>
<br>
<br>
<br>
Sebastian<br>
</blockquote></div></div>