xref: /aosp_15_r20/external/cronet/base/notreached.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_NOTREACHED_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_NOTREACHED_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/logging_buildflags.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1520664): Remove once NOTIMPLEMENTED() call sites include
14*6777b538SAndroid Build Coastguard Worker // base/notimplemented.h.
15*6777b538SAndroid Build Coastguard Worker #include "base/notimplemented.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace logging {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // NOTREACHED() annotates should-be unreachable code. When a base::NotFatalUntil
20*6777b538SAndroid Build Coastguard Worker // milestone is provided the instance is non-fatal (dumps without crashing)
21*6777b538SAndroid Build Coastguard Worker // until that milestone is hit. That is: `NOTREACHED(base::NotFatalUntil::M120)`
22*6777b538SAndroid Build Coastguard Worker // starts crashing in M120. See base/check.h.
23*6777b538SAndroid Build Coastguard Worker //
24*6777b538SAndroid Build Coastguard Worker // Under the kNotReachedIsFatal experiment all NOTREACHED() without a milestone
25*6777b538SAndroid Build Coastguard Worker // argument are fatal. As of 2024-03-19 this experiment is 50/50 enabled on M124
26*6777b538SAndroid Build Coastguard Worker // Canary and Dev with intent to roll out to stable in M124 absent any blocking
27*6777b538SAndroid Build Coastguard Worker // issues that come up.
28*6777b538SAndroid Build Coastguard Worker //
29*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/851128): After kNotReachedIsFatal is universally rolled out
30*6777b538SAndroid Build Coastguard Worker // then move callers without a non-fatal milestone argument to
31*6777b538SAndroid Build Coastguard Worker // NOTREACHED_NORETURN(). Then rename the [[noreturn]] version back to
32*6777b538SAndroid Build Coastguard Worker // NOTREACHED().
33*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM() || BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED)
34*6777b538SAndroid Build Coastguard Worker #define NOTREACHED(...)        \
35*6777b538SAndroid Build Coastguard Worker   LOGGING_CHECK_FUNCTION_IMPL( \
36*6777b538SAndroid Build Coastguard Worker       ::logging::NotReachedError::NotReached(__VA_ARGS__), false)
37*6777b538SAndroid Build Coastguard Worker #else
38*6777b538SAndroid Build Coastguard Worker #define BASE_HAS_VA_ARGS(...) 1
39*6777b538SAndroid Build Coastguard Worker #define NOTREACHED(...)                                            \
40*6777b538SAndroid Build Coastguard Worker   BASE_IF(BASE_IS_EMPTY(__VA_ARGS__),                              \
41*6777b538SAndroid Build Coastguard Worker           (true) ? ::logging::NotReachedError::TriggerNotReached() \
42*6777b538SAndroid Build Coastguard Worker                  : EAT_CHECK_STREAM_PARAMS(),                      \
43*6777b538SAndroid Build Coastguard Worker           LOGGING_CHECK_FUNCTION_IMPL(                             \
44*6777b538SAndroid Build Coastguard Worker               ::logging::NotReachedError::NotReached(__VA_ARGS__), false))
45*6777b538SAndroid Build Coastguard Worker #endif
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker // NOTREACHED_NORETURN() annotates paths that are supposed to be unreachable.
48*6777b538SAndroid Build Coastguard Worker // They crash if they are ever hit.
49*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/851128): Rename back to NOTREACHED() once there are no callers
50*6777b538SAndroid Build Coastguard Worker // of the old non-CHECK-fatal macro.
51*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM()
52*6777b538SAndroid Build Coastguard Worker #define NOTREACHED_NORETURN() ::logging::NotReachedNoreturnError()
53*6777b538SAndroid Build Coastguard Worker #else
54*6777b538SAndroid Build Coastguard Worker // This function is used to be able to detect NOTREACHED() failures in stack
55*6777b538SAndroid Build Coastguard Worker // traces where this symbol is preserved (even if inlined). Its implementation
56*6777b538SAndroid Build Coastguard Worker // matches logging::CheckFailure() but intentionally uses a different signature.
57*6777b538SAndroid Build Coastguard Worker [[noreturn]] IMMEDIATE_CRASH_ALWAYS_INLINE void NotReachedFailure() {
58*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker #define NOTREACHED_NORETURN() \
62*6777b538SAndroid Build Coastguard Worker   (true) ? ::logging::NotReachedFailure() : EAT_CHECK_STREAM_PARAMS()
63*6777b538SAndroid Build Coastguard Worker #endif
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker // The DUMP_WILL_BE_NOTREACHED_NORETURN() macro provides a convenient way to
66*6777b538SAndroid Build Coastguard Worker // non-fatally dump in official builds if ever hit. See DUMP_WILL_BE_CHECK for
67*6777b538SAndroid Build Coastguard Worker // suggested usage.
68*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_NOTREACHED_NORETURN() \
69*6777b538SAndroid Build Coastguard Worker   ::logging::CheckError::DumpWillBeNotReachedNoreturn()
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker }  // namespace logging
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker #endif  // BASE_NOTREACHED_H_
74