// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This is a "No Compile Test" suite. // https://dev.chromium.org/developers/testing/no-compile-tests #include "base/logging.h" // LOG(FATAL) must be understood as [[noreturn]]. int Foo() { LOG(FATAL) << "I am [[noreturn]]!"; return 42; // expected-error {{'return' will never be executed}} } int Foo2() { LOG_ASSERT(false) << "I am [[noreturn]] (sometimes)!"; return 42; // expected-error {{'return' will never be executed}} } // It's important that our logging macros agree on [[noreturn]] in all build // configurations (or dead-code warnings become impossible to satisfy). As such // neither LOG(DFATAL) or DLOG(FATAL) may be understood as [[noreturn]]. This // non-void function not returning a value after LOG(DFATAL) and DLOG(FATAL) // should always be a compile error due to a missing return statement. int Bar() { // No LOG(DFATAL) macros should be understood as [[noreturn]] under any build // configurations. LOG(DFATAL) << "I am not [[noreturn]]!"; LOG_IF(DFATAL, true) << "I am not [[noreturn]]!"; PLOG(DFATAL) << "I am not [[noreturn]]!"; PLOG_IF(DFATAL, true) << "I am not [[noreturn]]!"; // Same as above but DLOG(FATAL) instead of LOG(DFATAL). DLOG(FATAL) << "I am not [[noreturn]]!"; DLOG_IF(FATAL, true) << "I am not [[noreturn]]!"; DPLOG(FATAL) << "I am not [[noreturn]]!"; DPLOG_IF(FATAL, true) << "I am not [[noreturn]]!"; DLOG_ASSERT(false) << "I am not [[noreturn]]!"; } // expected-error {{non-void function does not return a value}}