From e7fe9ec9ebfc6607765d489b76c9954e0a88c5d4 Mon Sep 17 00:00:00 2001 From: Lawrence Wolf-Sonkin Date: Thu, 29 Feb 2024 15:42:07 -0800 Subject: [absl] Mark `absl::NoDestructor` methods with `absl::Nonnull` as appropriate * It is stated in prose that the methods on `absl::NoDestructor` can never return a null pointer * Now this is annotated via nullability annotations as well PiperOrigin-RevId: 611619075 Change-Id: I078a5628430b7b221c009a5dcb849efe30409c28 --- absl/base/BUILD.bazel | 5 ++++- absl/base/CMakeLists.txt | 1 + absl/base/no_destructor.h | 19 ++++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel index 1eb8f098..f0e3e63f 100644 --- a/absl/base/BUILD.bazel +++ b/absl/base/BUILD.bazel @@ -74,7 +74,10 @@ cc_library( hdrs = ["no_destructor.h"], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [":config"], + deps = [ + ":config", + ":nullability", + ], ) cc_library( diff --git a/absl/base/CMakeLists.txt b/absl/base/CMakeLists.txt index 4cfc2285..09c622ab 100644 --- a/absl/base/CMakeLists.txt +++ b/absl/base/CMakeLists.txt @@ -62,6 +62,7 @@ absl_cc_library( "no_destructor.h" DEPS absl::config + absl::nullability COPTS ${ABSL_DEFAULT_COPTS} ) diff --git a/absl/base/no_destructor.h b/absl/base/no_destructor.h index ab689133..7b46456c 100644 --- a/absl/base/no_destructor.h +++ b/absl/base/no_destructor.h @@ -41,6 +41,7 @@ #include #include "absl/base/config.h" +#include "absl/base/nullability.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -140,11 +141,11 @@ class NoDestructor { // Pretend to be a smart pointer to T with deep constness. // Never returns a null pointer. T& operator*() { return *get(); } - T* operator->() { return get(); } - T* get() { return impl_.get(); } + absl::Nonnull operator->() { return get(); } + absl::Nonnull get() { return impl_.get(); } const T& operator*() const { return *get(); } - const T* operator->() const { return get(); } - const T* get() const { return impl_.get(); } + absl::Nonnull operator->() const { return get(); } + absl::Nonnull get() const { return impl_.get(); } private: class DirectImpl { @@ -152,8 +153,8 @@ class NoDestructor { template explicit constexpr DirectImpl(Args&&... args) : value_(std::forward(args)...) {} - const T* get() const { return &value_; } - T* get() { return &value_; } + absl::Nonnull get() const { return &value_; } + absl::Nonnull get() { return &value_; } private: T value_; @@ -165,14 +166,14 @@ class NoDestructor { explicit PlacementImpl(Args&&... args) { new (&space_) T(std::forward(args)...); } - const T* get() const { + absl::Nonnull get() const { return Launder(reinterpret_cast(&space_)); } - T* get() { return Launder(reinterpret_cast(&space_)); } + absl::Nonnull get() { return Launder(reinterpret_cast(&space_)); } private: template - static P* Launder(P* p) { + static absl::Nonnull Launder(absl::Nonnull p) { #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606L return std::launder(p); #elif ABSL_HAVE_BUILTIN(__builtin_launder) -- cgit v1.2.3