diff -up chromium-92.0.4515.107/components/cast_channel/enum_table.h.EnumTable-crash chromium-92.0.4515.107/components/cast_channel/enum_table.h --- chromium-92.0.4515.107/components/cast_channel/enum_table.h.EnumTable-crash 2021-07-19 14:45:12.000000000 -0400 +++ chromium-92.0.4515.107/components/cast_channel/enum_table.h 2021-07-26 17:41:21.987375385 -0400 @@ -212,7 +212,7 @@ class template friend class EnumTable; - DISALLOW_COPY_AND_ASSIGN(GenericEnumTableEntry); + DISALLOW_ASSIGN(GenericEnumTableEntry); }; // Yes, these constructors really needs to be inlined. Even though they look @@ -250,8 +250,7 @@ class EnumTable { // Constructor for regular entries. constexpr Entry(E value, base::StringPiece str) : GenericEnumTableEntry(static_cast(value), str) {} - - DISALLOW_COPY_AND_ASSIGN(Entry); + DISALLOW_ASSIGN(Entry); }; static_assert(sizeof(E) <= sizeof(int32_t), @@ -306,15 +305,14 @@ class EnumTable { if (is_sorted_) { const std::size_t index = static_cast(value); if (ANALYZER_ASSUME_TRUE(index < data_.size())) { - const auto& entry = data_.begin()[index]; + const auto& entry = data_[index]; if (ANALYZER_ASSUME_TRUE(entry.has_str())) return entry.str(); } return absl::nullopt; } return GenericEnumTableEntry::FindByValue( - reinterpret_cast(data_.begin()), - data_.size(), static_cast(value)); + &data_[0], data_.size(), static_cast(value)); } // This overload of GetString is designed for cases where the argument is a @@ -342,8 +340,7 @@ class EnumTable { // enum value directly. absl::optional GetEnum(base::StringPiece str) const { auto* entry = GenericEnumTableEntry::FindByString( - reinterpret_cast(data_.begin()), - data_.size(), str); + &data_[0], data_.size(), str); return entry ? static_cast(entry->value) : absl::optional(); } @@ -358,7 +355,7 @@ class EnumTable { // Align the data on a cache line boundary. alignas(64) #endif - std::initializer_list data_; + const std::vector data_; bool is_sorted_; constexpr EnumTable(std::initializer_list data, bool is_sorted) @@ -370,8 +367,8 @@ class EnumTable { for (std::size_t i = 0; i < data.size(); i++) { for (std::size_t j = i + 1; j < data.size(); j++) { - const Entry& ei = data.begin()[i]; - const Entry& ej = data.begin()[j]; + const Entry& ei = data[i]; + const Entry& ej = data[j]; DCHECK(ei.value != ej.value) << "Found duplicate enum values at indices " << i << " and " << j; DCHECK(!(ei.has_str() && ej.has_str() && ei.str() == ej.str()))