Export of internal Abseil changes

--
8726480d631a3736347f542dab5628d5e2ace3c1 by Mark Barolak <mbar@google.com>:

Import of CCTZ from GitHub.

PiperOrigin-RevId: 323414814

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

Fix buffer overflow when the result of demangling doesn't fit.

PiperOrigin-RevId: 323392968

--
7ed3e514519a971322d0a3333c7e85ed1f2a5f71 by Gennadiy Rozental <rogeeff@google.com>:

Move ABSL_DEPRECATED and ABSL_FALLTHROUGH_INTENDED from base.h into attribute.h.

PiperOrigin-RevId: 323137526

--
fc0afdb0792d565065d25feb9680972218355f90 by Xiaoyi Zhang <zhangxy@google.com>:

Add documentation for `absl::StatusCode`.

PiperOrigin-RevId: 323065623
GitOrigin-RevId: 8726480d631a3736347f542dab5628d5e2ace3c1
Change-Id: I9d39650e49ff265cd2dafee302013694e97c813f
pull/751/head
Abseil Team 4 years ago committed by Mark Barolak
parent 2c8a5b0d89
commit d39fe6cd6f
  1. 79
      absl/base/attributes.h
  2. 79
      absl/base/macros.h
  3. 7
      absl/debugging/internal/demangle.cc
  4. 113
      absl/status/status.h
  5. 12
      absl/time/internal/cctz/src/time_zone_info.cc

@ -594,6 +594,85 @@
#define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) #define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes)
#endif #endif
// ABSL_FALLTHROUGH_INTENDED
//
// Annotates implicit fall-through between switch labels, allowing a case to
// indicate intentional fallthrough and turn off warnings about any lack of a
// `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by
// a semicolon and can be used in most places where `break` can, provided that
// no statements exist between it and the next switch label.
//
// Example:
//
// switch (x) {
// case 40:
// case 41:
// if (truth_is_out_there) {
// ++x;
// ABSL_FALLTHROUGH_INTENDED; // Use instead of/along with annotations
// // in comments
// } else {
// return x;
// }
// case 42:
// ...
//
// Notes: when compiled with clang in C++11 mode, the ABSL_FALLTHROUGH_INTENDED
// macro is expanded to the [[clang::fallthrough]] attribute, which is analysed
// when performing switch labels fall-through diagnostic
// (`-Wimplicit-fallthrough`). See clang documentation on language extensions
// for details:
// https://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
//
// When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro
// has no effect on diagnostics. In any case this macro has no effect on runtime
// behavior and performance of code.
#ifdef ABSL_FALLTHROUGH_INTENDED
#error "ABSL_FALLTHROUGH_INTENDED should not be defined."
#endif
// TODO(zhangxy): Use c++17 standard [[fallthrough]] macro, when supported.
#if defined(__clang__) && defined(__has_warning)
#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
#define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]]
#endif
#elif defined(__GNUC__) && __GNUC__ >= 7
#define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]]
#endif
#ifndef ABSL_FALLTHROUGH_INTENDED
#define ABSL_FALLTHROUGH_INTENDED \
do { \
} while (0)
#endif
// ABSL_DEPRECATED()
//
// Marks a deprecated class, struct, enum, function, method and variable
// declarations. The macro argument is used as a custom diagnostic message (e.g.
// suggestion of a better alternative).
//
// Examples:
//
// class ABSL_DEPRECATED("Use Bar instead") Foo {...};
//
// ABSL_DEPRECATED("Use Baz() instead") void Bar() {...}
//
// template <typename T>
// ABSL_DEPRECATED("Use DoThat() instead")
// void DoThis();
//
// Every usage of a deprecated entity will trigger a warning when compiled with
// clang's `-Wdeprecated-declarations` option. This option is turned off by
// default, but the warnings will be reported by clang-tidy.
#if defined(__clang__) && __cplusplus >= 201103L
#define ABSL_DEPRECATED(message) __attribute__((deprecated(message)))
#endif
#ifndef ABSL_DEPRECATED
#define ABSL_DEPRECATED(message)
#endif
// ABSL_CONST_INIT // ABSL_CONST_INIT
// //
// A variable declaration annotated with the `ABSL_CONST_INIT` attribute will // A variable declaration annotated with the `ABSL_CONST_INIT` attribute will

@ -55,85 +55,6 @@ auto ArraySizeHelper(const T (&array)[N]) -> char (&)[N];
ABSL_NAMESPACE_END ABSL_NAMESPACE_END
} // namespace absl } // namespace absl
// ABSL_FALLTHROUGH_INTENDED
//
// Annotates implicit fall-through between switch labels, allowing a case to
// indicate intentional fallthrough and turn off warnings about any lack of a
// `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by
// a semicolon and can be used in most places where `break` can, provided that
// no statements exist between it and the next switch label.
//
// Example:
//
// switch (x) {
// case 40:
// case 41:
// if (truth_is_out_there) {
// ++x;
// ABSL_FALLTHROUGH_INTENDED; // Use instead of/along with annotations
// // in comments
// } else {
// return x;
// }
// case 42:
// ...
//
// Notes: when compiled with clang in C++11 mode, the ABSL_FALLTHROUGH_INTENDED
// macro is expanded to the [[clang::fallthrough]] attribute, which is analysed
// when performing switch labels fall-through diagnostic
// (`-Wimplicit-fallthrough`). See clang documentation on language extensions
// for details:
// https://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
//
// When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro
// has no effect on diagnostics. In any case this macro has no effect on runtime
// behavior and performance of code.
#ifdef ABSL_FALLTHROUGH_INTENDED
#error "ABSL_FALLTHROUGH_INTENDED should not be defined."
#endif
// TODO(zhangxy): Use c++17 standard [[fallthrough]] macro, when supported.
#if defined(__clang__) && defined(__has_warning)
#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
#define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]]
#endif
#elif defined(__GNUC__) && __GNUC__ >= 7
#define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]]
#endif
#ifndef ABSL_FALLTHROUGH_INTENDED
#define ABSL_FALLTHROUGH_INTENDED \
do { \
} while (0)
#endif
// ABSL_DEPRECATED()
//
// Marks a deprecated class, struct, enum, function, method and variable
// declarations. The macro argument is used as a custom diagnostic message (e.g.
// suggestion of a better alternative).
//
// Examples:
//
// class ABSL_DEPRECATED("Use Bar instead") Foo {...};
//
// ABSL_DEPRECATED("Use Baz() instead") void Bar() {...}
//
// template <typename T>
// ABSL_DEPRECATED("Use DoThat() instead")
// void DoThis();
//
// Every usage of a deprecated entity will trigger a warning when compiled with
// clang's `-Wdeprecated-declarations` option. This option is turned off by
// default, but the warnings will be reported by clang-tidy.
#if defined(__clang__) && __cplusplus >= 201103L
#define ABSL_DEPRECATED(message) __attribute__((deprecated(message)))
#endif
#ifndef ABSL_DEPRECATED
#define ABSL_DEPRECATED(message)
#endif
// ABSL_BAD_CALL_IF() // ABSL_BAD_CALL_IF()
// //
// Used on a function overload to trap bad calls: any call that matches the // Used on a function overload to trap bad calls: any call that matches the

@ -409,6 +409,7 @@ static bool IsFunctionCloneSuffix(const char *str) {
static bool EndsWith(State *state, const char chr) { static bool EndsWith(State *state, const char chr) {
return state->parse_state.out_cur_idx > 0 && return state->parse_state.out_cur_idx > 0 &&
state->parse_state.out_cur_idx < state->out_end_idx &&
chr == state->out[state->parse_state.out_cur_idx - 1]; chr == state->out[state->parse_state.out_cur_idx - 1];
} }
@ -421,8 +422,10 @@ static void MaybeAppendWithLength(State *state, const char *const str,
if (str[0] == '<' && EndsWith(state, '<')) { if (str[0] == '<' && EndsWith(state, '<')) {
Append(state, " ", 1); Append(state, " ", 1);
} }
// Remember the last identifier name for ctors/dtors. // Remember the last identifier name for ctors/dtors,
if (IsAlpha(str[0]) || str[0] == '_') { // but only if we haven't yet overflown the buffer.
if (state->parse_state.out_cur_idx < state->out_end_idx &&
(IsAlpha(str[0]) || str[0] == '_')) {
state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; state->parse_state.prev_name_idx = state->parse_state.out_cur_idx;
state->parse_state.prev_name_length = length; state->parse_state.prev_name_length = length;
} }

@ -24,24 +24,137 @@
namespace absl { namespace absl {
ABSL_NAMESPACE_BEGIN ABSL_NAMESPACE_BEGIN
// Sometimes multiple error codes may apply. Services should return
// the most specific error code that applies. For example, prefer
// `kOutOfRange` over `kFailedPrecondition` if both codes apply.
// Similarly prefer `kNotFound` or `kAlreadyExists` over `kFailedPrecondition`.
enum class StatusCode : int { enum class StatusCode : int {
// Not an error; returned on success
kOk = 0, kOk = 0,
// The operation was cancelled, typically by the caller.
kCancelled = 1, kCancelled = 1,
// Unknown error. For example, errors raised by APIs that do not return
// enough error information may be converted to this error.
kUnknown = 2, kUnknown = 2,
// The client specified an invalid argument. Note that this differs
// from `kFailedPrecondition`. `kInvalidArgument` indicates arguments
// that are problematic regardless of the state of the system
// (such as a malformed file name).
kInvalidArgument = 3, kInvalidArgument = 3,
// The deadline expired before the operation could complete. For operations
// that change the state of the system, this error may be returned
// even if the operation has completed successfully. For example, a
// successful response from a server could have been delayed long
// enough for the deadline to expire.
kDeadlineExceeded = 4, kDeadlineExceeded = 4,
// Some requested entity (such as file or directory) was not found.
//
// Note to server developers: if a request is denied for an entire class
// of users, such as gradual feature rollout or undocumented whitelist,
// `kNotFound` may be used. If a request is denied for some users within
// a class of users, such as user-based access control, `kPermissionDenied`
// must be used.
kNotFound = 5, kNotFound = 5,
// The entity that a client attempted to create (such as file or directory)
// already exists.
kAlreadyExists = 6, kAlreadyExists = 6,
// The caller does not have permission to execute the specified
// operation. `kPermissionDenied` must not be used for rejections
// caused by exhausting some resource (use `kResourceExhausted`
// instead for those errors). `kPermissionDenied` must not be
// used if the caller can not be identified (use `kUnauthenticated`
// instead for those errors). This error code does not imply the
// request is valid or the requested entity exists or satisfies
// other pre-conditions.
kPermissionDenied = 7, kPermissionDenied = 7,
// Some resource has been exhausted, perhaps a per-user quota, or
// perhaps the entire file system is out of space.
kResourceExhausted = 8, kResourceExhausted = 8,
// The operation was rejected because the system is not in a state
// required for the operation's execution. For example, the directory
// to be deleted is non-empty, an rmdir operation is applied to
// a non-directory, etc.
//
// A litmus test that may help a service implementer in deciding
// between `kFailedPrecondition`, `kAborted`, and `kUnavailable`:
// (a) Use `kUnavailable` if the client can retry just the failing call.
// (b) Use `kAborted` if the client should retry at a higher-level
// (such as when a client-specified test-and-set fails, indicating the
// client should restart a read-modify-write sequence).
// (c) Use `kFailedPrecondition` if the client should not retry until
// the system state has been explicitly fixed. For example, if an "rmdir"
// fails because the directory is non-empty, `kFailedPrecondition`
// should be returned since the client should not retry unless
// the files are deleted from the directory.
kFailedPrecondition = 9, kFailedPrecondition = 9,
// The operation was aborted, typically due to a concurrency issue such as
// a sequencer check failure or transaction abort.
//
// See litmus test above for deciding between `kFailedPrecondition`,
// `kAborted`, and `kUnavailable`.
kAborted = 10, kAborted = 10,
// The operation was attempted past the valid range, such as seeking or
// reading past end-of-file.
//
// Unlike `kInvalidArgument`, this error indicates a problem that may
// be fixed if the system state changes. For example, a 32-bit file
// system will generate `kInvalidArgument` if asked to read at an
// offset that is not in the range [0,2^32-1], but it will generate
// `kOutOfRange` if asked to read from an offset past the current
// file size.
//
// There is a fair bit of overlap between `kFailedPrecondition` and
// `kOutOfRange`. We recommend using `kOutOfRange` (the more specific
// error) when it applies so that callers who are iterating through
// a space can easily look for an `kOutOfRange` error to detect when
// they are done.
kOutOfRange = 11, kOutOfRange = 11,
// The operation is not implemented or is not supported/enabled in this
// service.
kUnimplemented = 12, kUnimplemented = 12,
// Internal errors. This means that some invariants expected by the
// underlying system have been broken. This error code is reserved
// for serious errors.
kInternal = 13, kInternal = 13,
// The service is currently unavailable. This is most likely a
// transient condition, which can be corrected by retrying with
// a backoff. Note that it is not always safe to retry
// non-idempotent operations.
//
// See litmus test above for deciding between `kFailedPrecondition`,
// `kAborted`, and `kUnavailable`.
kUnavailable = 14, kUnavailable = 14,
// Unrecoverable data loss or corruption.
kDataLoss = 15, kDataLoss = 15,
// The request does not have valid authentication credentials for the
// operation.
kUnauthenticated = 16, kUnauthenticated = 16,
// An extra enum entry to prevent people from writing code that
// fails to compile when a new code is added.
//
// Nobody should ever reference this enumeration entry. In particular,
// if you write C++ code that switches on this enumeration, add a default:
// case instead of a case that mentions this enumeration entry.
//
// Nobody should rely on the value (currently 20) listed here. It
// may change in the future.
kDoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_ = 20 kDoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_ = 20
}; };

@ -365,8 +365,10 @@ bool TimeZoneInfo::ExtendTransitions() {
std::int_fast64_t jan1_time = jan1 - civil_second(); std::int_fast64_t jan1_time = jan1 - civil_second();
int jan1_weekday = ToPosixWeekday(get_weekday(jan1)); int jan1_weekday = ToPosixWeekday(get_weekday(jan1));
Transition dst = {0, dst_ti, civil_second(), civil_second()}; Transition dst = {0, static_cast<uint_least8_t>(dst_ti), civil_second(),
Transition std = {0, std_ti, civil_second(), civil_second()}; civil_second()};
Transition std = {0, static_cast<uint_least8_t>(std_ti), civil_second(),
civil_second()};
for (const year_t limit = last_year_ + 400;; ++last_year_) { for (const year_t limit = last_year_ + 400;; ++last_year_) {
auto dst_trans_off = TransOffset(leap_year, jan1_weekday, posix.dst_start); auto dst_trans_off = TransOffset(leap_year, jan1_weekday, posix.dst_start);
auto std_trans_off = TransOffset(leap_year, jan1_weekday, posix.dst_end); auto std_trans_off = TransOffset(leap_year, jan1_weekday, posix.dst_end);
@ -725,9 +727,9 @@ bool TimeZoneInfo::Load(const std::string& name) {
// Find and use a ZoneInfoSource to load the named zone. // Find and use a ZoneInfoSource to load the named zone.
auto zip = cctz_extension::zone_info_source_factory( auto zip = cctz_extension::zone_info_source_factory(
name, [](const std::string& name) -> std::unique_ptr<ZoneInfoSource> { name, [](const std::string& n) -> std::unique_ptr<ZoneInfoSource> {
if (auto zip = FileZoneInfoSource::Open(name)) return zip; if (auto z = FileZoneInfoSource::Open(n)) return z;
if (auto zip = AndroidZoneInfoSource::Open(name)) return zip; if (auto z = AndroidZoneInfoSource::Open(n)) return z;
return nullptr; return nullptr;
}); });
return zip != nullptr && Load(zip.get()); return zip != nullptr && Load(zip.get());

Loading…
Cancel
Save