2727#ifndef ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
2828#define ABSL_LOG_INTERNAL_LOG_MESSAGE_H_
2929
30+ #include < cstddef>
3031#include < ios>
3132#include < memory>
3233#include < ostream>
3334#include < streambuf>
3435#include < string>
36+ #include < type_traits>
3537
3638#include " absl/base/attributes.h"
3739#include " absl/base/config.h"
3840#include " absl/base/internal/errno_saver.h"
3941#include " absl/base/log_severity.h"
42+ #include " absl/base/nullability.h"
4043#include " absl/log/internal/nullguard.h"
4144#include " absl/log/log_entry.h"
4245#include " absl/log/log_sink.h"
@@ -56,15 +59,15 @@ class LogMessage {
5659 struct ErrorTag {};
5760
5861 // Used for `LOG`.
59- LogMessage (const char * file, int line,
62+ LogMessage (absl::Nonnull< const char *> file, int line,
6063 absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD;
6164 // These constructors are slightly smaller/faster to call; the severity is
6265 // curried into the function pointer.
63- LogMessage (const char * file, int line,
66+ LogMessage (absl::Nonnull< const char *> file, int line,
6467 InfoTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
65- LogMessage (const char * file, int line,
68+ LogMessage (absl::Nonnull< const char *> file, int line,
6669 WarningTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
67- LogMessage (const char * file, int line,
70+ LogMessage (absl::Nonnull< const char *> file, int line,
6871 ErrorTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
6972 LogMessage (const LogMessage&) = delete ;
7073 LogMessage& operator =(const LogMessage&) = delete ;
@@ -95,59 +98,67 @@ class LogMessage {
9598 // of `errno`.
9699 LogMessage& WithPerror ();
97100 // Sends this message to `*sink` in addition to whatever other sinks it would
98- // otherwise have been sent to. `sink` must not be null.
99- LogMessage& ToSinkAlso (absl::LogSink* sink);
100- // Sends this message to `*sink` and no others. `sink` must not be null.
101- LogMessage& ToSinkOnly (absl::LogSink* sink);
101+ // otherwise have been sent to.
102+ LogMessage& ToSinkAlso (absl::Nonnull<absl:: LogSink*> sink);
103+ // Sends this message to `*sink` and no others.
104+ LogMessage& ToSinkOnly (absl::Nonnull<absl:: LogSink*> sink);
102105
103106 // Don't call this method from outside this library.
104107 LogMessage& InternalStream () { return *this ; }
105108
106109 // By-value overloads for small, common types let us overlook common failures
107110 // to define globals and static data members (i.e. in a .cc file).
108- // clang-format off
109- // The CUDA toolchain cannot handle these <<<'s:
111+ // NOLINTBEGIN(runtime/int)
112+ // NOLINTBEGIN(google-runtime-int)
113+ // clang-format off: The CUDA toolchain cannot handle these <<<'s
110114 LogMessage& operator <<(char v) { return operator << <char >(v); }
111115 LogMessage& operator <<(signed char v) { return operator << <signed char >(v); }
112116 LogMessage& operator <<(unsigned char v) {
113117 return operator << <unsigned char >(v);
114118 }
115- LogMessage& operator <<(signed short v) { // NOLINT
116- return operator << <signed short >(v); // NOLINT
119+ LogMessage& operator <<(signed short v) {
120+ return operator << <signed short >(v);
117121 }
118122 LogMessage& operator <<(signed int v) { return operator << <signed int >(v); }
119- LogMessage& operator <<(signed long v) { // NOLINT
120- return operator << <signed long >(v); // NOLINT
123+ LogMessage& operator <<(signed long v) {
124+ return operator << <signed long >(v);
121125 }
122- LogMessage& operator <<(signed long long v) { // NOLINT
123- return operator << <signed long long >(v); // NOLINT
126+ LogMessage& operator <<(signed long long v) {
127+ return operator << <signed long long >(v);
124128 }
125- LogMessage& operator <<(unsigned short v) { // NOLINT
126- return operator << <unsigned short >(v); // NOLINT
129+ LogMessage& operator <<(unsigned short v) {
130+ return operator << <unsigned short >(v);
127131 }
128132 LogMessage& operator <<(unsigned int v) {
129133 return operator << <unsigned int >(v);
130134 }
131- LogMessage& operator <<(unsigned long v) { // NOLINT
132- return operator << <unsigned long >(v); // NOLINT
135+ LogMessage& operator <<(unsigned long v) {
136+ return operator << <unsigned long >(v);
133137 }
134- LogMessage& operator <<(unsigned long long v) { // NOLINT
135- return operator << <unsigned long long >(v); // NOLINT
138+ LogMessage& operator <<(unsigned long long v) {
139+ return operator << <unsigned long long >(v);
140+ }
141+ LogMessage& operator <<(absl::Nullable<void *> v) {
142+ return operator << <void *>(v);
143+ }
144+ LogMessage& operator <<(absl::Nullable<const void *> v) {
145+ return operator << <const void *>(v);
136146 }
137- LogMessage& operator <<(void * v) { return operator << <void *>(v); }
138- LogMessage& operator <<(const void * v) { return operator << <const void *>(v); }
139147 LogMessage& operator <<(float v) { return operator << <float >(v); }
140148 LogMessage& operator <<(double v) { return operator << <double >(v); }
141149 LogMessage& operator <<(bool v) { return operator << <bool >(v); }
142150 // clang-format on
151+ // NOLINTEND(google-runtime-int)
152+ // NOLINTEND(runtime/int)
143153
144154 // These overloads are more efficient since no `ostream` is involved.
145155 LogMessage& operator <<(const std::string& v);
146156 LogMessage& operator <<(absl::string_view v);
147157
148158 // Handle stream manipulators e.g. std::endl.
149- LogMessage& operator <<(std::ostream& (*m)(std::ostream& os));
150- LogMessage& operator <<(std::ios_base& (*m)(std::ios_base& os));
159+ LogMessage& operator <<(absl::Nonnull<std::ostream& (*)(std::ostream & os)> m);
160+ LogMessage& operator <<(
161+ absl::Nonnull<std::ios_base& (*)(std::ios_base & os)> m);
151162
152163 // Literal strings. This allows us to record C string literals as literals in
153164 // the logging.proto.Value.
@@ -255,7 +266,7 @@ class LogMessage {
255266
256267 // We keep the data in a separate struct so that each instance of `LogMessage`
257268 // uses less stack space.
258- std::unique_ptr<LogMessageData> data_;
269+ absl::Nonnull< std::unique_ptr<LogMessageData> > data_;
259270};
260271
261272// Helper class so that `AbslStringify()` can modify the LogMessage.
@@ -273,7 +284,8 @@ class StringifySink final {
273284 }
274285
275286 // For types that implement `AbslStringify` using `absl::Format()`.
276- friend void AbslFormatFlush (StringifySink* sink, absl::string_view v) {
287+ friend void AbslFormatFlush (absl::Nonnull<StringifySink*> sink,
288+ absl::string_view v) {
277289 sink->Append (v);
278290 }
279291
@@ -315,27 +327,28 @@ LogMessage& LogMessage::operator<<(char (&buf)[SIZE]) {
315327// We instantiate these specializations in the library's TU to save space in
316328// other TUs. Since the template is marked `ABSL_ATTRIBUTE_NOINLINE` we will be
317329// emitting a function call either way.
330+ // NOLINTBEGIN(runtime/int)
331+ // NOLINTBEGIN(google-runtime-int)
318332extern template LogMessage& LogMessage::operator <<(const char & v);
319333extern template LogMessage& LogMessage::operator <<(const signed char & v);
320334extern template LogMessage& LogMessage::operator <<(const unsigned char & v);
321- extern template LogMessage& LogMessage::operator <<(const short & v); // NOLINT
322- extern template LogMessage& LogMessage::operator <<(
323- const unsigned short & v); // NOLINT
335+ extern template LogMessage& LogMessage::operator <<(const short & v);
336+ extern template LogMessage& LogMessage::operator <<(const unsigned short & v);
324337extern template LogMessage& LogMessage::operator <<(const int & v);
338+ extern template LogMessage& LogMessage::operator <<(const unsigned int & v);
339+ extern template LogMessage& LogMessage::operator <<(const long & v);
340+ extern template LogMessage& LogMessage::operator <<(const unsigned long & v);
341+ extern template LogMessage& LogMessage::operator <<(const long long & v);
342+ extern template LogMessage& LogMessage::operator <<(const unsigned long long & v);
325343extern template LogMessage& LogMessage::operator <<(
326- const unsigned int & v); // NOLINT
327- extern template LogMessage& LogMessage::operator <<(const long & v); // NOLINT
328- extern template LogMessage& LogMessage::operator <<(
329- const unsigned long & v); // NOLINT
330- extern template LogMessage& LogMessage::operator <<(
331- const long long & v); // NOLINT
344+ absl::Nullable<void *> const & v);
332345extern template LogMessage& LogMessage::operator <<(
333- const unsigned long long & v); // NOLINT
334- extern template LogMessage& LogMessage::operator <<(void * const & v);
335- extern template LogMessage& LogMessage::operator <<(const void * const & v);
346+ absl::Nullable<const void *> const & v);
336347extern template LogMessage& LogMessage::operator <<(const float & v);
337348extern template LogMessage& LogMessage::operator <<(const double & v);
338349extern template LogMessage& LogMessage::operator <<(const bool & v);
350+ // NOLINTEND(google-runtime-int)
351+ // NOLINTEND(runtime/int)
339352
340353extern template void LogMessage::CopyToEncodedBuffer<
341354 LogMessage::StringType::kLiteral >(absl::string_view str);
@@ -351,8 +364,9 @@ extern template void LogMessage::CopyToEncodedBuffer<
351364// message.
352365class LogMessageFatal final : public LogMessage {
353366 public:
354- LogMessageFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
355- LogMessageFatal (const char * file, int line,
367+ LogMessageFatal (absl::Nonnull<const char *> file,
368+ int line) ABSL_ATTRIBUTE_COLD;
369+ LogMessageFatal (absl::Nonnull<const char *> file, int line,
356370 absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD;
357371 [[noreturn]] ~LogMessageFatal ();
358372};
@@ -362,7 +376,8 @@ class LogMessageFatal final : public LogMessage {
362376// for DLOG(FATAL) variants.
363377class LogMessageDebugFatal final : public LogMessage {
364378 public:
365- LogMessageDebugFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
379+ LogMessageDebugFatal (absl::Nonnull<const char *> file,
380+ int line) ABSL_ATTRIBUTE_COLD;
366381 ~LogMessageDebugFatal ();
367382};
368383
@@ -371,15 +386,17 @@ class LogMessageQuietlyDebugFatal final : public LogMessage {
371386 // DLOG(QFATAL) calls this instead of LogMessageQuietlyFatal to make sure the
372387 // destructor is not [[noreturn]] even if this is always FATAL as this is only
373388 // invoked when DLOG() is enabled.
374- LogMessageQuietlyDebugFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
389+ LogMessageQuietlyDebugFatal (absl::Nonnull<const char *> file,
390+ int line) ABSL_ATTRIBUTE_COLD;
375391 ~LogMessageQuietlyDebugFatal ();
376392};
377393
378394// Used for LOG(QFATAL) to make sure it's properly understood as [[noreturn]].
379395class LogMessageQuietlyFatal final : public LogMessage {
380396 public:
381- LogMessageQuietlyFatal (const char * file, int line) ABSL_ATTRIBUTE_COLD;
382- LogMessageQuietlyFatal (const char * file, int line,
397+ LogMessageQuietlyFatal (absl::Nonnull<const char *> file,
398+ int line) ABSL_ATTRIBUTE_COLD;
399+ LogMessageQuietlyFatal (absl::Nonnull<const char *> file, int line,
383400 absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD;
384401 [[noreturn]] ~LogMessageQuietlyFatal ();
385402};
0 commit comments