summaryrefslogtreecommitdiff
path: root/internal/base/macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'internal/base/macros.h')
-rw-r--r--internal/base/macros.h56
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