# Extra Clang Tools 8 documentation

## clang-tidy - cppcoreguidelines-avoid-goto

# cppcoreguidelines-avoid-goto

The usage of `goto` for control flow is error prone and should be replaced with looping constructs. Only forward jumps in nested loops are accepted.

This check implements ES.76 from the CppCoreGuidelines and 6.3.1 from High Integrity C++.

For more information on why to avoid programming with `goto` you can read the famous paper A Case against the GO TO Statement..

The check diagnoses `goto` for backward jumps in every language mode. These should be replaced with C/C++ looping constructs.

    // Bad, handwritten for loop.
    int i = 0;
    // Jump label for the loop
    loop_start:
    do_some_operation();

    if (i < 100) {
      ++i;
      goto loop_start;
    }

    // Better
    for(int i = 0; i < 100; ++i)
      do_some_operation();

Modern C++ needs `goto` only to jump out of nested loops.

    for(int i = 0; i < 100; ++i) {
      for(int j = 0; j < 100; ++j) {
        if (i * j > 500)
          goto early_exit;
      }
    }

    early_exit:
    some_operation();

All other uses of `goto` are diagnosed in C++.