Export of internal Abseil changes

--
24162e64040e89f174531fa78fc0ff43c3a67da4 by Abseil Team <absl-team@google.com>:

Make ABSL_RETIRED_FLAG behave consistently with ABSL_FLAG.

Before the change:
ABSL_RETIRED_FLAG does not compile when there are competing ctors in the type, even when ABSL_FLAG does.

After the change:
ABSL_RETIRED_FLAG compiles when ABSL_FLAG does.

PiperOrigin-RevId: 286437395

--
870d4cb4d114813e9cefe30d26d020b0fdcdc4b4 by Tom Manshreck <shreck@google.com>:

Add docs on bind_front

PiperOrigin-RevId: 286433540

--
b0c328bd9bb64e0382f942f93b85054229dafeac by Tom Manshreck <shreck@google.com>:

Specify the format for LogSeverity flags

PiperOrigin-RevId: 286402811
GitOrigin-RevId: 24162e64040e89f174531fa78fc0ff43c3a67da4
Change-Id: I89785145d049fee49c6b9cf3357893ece9a6231c
This commit is contained in:
Abseil Team 2019-12-19 12:03:35 -08:00 committed by CJ Johnson
parent 7bd1935dcb
commit ad904b6cd3
5 changed files with 127 additions and 34 deletions

View file

@ -384,11 +384,19 @@ ABSL_NAMESPACE_END
//
// `default_value` is only used as a double check on the type. `explanation` is
// unused.
//
// ABSL_RETIRED_FLAG support omitting the default value for default
// constructible value type, so that users can delete the code generatring this
// value.
//
// TODO(rogeeff): Return an anonymous struct instead of bool, and place it into
// the unnamed namespace.
#define ABSL_RETIRED_FLAG(type, flagname, default_value, explanation) \
ABSL_ATTRIBUTE_UNUSED static const bool ignored_##flagname = \
([] { return type(default_value); }, \
ABSL_ATTRIBUTE_UNUSED static const bool ignored_##flagname = \
([] { \
return absl::flags_internal::MakeFromDefaultValueOrEmpty<type>( \
default_value); \
}, \
absl::flags_internal::RetiredFlag<type>(#flagname))
#endif // ABSL_FLAGS_FLAG_H_

View file

@ -486,11 +486,30 @@ TEST_F(FlagTest, TestNonDefaultConstructibleType) {
// --------------------------------------------------------------------
struct Wrapper {
Wrapper() {}
// NOLINTNEXTLINE(runtime/explicit)
Wrapper(const std::string& val) : val(val) {}
// NOLINTNEXTLINE(runtime/explicit)
template <typename T>
Wrapper(T&& t) : val(std::forward<T>(t)) {}
// NOLINTNEXTLINE(runtime/explicit)
operator std::string() const& { return val; }
std::string val;
};
} // namespace
ABSL_RETIRED_FLAG(bool, old_bool_flag, true, "old descr");
ABSL_RETIRED_FLAG(int, old_int_flag, (int)std::sqrt(10), "old descr");
ABSL_RETIRED_FLAG(std::string, old_str_flag, "", absl::StrCat("old ", "descr"));
ABSL_RETIRED_FLAG(Wrapper, old_wrapper_flag, {}, "old wrapper");
ABSL_RETIRED_FLAG(Wrapper, old_wrapper_no_default_flag, ,
"old wrapper no default");
namespace {
@ -502,6 +521,10 @@ TEST_F(FlagTest, TestRetiredFlagRegistration) {
EXPECT_FALSE(is_bool);
EXPECT_TRUE(flags::IsRetiredFlag("old_str_flag", &is_bool));
EXPECT_FALSE(is_bool);
EXPECT_TRUE(flags::IsRetiredFlag("old_wrapper_flag", &is_bool));
EXPECT_FALSE(is_bool);
EXPECT_TRUE(flags::IsRetiredFlag("old_wrapper_no_default_flag", &is_bool));
EXPECT_FALSE(is_bool);
EXPECT_FALSE(flags::IsRetiredFlag("some_other_flag", &is_bool));
}

View file

@ -416,6 +416,20 @@ T* MakeFromDefaultValue(EmptyBraces) {
return new T;
}
// MakeFromDefaultValueOrEmpty is basically the same as MakeFromDefaultValue. It
// also allows for empty macro parameter (hence no argument), which was somehow
// widely used for ABSL_RETIRED_FLAG().
template <typename T>
T* MakeFromDefaultValueOrEmpty(T t) {
return MakeFromDefaultValue(std::move(t));
}
template <typename T>
T* MakeFromDefaultValueOrEmpty() {
return MakeFromDefaultValue<T>(EmptyBraces());
}
} // namespace flags_internal
ABSL_NAMESPACE_END
} // namespace absl