diff options
Diffstat (limited to 'internal/base/macros.h')
-rw-r--r-- | internal/base/macros.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/internal/base/macros.h b/internal/base/macros.h new file mode 100644 index 0000000..925322f --- /dev/null +++ b/internal/base/macros.h @@ -0,0 +1,56 @@ +// This code is compiled directly on many platforms, including client +// platforms like Windows, Mac, and embedded systems. Before making +// any changes here, make sure that you're not breaking any platforms. +// + +#ifndef DYNAMIC_DEPTH_INTERNAL_BASE_MACROS_H_ // NOLINT +#define DYNAMIC_DEPTH_INTERNAL_BASE_MACROS_H_ // NOLINT + +#include <stddef.h> // For size_t +#include "base/port.h" + +// The FALLTHROUGH_INTENDED macro can be used to annotate implicit fall-through +// between switch labels: +// switch (x) { +// case 40: +// case 41: +// if (truth_is_out_there) { +// ++x; +// FALLTHROUGH_INTENDED; // Use instead of/along with annotations in +// // comments. +// } else { +// return x; +// } +// case 42: +// ... +// +// As shown in the example above, the FALLTHROUGH_INTENDED macro should be +// followed by a semicolon. It is designed to mimic control-flow statements +// like 'break;', so it can be placed in most places where 'break;' can, but +// only if there are no statements on the execution path between it and the +// next switch label. +// +// When compiled with clang in C++11 mode, the FALLTHROUGH_INTENDED macro is +// expanded to [[clang::fallthrough]] attribute, which is analysed when +// performing switch labels fall-through diagnostic ('-Wimplicit-fallthrough'). +// See clang documentation on language extensions for details: +// http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough +// +// When used with unsupported compilers, the FALLTHROUGH_INTENDED macro has no +// effect on diagnostics. +// +// In either case this macro has no effect on runtime behavior and performance +// of code. +#if defined(__clang__) && defined(LANG_CXX11) && defined(__has_warning) +#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") +#define FALLTHROUGH_INTENDED [[clang::fallthrough]] // NOLINT +#endif +#endif + +#ifndef FALLTHROUGH_INTENDED // NOLINT +#define FALLTHROUGH_INTENDED \ + do { \ + } while (0) +#endif + +#endif // DYNAMIC_DEPTH_INTERNAL_BASE_MACROS_H_ // NOLINT |