2023-10-14 16:36:01 +00:00
|
|
|
// Copyright 2023 Google LLC. All rights reserved.
|
2016-01-06 23:52:18 +00:00
|
|
|
//
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file or at
|
|
|
|
// https://developers.google.com/open-source/licenses/bsd
|
|
|
|
|
2023-10-14 16:36:01 +00:00
|
|
|
#ifndef PACKAGER_MACROS_COMPILER_H_
|
|
|
|
#define PACKAGER_MACROS_COMPILER_H_
|
|
|
|
|
|
|
|
/// A macro to declare that you intentionally did not use a parameter. Useful
|
|
|
|
/// when implementing abstract interfaces.
|
|
|
|
#define UNUSED(x) (void)(x)
|
2016-01-06 23:52:18 +00:00
|
|
|
|
|
|
|
// 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__) && __cplusplus >= 201103L && defined(__has_warning)
|
|
|
|
#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
|
|
|
|
#define FALLTHROUGH_INTENDED [[clang::fallthrough]] // NOLINT
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef FALLTHROUGH_INTENDED
|
2022-12-16 00:53:36 +00:00
|
|
|
#define FALLTHROUGH_INTENDED [[fallthrough]]
|
2016-01-06 23:52:18 +00:00
|
|
|
#endif
|
|
|
|
|
2023-10-14 16:36:01 +00:00
|
|
|
#endif // PACKAGER_MACROS_COMPILER_H_
|