1*6777b538SAndroid Build Coastguard Worker// Copyright 2023 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// This is a "No Compile Test" suite. 6*6777b538SAndroid Build Coastguard Worker// https://dev.chromium.org/developers/testing/no-compile-tests 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker#include "base/logging.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker// LOG(FATAL) must be understood as [[noreturn]]. 11*6777b538SAndroid Build Coastguard Workerint Foo() { 12*6777b538SAndroid Build Coastguard Worker LOG(FATAL) << "I am [[noreturn]]!"; 13*6777b538SAndroid Build Coastguard Worker return 42; // expected-error {{'return' will never be executed}} 14*6777b538SAndroid Build Coastguard Worker} 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Workerint Foo2() { 17*6777b538SAndroid Build Coastguard Worker LOG_ASSERT(false) << "I am [[noreturn]] (sometimes)!"; 18*6777b538SAndroid Build Coastguard Worker return 42; // expected-error {{'return' will never be executed}} 19*6777b538SAndroid Build Coastguard Worker} 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker// It's important that our logging macros agree on [[noreturn]] in all build 22*6777b538SAndroid Build Coastguard Worker// configurations (or dead-code warnings become impossible to satisfy). As such 23*6777b538SAndroid Build Coastguard Worker// neither LOG(DFATAL) or DLOG(FATAL) may be understood as [[noreturn]]. This 24*6777b538SAndroid Build Coastguard Worker// non-void function not returning a value after LOG(DFATAL) and DLOG(FATAL) 25*6777b538SAndroid Build Coastguard Worker// should always be a compile error due to a missing return statement. 26*6777b538SAndroid Build Coastguard Workerint Bar() { 27*6777b538SAndroid Build Coastguard Worker // No LOG(DFATAL) macros should be understood as [[noreturn]] under any build 28*6777b538SAndroid Build Coastguard Worker // configurations. 29*6777b538SAndroid Build Coastguard Worker LOG(DFATAL) << "I am not [[noreturn]]!"; 30*6777b538SAndroid Build Coastguard Worker LOG_IF(DFATAL, true) << "I am not [[noreturn]]!"; 31*6777b538SAndroid Build Coastguard Worker PLOG(DFATAL) << "I am not [[noreturn]]!"; 32*6777b538SAndroid Build Coastguard Worker PLOG_IF(DFATAL, true) << "I am not [[noreturn]]!"; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // Same as above but DLOG(FATAL) instead of LOG(DFATAL). 35*6777b538SAndroid Build Coastguard Worker DLOG(FATAL) << "I am not [[noreturn]]!"; 36*6777b538SAndroid Build Coastguard Worker DLOG_IF(FATAL, true) << "I am not [[noreturn]]!"; 37*6777b538SAndroid Build Coastguard Worker DPLOG(FATAL) << "I am not [[noreturn]]!"; 38*6777b538SAndroid Build Coastguard Worker DPLOG_IF(FATAL, true) << "I am not [[noreturn]]!"; 39*6777b538SAndroid Build Coastguard Worker DLOG_ASSERT(false) << "I am not [[noreturn]]!"; 40*6777b538SAndroid Build Coastguard Worker} // expected-error {{non-void function does not return a value}} 41