MarcusJohnson91 marked 2 inline comments as done.
MarcusJohnson91 added inline comments.


================
Comment at: clang/unittests/Format/FormatTest.cpp:2497
                Style);
 }
 
----------------
MyDeveloperDay wrote:
> my assumption is this test is using `Style.IndentExternBlock =false` correct?
> 
> This suggests the default was previously true not false
> 
> ```
> if (Style.BraceWrapping.AfterExternBlock) {
>         if (Style.BraceWrapping.AfterExternBlock) {
>           addUnwrappedLine();
>           parseBlock(/*MustBeDeclaration=*/true);
>         } else {
>           parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/false);
>        }
> ```
> 
> This one test change alone, makes me see that it might be incorrect to set 
> the default Indent to false when AfterExternBlock is true.  (parseBlock 
> default parameter for AddLevel is true)
> 
> shouldn't the default value of `Style.IndentExternBlock = 
> Style.BraceWrapping.AfterExternBlock`?
> 
> (which is 100% why I don't like seeing tests changed).. this was buried in 
> your last changes to the tests and I didn't see it.)
> 
> So now we need to go back and take a look through the clang sources and see 
> what its doing by default, and tests what other default styles are doing 
> prior to this change and if they indent then I think by default we need to 
> indent.
> 
> If we run clang-format on the following code, we see an issues
> 
> https://github.com/llvm/llvm-project/blob/a974b33a10745b528c34f0accbd230b0a4e1fb87/clang/test/SemaCXX/linkage-spec.cpp
> 
> Whats great about this Fix (which is why it needs to go in) this test file 
> despite being part of LLVM its not actually formatted with the LLVM style ;-) 
> i.e. it will come out as
> 
> ```
> extern "C" {
> extern "C" void f(int);
> }
> 
> extern "C++" {
> extern "C++" int &g(int);
> float &g();
> }
> ```
> 
> instead of 
> 
> ```
> extern "C" {
>   extern "C" void f(int);
> }
> 
> extern "C++" {
>   extern "C++" int& g(int);
>   float& g();
> }
> ```
> 
> Thats because they don't want a break after the "C" and before the { but they 
> do what the indent.
> 
> Conversely there is code in
> 
> https://github.com/llvm/llvm-project/blob/a974b33a10745b528c34f0accbd230b0a4e1fb87/llvm/utils/benchmark/test/donotoptimize_assembly_test.cc
> 
> This code IS more formatted than the the previous one (not 100% correct but 
> close enough) and so having the default to true would cause unnecessary churn 
> here.
> 
> Then of course there must be other projects that use BreakAfterExtern=true 
> and they would get the indentation and want to keep it, so the setting of the 
> default value of IndentExternBlock  needs to be dynamic if possible, don't 
> you think.
> 
> To be honest your change should support actually allowing this some of these 
> files to now support keeping its format correclty, which in my view is great! 
> but breaking the default styles is always hard, because we get complaints 
> that different versions of clang-format can cause huge waves of changes and 
> I've seen unless teams are all on the same version then the format can 
> flipflop between versions.
> 
> 
> 
Yes, this test is defaulting to IndentExternBlock = false, because when I was 
initially looking at examples of C code for Google's style, Micorosft, WebKit, 
LLVM, etc (all the built in styles) it appeared that LLVM does not indent their 
extern blocks.

As for linkage-spec.cpp, that file indents extern blocks, and 
donotoptimize_assembly_test.cc doesn't as you pointed out.

As for why I chose to default LLVM to indenting, I don't remember which files 
specifically gave me the impression that LLVM indents.

----

As for changing the default behavior, I agree It sucks, but I'm not sure how we 
could have this feature without changing the behavior.

Maybe I should just remove the default for LLVM, or maybe I shouldn't default 
to anything for any style period?


================
Comment at: clang/unittests/Format/FormatTest.cpp:2505
+  verifyFormat("extern \"C\" {}", Style);
+  verifyFormat("extern \"C\" {\n  int foo();\n}", Style);
+
----------------
MyDeveloperDay wrote:
> nit: these are a little easier to read when formatted as above
> 
> ```
> verifyFormat("extern \"C\" {\n"
>                       "  int foo();\n"
>                       "}", Style);
> ```
Yeah, it really tripped me up reading these string literals when they were cut 
up into multiple pieces but without commas between them, so that's why I wrote 
these this way.

I'm not against breaking them up, it was just initially confusing to me.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D75791/new/

https://reviews.llvm.org/D75791



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to