<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Clang-format of Additions and Subtractions Uses an Opaque Logic and is Confusing"
   href="https://bugs.llvm.org/show_bug.cgi?id=42157">42157</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Clang-format of Additions and Subtractions Uses an Opaque Logic and is Confusing
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>8.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Windows NT
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Formatter
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>matthias.schaefer@versasec.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>djasper@google.com, klimek@google.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>.clang-format file:
Language: Cpp

After running clang-format the code is formatted as follows:
void Foo()
{
  var = (something) + 1;
  var = (something)-1;
  var = ((something)-1);
  (something) - 1;
  ((something)-1);
  var = (int)+1;
}

This formatting looks very inconsequent for several reasons:
- There are both plus and minus unary and binary operators, so the formatting
should not depend on the operator sign (compare statements 1 and 2).
- It seems that the formatting depends on whether the result of the operation
is assigned to a variable or not (compare statements 2 and 4).
- It seems that the previous bullet does not always apply (as the formatting in
statements 3 and 5 are identical).
- It seems that the formatting depends on the words written inside the
parentheses (compare statements 1 and 6).

I understand that it is difficult to decide for adding or for removing the
spaces as clang-format does not know if "something" is a type or an expression,
so it cannot deduce if the operation is binary or unary, but the logic above is
really confusing.

The easiest way to solve the inconsequences given above is to not touch
ambiguous code like this. Another solution is to use a heuristic which is
independent of the operator sign, of the usage of the result and of the words
written inside the parentheses. My suggestion is to look at the character after
the operator. If this character is a white space, you can assume the operator
is binary, otherwise you can assume the operator is unary. If the operator is
unary, the white space before the operator should be adjusted according to
SpaceAfterCStyleCast setting. This heuristic depends on the assumption that
binary operations are/shall always be formatted with white space around the
operator and that no other formatting option adds or removes the white space
after the operator as a whole.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>