Cherry pick of "Rework casting in raw_hash_set's IsFull()."

This is required by current versions of Clang.

See https://github.com/abseil/abseil-cpp/commit/1a31b81c0a467c1c8e229b9fc172a4eb0db5bd85

Change-Id: I0b94e9495e3a0c2cef13b0fb8689f359715acd94
Reviewed-on: https://flutter-review.googlesource.com/c/third_party/abseil-cpp/+/68160
Reviewed-by: John McDole <codefu@google.com>
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h
index 7b33de6..47b5118 100644
--- a/absl/container/internal/raw_hash_set.h
+++ b/absl/container/internal/raw_hash_set.h
@@ -571,7 +571,12 @@
 
 // Helpers for checking the state of a control byte.
 inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; }
-inline bool IsFull(ctrl_t c) { return c >= static_cast<ctrl_t>(0); }
+inline bool IsFull(ctrl_t c) {
+  // Cast `c` to the underlying type instead of casting `0` to `ctrl_t` as `0`
+  // is not a value in the enum. Both ways are equivalent, but this way makes
+  // linters happier.
+  return static_cast<std::underlying_type_t<ctrl_t>>(c) >= 0;
+}
 inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; }
 inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; }