<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/102268>102268</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-format "BraceWrapping.AfterControlStatement: Always" causes break before "break"
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-format
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          detly
      </td>
    </tr>
</table>

<pre>
    Consider this source:

```c
int do_thing(int magic)
{
    switch (magic)
    {
        case 0:
        {
            if (0)
 {
                return 0;
            }
 else
            {
                return 1;
            }
 } break;
    }

    return 0;
}
```

...and this `.clang-format`:

```yaml
BasedOnStyle: WebKit
Language: Cpp

BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: true
  AfterControlStatement: Always
  AfterFunction: true
 BeforeElse: true

IndentCaseLabels: true
IndentCaseBlocks: false
```

Running `clang-format` puts the `break` on a new line:

```c
int do_thing(int magic)
{
    switch (magic)
 {
        case 0:
        {
            if (0)
            {
 return 0;
            }
            else
 {
                return 1;
            }
        }
 break;
    }

    return 0;
}
```


If, on the other hand, I remove the `AfterControlStatement: Always` option, the `break` stays where it is, but the braces after the `if` statements are now put on the same line as the `if`:

```c
int do_thing(int magic)
{
    switch (magic) {
        case 0:
        {
            if (0) {
 return 0;
            }
            else {
 return 1;
            }
        } break;
    }

    return 0;
}
```

This is confusing to me, because I would expect it to not affect a brace _before_ the `break` control statement, since it only concerns breaking _after_ control statements. There seems to be no combination of `BraceWrapping` options that preserves the original code.

Tested with `clang-format` 18 and 19, on Ubuntu 24.04.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8lsFu4zgPx5_GuRA1ZDl10oMPTfsFKL4BFtiZxRwLWaZt7chSINHN5u0XtJOmnmS3A8x0jSJNyD9pWvxRsorRtA6xTG43ye3jQg3U-VDWSPawqHx9KB-8i6bGANSZCNEPQWOS3yfiMRGnz0JMf3r6bRxB7Z-pM65N5Jp_9qo1OpF3x4DVZvoCABD3hnQHiVzPReybCfnSKiKI1_ufzBc6vkzDScU54VUVXwFpCI7zXhEkq8ejEW3Ea_5_z5q9kzVZPUIVUH2b6V79Z9NFlWfNqQFvQ9I0Va6e2pYUItVWufam8aFXxNJ_6OFB9XYybVTE-jf3mQ6WOw5fsfq_ocn3Sbl2UO1of9jt3mba8LNssPEBN0FpjKNmiOT7k0Bp_BrUbsd8nFt53xCGBxXxk6rQchSFAede7yh4-5kUYY-OWHRv9-oQZ7Lt4DQZ777LMRX1P-7izDF9PrkaHb3eP841Z-_Gev1t9DbqFYirHfh9cM64llf_u8WH3UARqEP2Tc0vBHgHChzuwRr3H83Yrx2wq1Pxg8P15nozZz87XBeGj5i0IyFNIh-4h9xWTx0G6JSr2fgEAXv_gqeOv8cys7AbAZYPF5REUocI-w4DgiEwkUXVQKOwGicOFN_gFGmaY9h0nwgqIDi_ZwhP9UbV44gdqDiL-2AMfxWAP83bZYIfR-tDoPrC-7aJoL1rhsjbCHnocWw2ajVEhCfY-8HWgH_tUBPDQB6cJ1BNwwY14QDP1bjxPV-gpCcEz2xw9micHsnyzh5YojG4OD0jl_E8wvV8GRxT-DJSGRH7yLVUzBlo31fGKeYZfMMFzE-AV9qZPEWwCxgxvOAEog-mNU5Z0L7GdLZCGAlr2Bvqrm2x2Rr4_MvujmP5RzU4GkAuU7FMF3WZ13f5nVpgma1kLoRcFnLRldndumhu1arJi3WeZ9jU2W0tlpkQRZVnRb0wpRRyKdZiJfLlainTYq1y0ai8wGaV6UYkS4G9Mja19qVPfWgXJsYBy0xIWawXdjxcxvctKWc1S8lvYKHkuJtqaGOyFNZEiudMZMhi-TYKEilny5m-t7lICSM-x5bCBAfnmbiQcjEEW3ZEOz7lErlN5LY11A1Vqn2fyC2Xc_x3swv-T9SUyO34lDGR2-ODvpTy7wAAAP__SE3hew">