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

    <tr>
        <th>Summary</th>
        <td>
            [clang-format] Add `Leave` option for `AlwaysBreakTemplateDeclarations`
        </td>
    </tr>

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

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

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

<pre>
    Currently `AlwaysBreakTemplateDeclarations` (`BreakTemplateDeclarationsStyle`) has 3 possible options: Yes, No, and MultiLine.
However, for some projects it's not enough due to the sheer volume of possibilities. The fact that there can also be attributes, requires clauses, and compiler-specific stuff like __declspec doesn't make it any easier.

Since it seems quite hard (and out of scope) to cover all possibilities, it would be nice if there was just one additional option **`Leave`**, to keep existing template break formatting as is.

### Example
Base config:
```
BasedOnStyle: LLVM
RequiresClausePosition: WithPreceding
IndentRequiresClause: false
PenaltyBreakTemplateDeclaration: 0
```

#### AlwaysBreakTemplateDeclarations: Yes
```
template <auto x>
constexpr int simple(int) {
  char c;
  return 1;
}

template <auto x>
requires(x > 1)
constexpr int with_req(int) {
  char c;
 return 1;
}
```

#### AlwaysBreakTemplateDeclarations: No
For this example it's same as `MultiLine`.
```
template <auto x> constexpr int simple(int) {
  char c;
  return 1;
}

template <auto x> requires(x > 1)
constexpr int with_req(int) {
  char c;
  return 1;
}
```

#### AlwaysBreakTemplateDeclarations: **Leave**
With this proposed option clang-format is supposed to neither remove a break nor insert it. The `RequiresClausePosition` still ought to be respected.
```
template <auto x>
constexpr int simple(int) {
 char c;
  return 1;
}

template <auto x> requires(x > 1)
constexpr int with_req(int) {
  char c;
  return 1;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVlFv4zYM_jXKC9FAllM7echD2l6wAb1bsTts2FMhy3Ssiyy5Ip02_35Q7Hbt0N56wG7AAEEGRIrip4_6TE1kdx5xLc4vxPnVTA_chrjuw177sNezKtTH9eUQI3p2RxCF3Lh7faSLiHr_BbveacYrNE5HzTZ4EoUEoZaikG-6fOajQ1FIoVbQaoIc-kBkK4cQ-jFIvoE_kIS6hE8hzdrX8HFwbK-tx7mQV0Jufgr3eMCYzE2IQKFD6GP4ioYJLAtVEvjAgD4MuxbqAYEDcItALWKEQ3BDhxCa6XjrLFukOXxpERptGLjVacKIYLQH7ShAhaCZo60GHhOMeDfYiATG6YHGtZSuCV1vHcYz6tHYxhogHpoGnN0j3N7WaFyyQB2QvFAlQ6f3CJZB-yOgJotxQjrOn603JzshdgR3g2WEVsc63Xc6MQyc0JAJPaa75QAmHDCCdu4lxpSjZbgPg6sTIm9T5GbCeq8Jvg7EEDyCrmubONFuIgeE2qRRyGvUh5HH04K6TCfuEXvAB0ts_Q54oh-qVAyJp07zyaIJLL3AJ1Q-DvjwoLve4bh8oQnBBN_YncgfXQs5jSeX-hc_1lW-gevr3z6Oll8nci5P3NwEOmFJPr9bbm8iGqyt343OP_saPb_cklwb7WhK5ga9dnx8q7STt3w1xb9BTCj_6SFNb-C1aE_XKvJLPXCAB5F_GE0meGJ86CNYz0D2dJFqaT2nkhDlxegGYFodwYj8aSEiD9FD9rQkyqvnyX_j0Mc3INTyAUT-ATKhVq_lc2-5vY14966MvpHQv3G5n8K4bxsicGsJcCy7R-0g3WEqU1HIJ-kRhZy_nxH4j8mAH8PDjyZi1I9RTUYpOYVJL3Qkpo-hD4T1owIZp_3ubBQTsAQ09KOdA3i0ScUgYhcOCHpSHh8ScMLIYHmUeFHIN-ShkEBsnYP04-AUtUKImOSasf6OAvi-J_m_L4JZvc7rVb7SM1xnpTzPlkpm5axdlxKzZpmVhdaVxJWSy1JWVZ1VC7lQZmVmdq2kWsgsy1W2kFk5z5vG1HmhTCFXK5VrsZDYaevmzh26eYi7mSUacF0uZVHOnK7Q0amHUep5dQilUlcT12nbWTXsSCyks8T0VyC27E79z4uN51ewqWt49pt7rL7UbLyrD5oN0a1b5j5VuVBbobY7y-1QzU3ohNqmDKbP2dS4CLU94SKhtidofwYAAP__JO3-gA">