.. title:: clang-tidy - bugprone-suspicious-semicolon

bugprone-suspicious-semicolon
=============================

Finds most instances of stray semicolons that unexpectedly alter the meaning of
the code. More specifically, it looks for ``if``, ``while``, ``for`` and
``for-range`` statements whose body is a single semicolon, and then analyzes the
context of the code (e.g. indentation) in an attempt to determine whether that
is intentional.

  .. code-block:: c++

    if (x < y);
    {
      x++;
    }

Here the body of the ``if`` statement consists of only the semicolon at the end
of the first line, and `x` will be incremented regardless of the condition.


  .. code-block:: c++

    while ((line = readLine(file)) != NULL);
      processLine(line);

As a result of this code, `processLine()` will only be called once, when the
``while`` loop with the empty body exits with `line == NULL`. The indentation of
the code indicates the intention of the programmer.


  .. code-block:: c++

    if (x >= y);
    x -= y;

While the indentation does not imply any nesting, there is simply no valid
reason to have an `if` statement with an empty body (but it can make sense for
a loop). So this check issues a warning for the code above.

To solve the issue remove the stray semicolon or in case the empty body is
intentional, reflect this using code indentation or put the semicolon in a new
line. For example:

  .. code-block:: c++

    while (readWhitespace());
      Token t = readNextToken();

Here the second line is indented in a way that suggests that it is meant to be
the body of the `while` loop - whose body is in fact empty, because of the
semicolon at the end of the first line.

Either remove the indentation from the second line:

  .. code-block:: c++

    while (readWhitespace());
    Token t = readNextToken();

... or move the semicolon from the end of the first line to a new line:

  .. code-block:: c++

    while (readWhitespace())
      ;

      Token t = readNextToken();

In this case the check will assume that you know what you are doing, and will
not raise a warning.
