zwliew added inline comments.

================
Comment at: clang/lib/Format/Format.cpp:3067
+  if (!ChildFormatTextToApply.empty()) {
+    assert(ChildFormatTextToApply.size() == 1);
+
----------------
zwliew wrote:
> HazardyKnusperkeks wrote:
> > zwliew wrote:
> > > HazardyKnusperkeks wrote:
> > > > zwliew wrote:
> > > > > Is there a reason behind limiting the number of children configs to 1 
> > > > > in this case? When the fallback is not used, more than 1 children 
> > > > > configs are allowed (line 3036).
> > > > > 
> > > > > Sorry for digging this up, I came across this seemingly arbitrary 
> > > > > decision when working on some changes to 
> > > > > https://reviews.llvm.org/D72326
> > > > Yeah but it doesn't happen, there is at most only one `.clang-format` 
> > > > in the parent directory path which is found. So we assert on that and 
> > > > then don't need to loop over what is exactly one element big.
> > > Thanks for the reply. However, I don't think that's true. Yes, it's only 
> > > possible to find one `.clang-format` file in the first parent directory. 
> > > But if it has `BasedOnStyle: InheritParentConfig` set, then we could find 
> > > another `.clang-format` file in the "grandparent" directory. In this 
> > > case, we'll have 2 elements in `ChildFormatTextToApply`, but only the 
> > > very first one will actually be applied.
> > > 
> > > To illustrate, suppose we have the following file structure:
> > > ```
> > > - .clang-format
> > > - foo
> > >   |- .clang-format
> > >   |- input.cpp
> > > ```
> > > 
> > > Both `.clang-format` files have `BasedOnStyle: InheritParentConfig` set. 
> > > When running `clang-format --style=file foo/input.cpp`, only the inner 
> > > config is applied on the fallback style, while the outer config is 
> > > ignored. When testing on a debug build, I encountered a crash due to the 
> > > failed assert. When removing the assert, and using a loop to apply the 
> > > configs, both the inner and outer configs are applied, which I believe is 
> > > the expected behaviour.
> > > 
> > I can not explain it to you anymore, I would have to dig into it again. But 
> > if my tests are correct everything works. You can see that for `Test 9.4` I 
> > create a `.clang-format` in `/e/sub/sub/` which is based on 
> > `/e/sub/.clang-format` which again is based on `/e/.clang-format`.
> > 
> > The tests do not fail, the parsed style is as the three files suggest, and 
> > the assert holds. I'm pretty sure I have thought about that case, it 
> > happens in some kind of recursion.
> I took a look through `Test 9.4`, and it doesn't test the case I'm thinking 
> of, as it doesn't execute the fallback case.
> 
> In ` Test 9.4` the file structure is as follows:
> ```
> - e/
>   |- .clang-format (BasedOnStyle: Google) <-- outermost config
>   |- sub/
>     |- .clang-format (BasedOnStyle: `InheritParentConfig)
>     |- sub/
>       |- .clang-format (BasedOnStyle: InheritParentConfig)
>       |- code.cpp
> ```
> 
> The reason it doesn't execute the fallback case is that the outermost config 
> file doesn't have `BasedOnStyle: InheritParentConfig` set.
> 
> On the other hand, in the following directory structure, the fallback case 
> would execute, the assert would fail (on debug builds), and only the 
> innermost config would be applied (on release builds):
> ```
> - e/
>   |- .clang-format (BasedOnStyle: InheritParentConfig) <-- outermost config
>   |- sub/
>     |- .clang-format (BasedOnStyle: `InheritParentConfig)
>     |- sub/
>       |- .clang-format (BasedOnStyle: InheritParentConfig)
>       |- code.cpp
> ```
> 
> In order to verify my claims, I think I should write a new test case for 
> this. However, I do not know how to run test cases for only clang-format. Is 
> there a way to do so? Thanks! 
I added a new test case for the latter scenario and ran all the regression test 
cases with `make check-clang`. The test case does indeed fail due to the 
assertion failure. I've updated https://reviews.llvm.org/D72326 with the test 
case and the fix for it. Please have a look, thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D93844

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

Reply via email to