|  | @@ -31,7 +31,6 @@
 | 
	
		
			
				|  |  |  #define ABSL_CONTAINER_FIXED_ARRAY_H_
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include <algorithm>
 | 
	
		
			
				|  |  | -#include <array>
 | 
	
		
			
				|  |  |  #include <cassert>
 | 
	
		
			
				|  |  |  #include <cstddef>
 | 
	
		
			
				|  |  |  #include <initializer_list>
 | 
	
	
		
			
				|  | @@ -386,8 +385,7 @@ class FixedArray {
 | 
	
		
			
				|  |  |    //     error: call to int __builtin___sprintf_chk(etc...)
 | 
	
		
			
				|  |  |    //     will always overflow destination buffer [-Werror]
 | 
	
		
			
				|  |  |    //
 | 
	
		
			
				|  |  | -  template <typename OuterT = value_type,
 | 
	
		
			
				|  |  | -            typename InnerT = absl::remove_extent_t<OuterT>,
 | 
	
		
			
				|  |  | +  template <typename OuterT, typename InnerT = absl::remove_extent_t<OuterT>,
 | 
	
		
			
				|  |  |              size_t InnerN = std::extent<OuterT>::value>
 | 
	
		
			
				|  |  |    struct StorageElementWrapper {
 | 
	
		
			
				|  |  |      InnerT array[InnerN];
 | 
	
	
		
			
				|  | @@ -396,8 +394,6 @@ class FixedArray {
 | 
	
		
			
				|  |  |    using StorageElement =
 | 
	
		
			
				|  |  |        absl::conditional_t<std::is_array<value_type>::value,
 | 
	
		
			
				|  |  |                            StorageElementWrapper<value_type>, value_type>;
 | 
	
		
			
				|  |  | -  using StorageElementBuffer =
 | 
	
		
			
				|  |  | -      absl::aligned_storage_t<sizeof(StorageElement), alignof(StorageElement)>;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    static pointer AsValueType(pointer ptr) { return ptr; }
 | 
	
		
			
				|  |  |    static pointer AsValueType(StorageElementWrapper<value_type>* ptr) {
 | 
	
	
		
			
				|  | @@ -407,25 +403,25 @@ class FixedArray {
 | 
	
		
			
				|  |  |    static_assert(sizeof(StorageElement) == sizeof(value_type), "");
 | 
	
		
			
				|  |  |    static_assert(alignof(StorageElement) == alignof(value_type), "");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  struct NonEmptyInlinedStorage {
 | 
	
		
			
				|  |  | -    StorageElement* data() {
 | 
	
		
			
				|  |  | -      return reinterpret_cast<StorageElement*>(inlined_storage_.data());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +  class NonEmptyInlinedStorage {
 | 
	
		
			
				|  |  | +   public:
 | 
	
		
			
				|  |  | +    StorageElement* data() { return reinterpret_cast<StorageElement*>(buff_); }
 | 
	
		
			
				|  |  | +    void AnnotateConstruct(size_type n);
 | 
	
		
			
				|  |  | +    void AnnotateDestruct(size_type n);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifdef ADDRESS_SANITIZER
 | 
	
		
			
				|  |  |      void* RedzoneBegin() { return &redzone_begin_; }
 | 
	
		
			
				|  |  |      void* RedzoneEnd() { return &redzone_end_ + 1; }
 | 
	
		
			
				|  |  |  #endif  // ADDRESS_SANITIZER
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    void AnnotateConstruct(size_type);
 | 
	
		
			
				|  |  | -    void AnnotateDestruct(size_type);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +   private:
 | 
	
		
			
				|  |  |      ADDRESS_SANITIZER_REDZONE(redzone_begin_);
 | 
	
		
			
				|  |  | -    std::array<StorageElementBuffer, inline_elements> inlined_storage_;
 | 
	
		
			
				|  |  | +    alignas(StorageElement) char buff_[sizeof(StorageElement[inline_elements])];
 | 
	
		
			
				|  |  |      ADDRESS_SANITIZER_REDZONE(redzone_end_);
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  struct EmptyInlinedStorage {
 | 
	
		
			
				|  |  | +  class EmptyInlinedStorage {
 | 
	
		
			
				|  |  | +   public:
 | 
	
		
			
				|  |  |      StorageElement* data() { return nullptr; }
 | 
	
		
			
				|  |  |      void AnnotateConstruct(size_type) {}
 | 
	
		
			
				|  |  |      void AnnotateDestruct(size_type) {}
 | 
	
	
		
			
				|  | @@ -459,9 +455,7 @@ class FixedArray {
 | 
	
		
			
				|  |  |      size_type size() const { return size_alloc_.template get<0>(); }
 | 
	
		
			
				|  |  |      StorageElement* begin() const { return data_; }
 | 
	
		
			
				|  |  |      StorageElement* end() const { return begin() + size(); }
 | 
	
		
			
				|  |  | -    allocator_type& alloc() {
 | 
	
		
			
				|  |  | -      return size_alloc_.template get<1>();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    allocator_type& alloc() { return size_alloc_.template get<1>(); }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |     private:
 | 
	
		
			
				|  |  |      static bool UsingInlinedStorage(size_type n) {
 |