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