diff options
23 files changed, 69 insertions, 140 deletions
diff --git a/cast/common/channel/message_util.cc b/cast/common/channel/message_util.cc index 79b942bd..44505501 100644 --- a/cast/common/channel/message_util.cc +++ b/cast/common/channel/message_util.cc @@ -37,7 +37,6 @@ std::string ToString(AppAvailabilityResult availability) { return "Unknown"; default: OSP_NOTREACHED(); - return "bad value"; } } diff --git a/cast/common/discovery/e2e_test/tests.cc b/cast/common/discovery/e2e_test/tests.cc index 373d1133..f39c39d5 100644 --- a/cast/common/discovery/e2e_test/tests.cc +++ b/cast/common/discovery/e2e_test/tests.cc @@ -105,7 +105,8 @@ class ServiceReceiver : public discovery::DnsSdServiceWatcher<ServiceInfo> { class FailOnErrorReporting : public discovery::ReportingClient { void OnFatalError(Error error) override { - OSP_NOTREACHED() << "Fatal error received: '" << error << "'"; + OSP_LOG_FATAL << "Fatal error received: '" << error << "'"; + OSP_NOTREACHED(); } void OnRecoverableError(Error error) override { @@ -282,10 +283,8 @@ class DiscoveryE2ETest : public testing::Test { return; } - if (attempts++ > kMaxCheckLoopIterations) { - OSP_NOTREACHED() << "Service " << service_info.friendly_name - << " publication failed."; - } + OSP_CHECK_LE(attempts++, kMaxCheckLoopIterations) + << "Service " << service_info.friendly_name << " publication failed."; task_runner_->PostTaskWithDelay( [this, info = std::move(service_info), has_been_seen, attempts]() mutable { @@ -315,8 +314,7 @@ class DiscoveryE2ETest : public testing::Test { // TODO(crbug.com/openscreen/110): Log the discovered service instance. *has_been_seen = true; } else { - OSP_NOTREACHED() << "Found instance '" << service_info.friendly_name - << "'!"; + OSP_LOG_FATAL << "Found instance '" << service_info.friendly_name << "'!"; } } }; diff --git a/cast/receiver/channel/receiver_socket_factory.cc b/cast/receiver/channel/receiver_socket_factory.cc index 5ad7246a..c8ddd691 100644 --- a/cast/receiver/channel/receiver_socket_factory.cc +++ b/cast/receiver/channel/receiver_socket_factory.cc @@ -32,7 +32,7 @@ void ReceiverSocketFactory::OnConnected( TlsConnectionFactory* factory, std::vector<uint8_t> der_x509_peer_cert, std::unique_ptr<TlsConnection> connection) { - OSP_NOTREACHED() << "This factory is accept-only."; + OSP_LOG_FATAL << "This factory is accept-only"; } void ReceiverSocketFactory::OnConnectionFailed( diff --git a/cast/sender/cast_app_discovery_service_impl.cc b/cast/sender/cast_app_discovery_service_impl.cc index fd071ca2..4ca9a016 100644 --- a/cast/sender/cast_app_discovery_service_impl.cc +++ b/cast/sender/cast_app_discovery_service_impl.cc @@ -174,7 +174,6 @@ bool CastAppDiscoveryServiceImpl::ShouldRefreshAppAvailability( } OSP_NOTREACHED(); - return false; } void CastAppDiscoveryServiceImpl::RemoveAvailabilityCallback(uint32_t id) { diff --git a/cast/sender/channel/sender_socket_factory.cc b/cast/sender/channel/sender_socket_factory.cc index a1f24ef0..e971976b 100644 --- a/cast/sender/channel/sender_socket_factory.cc +++ b/cast/sender/channel/sender_socket_factory.cc @@ -59,7 +59,8 @@ void SenderSocketFactory::OnAccepted( TlsConnectionFactory* factory, std::vector<uint8_t> der_x509_peer_cert, std::unique_ptr<TlsConnection> connection) { - OSP_NOTREACHED() << "This factory is connect-only."; + OSP_NOTREACHED(); + OSP_LOG_FATAL << "This factory is connect-only"; } void SenderSocketFactory::OnConnected( diff --git a/cast/streaming/environment.cc b/cast/streaming/environment.cc index 16cbb64f..c3e7bea0 100644 --- a/cast/streaming/environment.cc +++ b/cast/streaming/environment.cc @@ -61,7 +61,6 @@ int Environment::GetMaxPacketSize() const { return kMaxRtpPacketSizeForIpv6UdpOnEthernet; default: OSP_NOTREACHED(); - return 0; } } diff --git a/cast/streaming/offer_messages.cc b/cast/streaming/offer_messages.cc index 163c0b0c..9ed6e1d9 100644 --- a/cast/streaming/offer_messages.cc +++ b/cast/streaming/offer_messages.cc @@ -264,7 +264,6 @@ absl::string_view ToString(Stream::Type type) { return kVideoSourceType; default: { OSP_NOTREACHED(); - return ""; } } } @@ -317,7 +316,6 @@ std::string CastMode::ToString() const { return kCastRemoting; default: OSP_NOTREACHED(); - return ""; } } diff --git a/cast/test/cast_socket_e2e_test.cc b/cast/test/cast_socket_e2e_test.cc index becfdb22..bfd1bbf9 100644 --- a/cast/test/cast_socket_e2e_test.cc +++ b/cast/test/cast_socket_e2e_test.cc @@ -67,7 +67,7 @@ class SenderSocketsClient : public SenderSocketFactory::Client, void OnError(SenderSocketFactory* factory, const IPEndpoint& endpoint, Error error) override { - OSP_NOTREACHED() << error; + OSP_LOG_FATAL << error; } // VirtualConnectionRouter::SocketErrorHandler overrides. @@ -112,7 +112,7 @@ class ReceiverSocketsClient } void OnError(ReceiverSocketFactory* factory, Error error) override { - OSP_NOTREACHED() << error; + OSP_LOG_FATAL << error; } // VirtualConnectionRouter::SocketErrorHandler overrides. diff --git a/discovery/dnssd/impl/dns_data_graph.cc b/discovery/dnssd/impl/dns_data_graph.cc index 036c7985..9e6f166e 100644 --- a/discovery/dnssd/impl/dns_data_graph.cc +++ b/discovery/dnssd/impl/dns_data_graph.cc @@ -575,7 +575,6 @@ DnsDataGraphImpl::DomainGroup DnsDataGraph::GetDomainGroup(DnsType type) { return DnsDataGraphImpl::DomainGroup::kPtr; default: OSP_NOTREACHED(); - return DnsDataGraphImpl::DomainGroup::kNone; } } diff --git a/discovery/mdns/mdns_record_changed_callback.h b/discovery/mdns/mdns_record_changed_callback.h index a5518578..d725b1c4 100644 --- a/discovery/mdns/mdns_record_changed_callback.h +++ b/discovery/mdns/mdns_record_changed_callback.h @@ -5,6 +5,8 @@ #ifndef DISCOVERY_MDNS_MDNS_RECORD_CHANGED_CALLBACK_H_ #define DISCOVERY_MDNS_MDNS_RECORD_CHANGED_CALLBACK_H_ +#include <vector> + #include "discovery/mdns/mdns_records.h" #include "util/osp_logging.h" @@ -51,9 +53,7 @@ inline std::ostream& operator<<(std::ostream& output, case RecordChangedEvent::kExpired: return output << "Expiry"; } - OSP_NOTREACHED(); - return output; } } // namespace discovery diff --git a/discovery/mdns/mdns_responder.cc b/discovery/mdns/mdns_responder.cc index 953828e3..4486eacf 100644 --- a/discovery/mdns/mdns_responder.cc +++ b/discovery/mdns/mdns_responder.cc @@ -52,8 +52,7 @@ std::chrono::seconds GetTtlForNsecTargetingType(DnsType type) { break; } - OSP_NOTREACHED() << "NSEC records do not support type " << type; - return std::chrono::seconds(0); + OSP_NOTREACHED(); } MdnsRecord CreateNsecRecord(DomainName target_name, diff --git a/discovery/mdns/public/mdns_constants.h b/discovery/mdns/public/mdns_constants.h index ecaa18bb..fdfa9b78 100644 --- a/discovery/mdns/public/mdns_constants.h +++ b/discovery/mdns/public/mdns_constants.h @@ -329,7 +329,6 @@ inline std::ostream& operator<<(std::ostream& output, DnsType type) { } OSP_NOTREACHED(); - return output; } constexpr std::array<DnsType, 7> kSupportedDnsTypes = { diff --git a/osp/impl/quic/testing/fake_quic_connection.cc b/osp/impl/quic/testing/fake_quic_connection.cc index da436e85..511ceee1 100644 --- a/osp/impl/quic/testing/fake_quic_connection.cc +++ b/osp/impl/quic/testing/fake_quic_connection.cc @@ -5,6 +5,7 @@ #include "osp/impl/quic/testing/fake_quic_connection.h" #include <memory> +#include <utility> #include "osp/impl/quic/testing/fake_quic_connection_factory.h" #include "util/osp_logging.h" @@ -62,16 +63,15 @@ std::unique_ptr<FakeQuicStream> FakeQuicConnection::MakeIncomingStream() { } void FakeQuicConnection::OnRead(UdpSocket* socket, ErrorOr<UdpPacket> data) { - OSP_NOTREACHED() << "data should go directly to fake streams"; + OSP_NOTREACHED(); } void FakeQuicConnection::OnSendError(UdpSocket* socket, Error error) { - OSP_NOTREACHED() << "data should go directly to fake streams"; + OSP_NOTREACHED(); } -void FakeQuicConnection::OnError(UdpSocket* socket, Error error) { - OSP_NOTREACHED() << "data should go directly to fake streams"; -} +void FakeQuicConnection::OnError(UdpSocket* socket, + Error error){OSP_NOTREACHED()} std::unique_ptr<QuicStream> FakeQuicConnection::MakeOutgoingStream( QuicStream::Delegate* delegate) { diff --git a/osp/impl/testing/fake_mdns_responder_adapter.cc b/osp/impl/testing/fake_mdns_responder_adapter.cc index 77289c3a..a73e6dae 100644 --- a/osp/impl/testing/fake_mdns_responder_adapter.cc +++ b/osp/impl/testing/fake_mdns_responder_adapter.cc @@ -236,15 +236,15 @@ Error FakeMdnsResponderAdapter::DeregisterInterface(UdpSocket* socket) { void FakeMdnsResponderAdapter::OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet) { - OSP_NOTREACHED() << "Tests should not drive this class with packets"; + OSP_NOTREACHED(); } void FakeMdnsResponderAdapter::OnSendError(UdpSocket* socket, Error error) { - OSP_NOTREACHED() << "Tests should not drive this class with packets"; + OSP_NOTREACHED(); } void FakeMdnsResponderAdapter::OnError(UdpSocket* socket, Error error) { - OSP_NOTREACHED() << "Tests should not drive this class with packets"; + OSP_NOTREACHED(); } Clock::duration FakeMdnsResponderAdapter::RunTasks() { diff --git a/osp/public/message_demuxer.cc b/osp/public/message_demuxer.cc index 209bba01..f9166942 100644 --- a/osp/public/message_demuxer.cc +++ b/osp/public/message_demuxer.cc @@ -5,6 +5,7 @@ #include "osp/public/message_demuxer.h" #include <memory> +#include <utility> #include "osp/impl/quic/quic_connection.h" #include "platform/base/error.h" @@ -44,7 +45,6 @@ ErrorOr<uint64_t> MessageTypeDecoder::DecodeVarUint( return ReadBigEndian<uint64_t>(&buffer[0]) & ~(uint64_t{0xC0} << 56); default: OSP_NOTREACHED(); - return Error::Code::kCborParsing; } } diff --git a/platform/api/logging.h b/platform/api/logging.h index 6080b77c..a958ce5a 100644 --- a/platform/api/logging.h +++ b/platform/api/logging.h @@ -55,7 +55,7 @@ void LogWithLevel(LogLevel level, // embedder could invoke its infrastructure for performing "dumps," consisting // of thread stack traces and other relevant process state information, before // aborting the process. -void Break(); +[[noreturn]] void Break(); } // namespace openscreen diff --git a/platform/impl/logging_posix.cc b/platform/impl/logging_posix.cc index 6e9564c9..e666998a 100644 --- a/platform/impl/logging_posix.cc +++ b/platform/impl/logging_posix.cc @@ -22,7 +22,6 @@ namespace { int g_log_fd = STDERR_FILENO; LogLevel g_log_level = LogLevel::kWarning; std::vector<std::string>* g_log_messages_for_test = nullptr; -bool* g_break_was_called_for_test = nullptr; std::ostream& operator<<(std::ostream& os, const LogLevel& level) { const char* level_string = ""; @@ -110,11 +109,10 @@ void LogWithLevel(LogLevel level, } } -void Break() { - if (g_break_was_called_for_test) { - *g_break_was_called_for_test = true; - return; - } +[[noreturn]] void Break() { +// Generally this will just resolve to an abort anyways, but gives the +// compiler a chance to peform a more appropriate, target specific trap +// as appropriate. #if defined(_DEBUG) __builtin_trap(); #else @@ -126,8 +124,4 @@ void SetLogBufferForTest(std::vector<std::string>* messages) { g_log_messages_for_test = messages; } -void DisableBreakForTest(bool* break_was_called) { - g_break_was_called_for_test = break_was_called; -} - } // namespace openscreen diff --git a/platform/impl/logging_test.h b/platform/impl/logging_test.h index 75d9c052..fe03ac4a 100644 --- a/platform/impl/logging_test.h +++ b/platform/impl/logging_test.h @@ -19,15 +19,6 @@ namespace openscreen { // in memory. void SetLogBufferForTest(std::vector<std::string>* messages); -// Disables the mechanism to abort a process on an assertion failure. -// -// ***DANGEROUS!*** This will effectively disable assertion enforcement and -// should only be called for assertion macro tests. -// -// *break_was_called will be set to true when Break() is called afterwards. -// Calling with nullptr re-enables normal assertion behavior. -void DisableBreakForTest(bool* break_was_called); - } // namespace openscreen #endif // PLATFORM_IMPL_LOGGING_TEST_H_ diff --git a/platform/impl/logging_unittest.cc b/platform/impl/logging_unittest.cc index 84018b3f..fe04da62 100644 --- a/platform/impl/logging_unittest.cc +++ b/platform/impl/logging_unittest.cc @@ -25,17 +25,15 @@ class LoggingTest : public ::testing::Test { previous_log_level = GetLogLevel(); SetLogLevel(LogLevel::kInfo); SetLogBufferForTest(&log_messages); + testing::FLAGS_gtest_death_test_style = "threadsafe"; } void TearDown() { SetLogLevel(previous_log_level); SetLogBufferForTest(nullptr); - DisableBreakForTest(nullptr); } protected: - void DisableBreak() { DisableBreakForTest(&break_was_called); } - void ExpectLog(LogLevel level, absl::string_view message) { const char* level_string = ""; switch (level) { @@ -78,20 +76,6 @@ class LoggingTest : public ::testing::Test { log_messages.clear(); } - void ExpectBreakAndClear() { - EXPECT_TRUE(break_was_called); - break_was_called = false; - } - - void ExpectDebugBreakAndClear() { -#if OSP_DCHECK_IS_ON() - EXPECT_TRUE(break_was_called); - break_was_called = false; -#else - EXPECT_FALSE(break_was_called); -#endif // OSP_DCHECK_IS_ON() - } - private: struct LogMessage { std::string level; @@ -99,7 +83,6 @@ class LoggingTest : public ::testing::Test { }; std::vector<std::string> log_messages; std::vector<LogMessage> expected_messages; - bool break_was_called = false; LogLevel previous_log_level = LogLevel::kWarning; }; @@ -209,79 +192,55 @@ TEST_F(LoggingTest, DebugConditionalLogging) { } TEST_F(LoggingTest, CheckAndLogFatal) { - DisableBreak(); + ASSERT_DEATH(OSP_CHECK(false), ".*OSP_CHECK\\(false\\) failed: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK(false) failed: "); - OSP_CHECK(false); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_CHECK_EQ(1, 2), + ".*OSP_CHECK\\(\\(1\\) == \\(2\\)\\) failed: 1 vs\\. 2: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) == (2)) failed: 1 vs. 2: "); - OSP_CHECK_EQ(1, 2); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_CHECK_NE(1, 1), + ".*OSP_CHECK\\(\\(1\\) != \\(1\\)\\) failed: 1 vs\\. 1: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) != (1)) failed: 1 vs. 1: "); - OSP_CHECK_NE(1, 1); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_CHECK_LT(2, 1), + ".*OSP_CHECK\\(\\(2\\) < \\(1\\)\\) failed: 2 vs\\. 1: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((2) < (1)) failed: 2 vs. 1: "); - OSP_CHECK_LT(2, 1); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_CHECK_LE(2, 1), + ".*OSP_CHECK\\(\\(2\\) <= \\(1\\)\\) failed: 2 vs\\. 1: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((2) <= (1)) failed: 2 vs. 1: "); - OSP_CHECK_LE(2, 1); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_CHECK_GT(1, 2), + ".*OSP_CHECK\\(\\(1\\) > \\(2\\)\\) failed: 1 vs\\. 2: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) > (2)) failed: 1 vs. 2: "); - OSP_CHECK_GT(1, 2); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_CHECK_GE(1, 2), + ".*OSP_CHECK\\(\\(1\\) >= \\(2\\)\\) failed: 1 vs\\. 2: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) >= (2)) failed: 1 vs. 2: "); - OSP_CHECK_GE(1, 2); - ExpectBreakAndClear(); - - ExpectLog(LogLevel::kFatal, "Fatal"); - OSP_LOG_FATAL << "Fatal"; - ExpectBreakAndClear(); + ASSERT_DEATH((OSP_LOG_FATAL << "Fatal"), ".*Fatal"); VerifyLogs(); } TEST_F(LoggingTest, DCheckAndDLogFatal) { - DisableBreak(); - - ExpectLog(LogLevel::kFatal, "OSP_CHECK(false) failed: "); - OSP_DCHECK(false); - ExpectDebugBreakAndClear(); +#if OSP_DCHECK_IS_ON() + ASSERT_DEATH(OSP_DCHECK(false), ".*OSP_CHECK\\(false\\) failed: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) == (2)) failed: 1 vs. 2: "); - OSP_DCHECK_EQ(1, 2); - ExpectDebugBreakAndClear(); + ASSERT_DEATH(OSP_DCHECK_EQ(1, 2), + ".*OSP_CHECK\\(\\(1\\) == \\(2\\)\\) failed: 1 vs\\. 2: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) != (1)) failed: 1 vs. 1: "); - OSP_DCHECK_NE(1, 1); - ExpectDebugBreakAndClear(); + ASSERT_DEATH(OSP_DCHECK_NE(1, 1), + ".*OSP_CHECK\\(\\(1\\) != \\(1\\)\\) failed: 1 vs\\. 1: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((2) < (1)) failed: 2 vs. 1: "); - OSP_DCHECK_LT(2, 1); - ExpectDebugBreakAndClear(); + ASSERT_DEATH(OSP_DCHECK_LT(2, 1), + ".*OSP_CHECK\\(\\(2\\) < \\(1\\)\\) failed: 2 vs\\. 1: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((2) <= (1)) failed: 2 vs. 1: "); - OSP_DCHECK_LE(2, 1); - ExpectDebugBreakAndClear(); + ASSERT_DEATH(OSP_DCHECK_LE(2, 1), + ".*OSP_CHECK\\(\\(2\\) <= \\(1\\)\\) failed: 2 vs\\. 1: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) > (2)) failed: 1 vs. 2: "); - OSP_DCHECK_GT(1, 2); - ExpectDebugBreakAndClear(); + ASSERT_DEATH(OSP_DCHECK_GT(1, 2), + ".*OSP_CHECK\\(\\(1\\) > \\(2\\)\\) failed: 1 vs\\. 2: "); - ExpectLog(LogLevel::kFatal, "OSP_CHECK((1) >= (2)) failed: 1 vs. 2: "); - OSP_DCHECK_GE(1, 2); - ExpectDebugBreakAndClear(); + ASSERT_DEATH(OSP_DCHECK_GE(1, 2), + ".*OSP_CHECK\\(\\(1\\) >= \\(2\\)\\) failed: 1 vs\\. 2: "); - ExpectLog(LogLevel::kFatal, "Fatal"); - OSP_DLOG_FATAL << "Fatal"; - ExpectDebugBreakAndClear(); + ASSERT_DEATH((OSP_DLOG_FATAL << "Fatal"), ".*Fatal"); -#if OSP_DCHECK_IS_ON() VerifyLogs(); #else VerifyNoLogs(); @@ -309,13 +268,7 @@ TEST_F(LoggingTest, OspUnimplemented) { } TEST_F(LoggingTest, OspNotReached) { - DisableBreak(); - ExpectLog(LogLevel::kFatal, "TestBody: NOTREACHED() hit."); - - OSP_NOTREACHED(); - - VerifyLogs(); - ExpectBreakAndClear(); + ASSERT_DEATH(OSP_NOTREACHED(), ".*TestBody: NOTREACHED\\(\\) hit."); } } // namespace openscreen diff --git a/platform/impl/socket_address_posix.cc b/platform/impl/socket_address_posix.cc index 0795fe50..a4ea5981 100644 --- a/platform/impl/socket_address_posix.cc +++ b/platform/impl/socket_address_posix.cc @@ -19,7 +19,8 @@ SocketAddressPosix::SocketAddressPosix(const struct sockaddr& address) { memcpy(&internal_address_, &address, sizeof(struct sockaddr_in6)); RecomputeEndpoint(IPAddress::Version::kV6); } else { - OSP_NOTREACHED() << "Unknown address type"; + // Not IPv4 or IPv6. + OSP_NOTREACHED(); } } @@ -50,7 +51,6 @@ struct sockaddr* SocketAddressPosix::address() { return reinterpret_cast<struct sockaddr*>(&internal_address_.v6); default: OSP_NOTREACHED(); - return nullptr; } } @@ -62,7 +62,6 @@ const struct sockaddr* SocketAddressPosix::address() const { return reinterpret_cast<const struct sockaddr*>(&internal_address_.v6); default: OSP_NOTREACHED(); - return nullptr; } } @@ -74,7 +73,6 @@ socklen_t SocketAddressPosix::size() const { return sizeof(struct sockaddr_in6); default: OSP_NOTREACHED(); - return 0; } } diff --git a/platform/test/paths_internal_other.cc b/platform/test/paths_internal_other.cc index e8083cbb..883bb245 100644 --- a/platform/test/paths_internal_other.cc +++ b/platform/test/paths_internal_other.cc @@ -10,7 +10,6 @@ namespace openscreen { // NOTE: This is only for linking purposes in Chromium builds. std::string GetExePath() { OSP_NOTREACHED(); - return {}; } } // namespace openscreen diff --git a/util/crypto/openssl_util.cc b/util/crypto/openssl_util.cc index 505ac715..63664a7d 100644 --- a/util/crypto/openssl_util.cc +++ b/util/crypto/openssl_util.cc @@ -92,10 +92,6 @@ Error GetSSLError(const SSL* ssl, int return_code) { case SSL_ERROR_SSL: return Error(Error::Code::kFatalSSLError, std::move(message)); } - - OSP_NOTREACHED() << "Unknown SSL error occurred. All error cases should " - "be covered in the above switch statement. Error code: " - << error_code << ", message: " << message; - return Error(Error::Code::kUnknownError, std::move(message)); + OSP_NOTREACHED(); } } // namespace openscreen diff --git a/util/osp_logging.h b/util/osp_logging.h index 65dd3e41..9c478ce0 100644 --- a/util/osp_logging.h +++ b/util/osp_logging.h @@ -133,6 +133,13 @@ class Voidify { } \ } -#define OSP_NOTREACHED() OSP_LOG_FATAL << __func__ << ": NOTREACHED() hit." +// Since Break() is annotated as noreturn, this will properly signal to the +// compiler that this code is truly not reached (and thus doesn't need a return +// statement for non-void returning functions/methods). +#define OSP_NOTREACHED() \ + { \ + OSP_LOG_FATAL << __func__ << ": NOTREACHED() hit."; \ + Break(); \ + } #endif // UTIL_OSP_LOGGING_H_ |