xref: /aosp_15_r20/external/dynamic_depth/internal/base/macros.h (revision a62be0856e8e1158f43b03e41bbad10f4d005fde)
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