diff --git a/absl/log/BUILD.bazel b/absl/log/BUILD.bazel index f90046b6..f565e2bc 100644 --- a/absl/log/BUILD.bazel +++ b/absl/log/BUILD.bazel @@ -234,6 +234,7 @@ cc_library( linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ "//absl/base:config", + "//absl/base:core_headers", "//absl/log/internal:structured", "//absl/strings", ], diff --git a/absl/log/CMakeLists.txt b/absl/log/CMakeLists.txt index 715b5b73..fb17149f 100644 --- a/absl/log/CMakeLists.txt +++ b/absl/log/CMakeLists.txt @@ -665,6 +665,7 @@ absl_cc_library( ${ABSL_DEFAULT_LINKOPTS} DEPS absl::config + absl::core_headers absl::log_internal_message absl::strings ) @@ -680,6 +681,7 @@ absl_cc_library( ${ABSL_DEFAULT_LINKOPTS} DEPS absl::config + absl::core_headers absl::log_internal_structured absl::strings PUBLIC diff --git a/absl/log/internal/BUILD.bazel b/absl/log/internal/BUILD.bazel index e954194d..982fffb7 100644 --- a/absl/log/internal/BUILD.bazel +++ b/absl/log/internal/BUILD.bazel @@ -281,6 +281,7 @@ cc_library( deps = [ ":log_message", "//absl/base:config", + "//absl/base:core_headers", "//absl/strings", ], ) diff --git a/absl/log/internal/structured.h b/absl/log/internal/structured.h index 5223dbc3..abc0a5aa 100644 --- a/absl/log/internal/structured.h +++ b/absl/log/internal/structured.h @@ -22,6 +22,7 @@ #include #include "absl/base/config.h" +#include "absl/base/attributes.h" #include "absl/log/internal/log_message.h" #include "absl/strings/string_view.h" @@ -31,14 +32,16 @@ namespace log_internal { class ABSL_MUST_USE_RESULT AsLiteralImpl final { public: - explicit AsLiteralImpl(absl::string_view str) : str_(str) {} + explicit AsLiteralImpl(absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) + : str_(str) {} AsLiteralImpl(const AsLiteralImpl&) = default; AsLiteralImpl& operator=(const AsLiteralImpl&) = default; private: absl::string_view str_; - friend std::ostream& operator<<(std::ostream& os, AsLiteralImpl as_literal) { + friend std::ostream& operator<<(std::ostream& os, + AsLiteralImpl&& as_literal) { return os << as_literal.str_; } void AddToMessage(log_internal::LogMessage& m) { diff --git a/absl/log/structured.h b/absl/log/structured.h index 9ad69fbd..89d241e4 100644 --- a/absl/log/structured.h +++ b/absl/log/structured.h @@ -32,6 +32,7 @@ #include +#include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/log/internal/structured.h" #include "absl/strings/string_view.h" @@ -60,7 +61,11 @@ ABSL_NAMESPACE_BEGIN // int line) { // LOG(LEVEL(severity)).AtLocation(file, line) << absl::LogAsLiteral(str); // } -inline log_internal::AsLiteralImpl LogAsLiteral(absl::string_view s) { +// +// `LogAsLiteral` should only be used as a streaming operand and not, for +// example, as a local variable initializer. +inline log_internal::AsLiteralImpl LogAsLiteral( + absl::string_view s ABSL_ATTRIBUTE_LIFETIME_BOUND) { return log_internal::AsLiteralImpl(s); }