<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJztWFuP4jYU_jXhxZoIArPMPPAwl53VVtPuSt12HysnMeBiYmQ7MPn3_Y6dKzDstFtVrVSEIPFxzv3yOanOq8VnJbgVbGf0XuaCubVgPJVKuoo5zexOZHJZMb1cWuEsW2rDuFIsSu4yje2Kp0LJYsUyXVhnysxZkMCFO7blZoONN46vouSW0f6YPUTJPb5szS12GSGI5dZCwDd4RtM7Fo0fo_Fd-J3ELFPcgvQUNjGeZcLaWmUpjO1vZ4x9gWnRu_GuTJXMwA7XUfLgl3i24SvRrfEi9-tG7rmr13uMGTdglSRnNU161pM3vU1-aamV0gc8bWH-np6rdYHERgVcwsW14NqkuG9IArspYF62bY1rLx46YtDBy_fehhrcrIQjZ9uDdNmaFM-lk1B_IGQas5_4VuQDKa2IPuk1GSFV4LaVdtp7z8GgrSjcUBJiWKyuKAfgIEXPlbbNOl7UiRfy7ji-LC0dK7TzYjV-DHMHHbMnbBYvfLtT3p8ruRcF9khL-vzWl0jh7ilDt_5b8a0KS1dXV-HiHn7NPxU_u0pRQrAPWq9w5WkfixyGfZW5WxNpFlYftCq3xbPcSkerk3Et687b8aPOvRWfvIG04Srpc6M4Pgfvg7bkyg6EfYBbOzJyr6bGcXxkS9_Ar4IhNmdNzkJhtlGBp5-0ZtH8vol7VzhNIjBZIDQocfrnVOS97eFDlJRF00d2NYmm90eZFLZQ6d9wbHrvnXSODX0ok9jz3f3755ZRQ4rmj5c5P5IGk1dZBw0n5_gyuFhcemr8Vm3qkoNG6VlFfFlPBv79ln6eZgTfnFByseSlche4ner9OrcjizpiHY4jIUa40hQsHfA58Uqvu7ab9lrmDOPiBh7q0gVPttevpPVBlwo9SW7Qh9iB--HlYIvz4-pMo_aX0jrUkqp8w69bDfrI1ncUizZHrGL2c2g5GVhV1FEO6CvzWhrkoJl3VlwqK8wqfNmjsNKgg6aCxoA2VMGtlrbRI61Y8pZqZEefWshxt-yzpRzMSmOC7bbc7bRxpFDFBt0RMfi_1C-WzF8s9V6xH4XtK4cXewP-NBveYoynna3kfmf4fsl_Sw_pukifSV-rbyn0T_eb8PvFgztCGS-ElgGqPAwCzMhR3hmVlhGKU2FRM8Ju6Uc3YM5eqJiha-WQDpAjC19wCiCpzMGpYAfCi_3txKK0wj-VrbW2BJxLg_rmqPOYsV8s9bfeGhNFhjuASssOBiAPZEUtoda5BuSf9sJA0_4i5S0SeA2ZGviuqIIKHqQXwhInymoYutUAwny349RKoDRwVnmiBzSvLQEKLsIu4LRW9YcWIIOjXcsleWxFvVtVjeeMXK0Jt6JdEzO0Yic83DTe4V7REhXXqocmvZZYALHeDxRIBvB-zHDqSZXYxuxXbqQuyTc5qQ-wWuTc5ADqEKy8cA8gdxpdjrhbklYj3mdZlC9sI0yBOPF8r0madwJwqH-2MTUEqb8G_27wKx1yYYkRg8okmylgUPdMbFKRcSRCd7ToOc1qAEUz8FnMPgJEIxhHOXbw-YOp5x0_0IiSklA1yg1jw8pV4Wcf9f18jz9klNesH2RyyVofBC2X54wkRR0DuTpnaHMq7M5KSusNpYHWOfO5SHEjPI2pC0BNkcQAab3RP1YqmRoOOQXmt_WT3VU70UxCig0mf5ACq8AC6V2s3Lp6_WCSa-HPbCfn4zqx-ycyeILOJYE_ZbFXAjtbwJFVuOul4cmJBcOs0iWzogmxlxIG9MCvZBydRYPLvRSvj_cYXEQRIobEjWwFjii3oq4bepDqsDsDMnImceo1K3AZ5vAxGMJeGxjtpCClmkbY-ssDqc7czkOtkK6k_THuIO3bAFUzAP5r0_8i2L-k5-URS59LwP-SLZc5d5aem4f1OySe54MXRX0wQZnqUV24j9lno3facuXBb-5ft3RH3vpQ_G7cvInpjrsdKTT4APzpjF_XJloTnDBE2MMKeyWz_s2H_hPXgDx48rX3ASeO6x68_KrgC2b1JsSR_CpeMqGU73X9xojBq6JkMsoX0_x2estHvHRrbRY_6HXxME1GpVGLtXM70ioguhVaU5nGaAe4UWrf_F1hFv8O1IRbiS5FI-XpejqfzEfrxWTKl5N8ejO7fZfdiOyGz-Z5mqTXc47V2XQ-Ckm1iK7RGpJCHJhngevo-nH0_RrIRTJO8J2MJ_PxbDqO59M8uRlPr5fXs3w5meXRbCy2XKqY-MTarEZm4Vmm5cqCqND3bUdEG8ZUFcIrDA2ddEos_sRxFXOA07vEBmV0L8pk4cM1eMvF9C6096VUYuRtW3jD_gCojIaO>53717</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
treat all labeling constructs consistently by allowing for an offset in the _clang-format options file
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
JohnC32
</td>
</tr>
</table>
<pre>
Please provide the ability to specify offsets for all *code labeling constructs* that mark (tag) code. C++ has three forms of *code labeling constructs*:
1. class/struct access specifiers
The `public:`, `package:`, and `private:` specifiers are "labeling constructs" that mark the code that follows as having public, package, or private access.
2. case labels
Case labels mark code as the target of switch conditions.
3. Named labels
Named labels mark code as the targets for `goto` statements.
clang-format lets us specify an offset for access specifiers but not the other two. For example, given this `_clang-format`
```yaml
---
BasedOnStyle: Google
IndentWidth: 4
ColumnLimit: 100
AccessModifierOffset: -2
IndentCaseLabels: false
IndentGotoLabels: true
...
```
We get
```c++
class Foo {
public:
int f(int a) {
int b = -1;
if (a > 100) {
goto LABEL;
}
if (a == 1) {
b = 1;
} else {
b = 0;
}
switch (b) {
case 1:
b = 1;
break;
default:
b = 0;
break;
}
LABEL:
return b;
}
private:
void g();
};
```
We would like a way to treat all labeling constructs consistently and offset them the same way. Specifically, we'd like to have:
```c++
// Desired behavior: all labels offset by 2
class Foo {
public: // access specifier offset by 2 (currently supported by clang-format)
int f(int a) {
int b = -1;
if (a > 100) {
goto LABEL;
}
if (a == 1) {
b = 1;
} else {
b = 0;
}
switch (b) {
case 1: // Want case labels offset by 2
b = 1;
break;
default: // Want case labels offset by 2
b = 0;
break;
}
LABEL: // Want labels offset by 2
return b;
}
private:
void g();
};
```
The complexity of code is directly related to the indent level. We did an informal study on what indent level to use. We choose four spaces. Using four spaces encourages writing less complex code. Overly complex code (with too many levels of nesting) is more apparent when using four spaces to indent than when two spaces. Code that is shifted greatly to the right often indicates there is too much nesting, which is indicative of a complexity problem. Various coding standards highlight this point, such as the Linux kernel advocating for eight spaces. Using eight spaces makes it difficult to write overly complex code because the code is shifted so far to the right. In our informal study we found that eight spaces did not offer significant advantage over four spaces, however using eight spaces made it very difficult to write C++ code that looked good with a column limit of 100 because C++ has library names and type specifications that can be lengthy.
clang-format does have the ability to indent case labels, but that creates an inconsistency in complexity. For example, if you see code indented by eight spaces and are using an indent with of four, you can assume there are two conditions causing the indent of eight spaces. Specifically, these two pieces of code have the same complexity, but the indent indicates otherwise:
```c++
if (a == 1) {
b = 1;
} else {
b = 0;
}
switch (b) {
case 1:
b = 1;
break;
default:
b = 0;
break;
}
```
Please add offsets for case labels and goto labels. Proposal: add `CaseLabelsOffset` and `GotoLabelsOffset` which would give the above desired behavior. For example:
```yaml
---
BasedOnStyle: Google
IndentWidth: 4
ColumnLimit: 100
AccessModifierOffset: -2
IndentCaseLabels: false
CaseLabelsOffset: 2
IndentGotoLabels: true
GotoLabelsOffset: 2
...
```
Thanks for the excellent clang-format tool!
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWFuP4jYU_jXhxZooBGaYeeBhLjurrabdlXbbfayc2ICLiZHtwObf9ztOyAUYdnpR1UpFCBIf59wvn5MZUc0_acmdZFtrdkpI5leS8Uxp5SvmDXNbmatFxcxi4aR3bGEs41qzKL3PDbZrnkmtiiXLTeG8LXPvQAIX7tmG2zU23nq-jNI7Rvtj9hilD_iyFXfYZaUklhsHAd_hGU3uWZQ8Rcl9_TuOWa65A-m53sR4nkvnGpWVtK6_nTH2BaZFN8m2zLTKwQ7XUfoYlni-5kvZrfFChHWrdtw36z3GjFuwStOzmqY968mbwaawtDBamz2edjB_R881ukDiQQVcwsWN4MakuG9ICrspYEG2a41rLx47Yq1DkB-8DTW4XUpPznZ75fMVKS6UV1B_IGQSs5_4RoqBlFZEn_SajDpV4Lal8SZ4z8OgjSz8UBJiWCyvKAfgIE3Pla7NOl40iVfn3XF8WVZ6VhgfxBr8WOb3JmbP2Cy_8c1WB38u1U4W2KMc6fNrXyKFu6cM3YZvxTe6Xrq6uqovHuBX8bH47CtNCcHeG7PEVaB9KAQM-6qEXxFpWq8-Gl1uihe1UZ5Wx0kj6z7Y8aMRwYqPwUDacJX2uVEcX2rvg7bg2g2EvYdbOzJyr6HGcXxkS9_Ar5IhNmdNzuvCbKMCTz8bw6LZwyHuXeEcEoGpAqFBidM_pyLvba8_RMlYNHliV-No8nCUSfUWKv1bjk3vgpPOsaEPZRJ7uX9499IyOpCi2dNlzk-kwfhV1rWG43N8GVwsLz2VvFWbpuSgUXZWkVDW44F_v6dfoFnJ1ycUIRe81P4Ct1O9X-d2ZFFHbMJxJMRKX9qCZQM-J17pddd2084owTAubuGhLl3wZHv9SlrvTanRk9QafYjteRheHrb4MK7ONOpwqZxHLekqNPym1aCPbEJHcWhzxCpmn-uWk4NVRR1lj74ya6RBDpp5Z8WlssKswpc9SacsOmgmaQwYSxXcaukOemQVS99Sjezo0wg57pZ9tpSDeWltbbsrt1tjPSlUsUF3RAz-L_WLJfMnS71X7Edh-8rhxd6AP82GtxgTaGcrud8Z_rrkv6WHdF2kz6Sv1fcU-qf7Tf37JYA7QhnfCC0DVAUYBJghUN45lZaVmlNhUTPCbhVGN2DOTuqYoWsJSAfIUUUoOA2QVApwKtie8GJ_O7EonQxP5StjHAHn0qK-Oeo8ZuxnR_2tt8ZkkeMOoNKxvQXIA1lTS2h0bgD5x5200LS_SHmLBF5BpgG-K6pahQDSC-mIE2U1DN0YAGG-3XJqJVAaOKs80QOaN5YABRf1LuC0VvXHFiCDo1upBXlsSb1bVwfPWbVcEW5FuyZmaMVeBrhpg8ODoiUqrlUPTXqlsABisx8okAzg_Zjh1JNpuYnZL9wqU5JvBKkPsFoIbgWAOgTrIDwAyK1BlyPujqQ1iPdFFeU3tpa2QJy42BmSFpwAHBqePZhaB6m_Bv-u8as8cmGBEYPKJJspYFD3TGwymXMkQne06DnNGQBFO_BZzD4ARCMYRzm2D_mDqRccP9CIkpJQNcoNY8OpZRFmH_V9scMfMipo1g8yuWRl9pKWy3NGkqKegVydM_RwKuzOStqYNaWBMYKFXKS4EZ7G1AWgpkhigLTe6B8rtcosh5wC89uFye6rrTxMQooNJn8tBVaBBdK7WPpV9frBRBgZzmwn5-MmsfsnMniCziU1f8rioAR2toAjr3DXS8OTEwuGWWVK5uQhxEFKPaAHfiXj6CxauzxICfoEj8FFFCFiSNzIVuCIciObuqEHqQ67MyAjZxKnXrMCl2EOH4Mh7HU1o62SpNShEbb-CkCqM7fzUCukK-lwjNsr9zZAdRgA_7XpfxHsX9Lz8oilzyXgf8mWy5w7S8_Nw-YdEhdi8KKoDyYoUwOqq-9j9smarXFcB_ArwuuW7sjbHIpvksObmO6425HqBl8DfzrjN7WJ1gQnDBH2sMJeyax_86H_xDUgD5587X3AieO6By-_KviCWb2u40h-ld9yqXXodf3GiMGro3Q8EvOJuJvc8ZFXXsv5Hzh5oaVxei12GJjdOx9VBMmDFzbMbOtOtVBajkqr5yvvt2RzjReXaHxlFqPZ4Ebr3eHvCpP-N2Ay3Cr0QBpYz9eT2Xg2Ws2nIknT6V26SKbJTS5FcnedzLLkJhFTORnPZqM6ZefRNRpPWsg9CyxwHV0_jdQ8xeNJOk7Gs2Q6SeLZRKS3yeR6cT0Vi_FURNNEbrjSMekRG7sc2XlQKSuXDkQNV7iOiBaNiStlEAf-vPQrY-c_mFXxOElHQfQ8qP47O4xwSQ">