Home | History | Annotate | Download | only in base
      1 // This code is compiled directly on many platforms, including client
      2 // platforms like Windows, Mac, and embedded systems.  Before making
      3 // any changes here, make sure that you're not breaking any platforms.
      4 //
      5 
      6 #ifndef DYNAMIC_DEPTH_INTERNAL_BASE_MACROS_H_  // NOLINT
      7 #define DYNAMIC_DEPTH_INTERNAL_BASE_MACROS_H_  // NOLINT
      8 
      9 #include <stddef.h>  // For size_t
     10 #include "base/port.h"
     11 
     12 // The FALLTHROUGH_INTENDED macro can be used to annotate implicit fall-through
     13 // between switch labels:
     14 //  switch (x) {
     15 //    case 40:
     16 //    case 41:
     17 //      if (truth_is_out_there) {
     18 //        ++x;
     19 //        FALLTHROUGH_INTENDED;  // Use instead of/along with annotations in
     20 //                               // comments.
     21 //      } else {
     22 //        return x;
     23 //      }
     24 //    case 42:
     25 //      ...
     26 //
     27 //  As shown in the example above, the FALLTHROUGH_INTENDED macro should be
     28 //  followed by a semicolon. It is designed to mimic control-flow statements
     29 //  like 'break;', so it can be placed in most places where 'break;' can, but
     30 //  only if there are no statements on the execution path between it and the
     31 //  next switch label.
     32 //
     33 //  When compiled with clang in C++11 mode, the FALLTHROUGH_INTENDED macro is
     34 //  expanded to [[clang::fallthrough]] attribute, which is analysed when
     35 //  performing switch labels fall-through diagnostic ('-Wimplicit-fallthrough').
     36 //  See clang documentation on language extensions for details:
     37 //  http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
     38 //
     39 //  When used with unsupported compilers, the FALLTHROUGH_INTENDED macro has no
     40 //  effect on diagnostics.
     41 //
     42 //  In either case this macro has no effect on runtime behavior and performance
     43 //  of code.
     44 #if defined(__clang__) && defined(LANG_CXX11) && defined(__has_warning)
     45 #if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
     46 #define FALLTHROUGH_INTENDED [[clang::fallthrough]]  // NOLINT
     47 #endif
     48 #endif
     49 
     50 #ifndef FALLTHROUGH_INTENDED  // NOLINT
     51 #define FALLTHROUGH_INTENDED \
     52   do {                       \
     53   } while (0)
     54 #endif
     55 
     56 #endif // DYNAMIC_DEPTH_INTERNAL_BASE_MACROS_H_  // NOLINT
     57