<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60843>60843</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-format] Preprocessor directives lead to exessive indentation and other issues
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Flamefire
</td>
</tr>
</table>
<pre>
Given the following (reduced) `.clangformat` style file:
```
---
Language: Cpp
AllowShortFunctionsOnASingleLine: Inline
BasedOnStyle: 'LLVM'
IndentPPDirectives: AfterHash
IndentWidth: 4
NamespaceIndentation: Inner
CompactNamespaces: True
...
```
I am reformatting the following cpp file:
```
#ifdef TRIGGER_CLANGFORMAT_15+
# pragma suppress warning
#endif
namespace a { namespace b { namespace c {
class Foo {
#ifdef TRIGGER_CLANGFORMAT_14
# pragma suppress warning
#endif
std::string bar_;
public:
const std::string &bar() const { return bar_; }
};
}}} // namespace a::b::c
```
As you can see no changes are expected. However clang-format-15 up to 17 indent the whole class by an additional 4 spaces.
clang-format-14 does not do that but it breaks the member function into separate lines although `AllowShortFunctionsOnASingleLine` is set.
A bit more debugging:
- Removing `IndentPPDirectives` or the preprocessor directives fixes the behavior
- The value of `IndentPPDirectives` does not matter, i.e. Before/AfterHash both produce the bug (`None` is the same as removal, i.e. works)
- The bug on clang-format 15+ is triggered by the first preprocessor directive, the one on 14 by the 2nd. No effect of the first on 14 or 2nd on 15+ (i.e. that works) and the names/content seem to be irrelevant.
- The value of `PPIndentWidth` does not matter
- When disabling `CompactNamespaces` the 3 `namespace` declarations are put on separate lines but `namespace c` is already indented despite `NamespaceIndentation: Inner` (happens consistently on version 14-17) so might be a related issue
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVt1u2zwSfRr6ZmBBphzZvvCFk6zTAmkapMH2shiJI4lbihRIymnefjGU7Tj928Vn-I_i4czh4ZmRMATdWqKtuLoWV7czHGPn_HZvsKdGe5pVTr1u7_SBLMSOoHHGuBdtWxBy7UmNNSkhNyDKPKsN2rZxvscoyhxCfDUEjTYkip3Ib0V--i7z4zsN5_P59OcebTtiy3C4GYbp4o7zfemcj_vR1lE7Gz7b3RdtW0P32ibwR2v4X8JfYyD12X7h5Dwn5Or-_t-fhFxN8x-tIhsfH2-1pzrqAwVG7ZpI_gOG7hL0VavY8exyuvqAPYUBa5qmkclM6S35CXLj-gHreEam4M9-PJLLsuy3EhyzAvbgaVIwssbvFa-H4f-QU8hCN4oaeH76eHf3r6dvN_e7h7v956dPu-dviyshr884AIDBY9sjhHEYPIUAL-ittu0ZQ1bpZhrZ064AQayu4W1c_TSueXzJEWqDIcDeuYuZvxJd_lOWcHyFqFioYheiZ_Uq9N9E8Z5Veg1jZXR9FhVqZ0P8ZbmQZYVeyDW7fYLwnj3F0dtTcBCr27fQPHifkK-kNwi5F3J_IRlO2arpp_6LTXYBXt0INVoIRGAd1B3algKgJ6AfA9WRVAYf3AsdyEMqy_nkqvniCsYBooPFCnSycTLZS-cMHQ-pegW0gEppNjgaWMLk5Yz3lCi8D7kE5SiAdRGUg9hhhGqMoCNUnvB7SBl66ivy0ByLGLSNDgIN6DEScP0GQBM7N7Ydd5P_WfdlDjpAoJi9EwcqHaF3nkBRNbYtu-R0tHN4ot4d0nGW-W86QZmD84nu4GnwrqYQnAd1RkCjf9C0oYo6PGjnT6GfO4IDmpHANX8Of1aKS5y8kDegM8rgmsuehNyfOxFULnYweMc9dso4pq4ryvzBnQXgiYA9AQbwvDs056Avzn8PQm4uKXIQZ9-ZAlJXSMG8blvypNgEqfloH-IfxOA0jHGWP7BYnhZJqzJ4cEBNQ3VkOd5CTUDnGZQGKbWQ60Q4eefEGtCqtDIViZD72tnIhg1EPVu4ItDek6ED2pMLfj2Hx8fLbv6bIziu-9qRBaUDVuZokF-beZknQgXPnks3xaTasJPZpqkMhzHt9SeDc1lcLoX6eIpoPKF6PZYkKVAUBh2J0X-_7ZQ5q9fhMJANqTHpwCqZV85_IB900ny-WLGmwUGv2y6yeAieDHI2HcLpFjV9z9S2UJtigzPaLspVWV6timUx67Z1Xsh1s8ZysS7LatMUeSGR8mqdr1aLplnM9FbmssjlYrVY55u8yIg2uFnlqiBaVUssxDKnHrXJjDn0mfPtLGXflvl6WcwMVmRCehqR0tLLkZqU_HDit7xmXo1tEMvc6BDDW5Soo0mPMZfWFle38PiHUjaEim1EPygEfaCj-Enf5D0XO_ITgTAbvdl2MQ58R5-ad6tjN1ZZ7Xoh90zj-DMfvPsP1VHI_bRWyH3a3H8DAAD__-c0_1w">