1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40

base / logging_nocompile.nc [blame]

// 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}}