1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_NOTREACHED_H_
6 #define BASE_NOTREACHED_H_
7 
8 #include "base/check.h"
9 #include "base/logging_buildflags.h"
10 
11 namespace logging {
12 
13 #if BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED)
14 void BASE_EXPORT LogErrorNotReached(const char* file, int line);
15 #define NOTREACHED()                                       \
16   true ? ::logging::LogErrorNotReached(__FILE__, __LINE__) \
17        : EAT_CHECK_STREAM_PARAMS()
18 #else
19 #define NOTREACHED() DCHECK(false)
20 #endif
21 
22 // The NOTIMPLEMENTED() macro annotates codepaths which have not been
23 // implemented yet. If output spam is a serious concern,
24 // NOTIMPLEMENTED_LOG_ONCE can be used.
25 #if DCHECK_IS_ON()
26 #define NOTIMPLEMENTED()                                     \
27   ::logging::CheckError::NotImplemented(__FILE__, __LINE__,  \
28                                         __PRETTY_FUNCTION__) \
29       .stream()
30 #else
31 #define NOTIMPLEMENTED() EAT_CHECK_STREAM_PARAMS()
32 #endif
33 
34 #define NOTIMPLEMENTED_LOG_ONCE()    \
35   {                                  \
36     static bool logged_once = false; \
37     if (!logged_once) {              \
38       NOTIMPLEMENTED();              \
39       logged_once = true;            \
40     }                                \
41   }                                  \
42   EAT_CHECK_STREAM_PARAMS()
43 
44 }  // namespace logging
45 
46 #endif  // BASE_NOTREACHED_H_
47