Blob Blame History Raw
From 911bdcd8cc5475be4ec4228cfbc85fc38f52857e Mon Sep 17 00:00:00 2001
From: Stephan Hartmann <stha09@googlemail.com>
Date: Wed, 27 May 2020 10:00:41 +0000
Subject: [PATCH] GCC: make base::{flat_map,flat_tree} move assignement operators noexcept

Move assigment operator in ui::ColorSet is noexcept. Because this
class has a member of type base::flat_map, move assignment operators
of base::flat_map and base::flat_tree must be noexcept too.
base::flat_tree noexcept is conditional to avoid build failure with
NaCl.

Otherwise GCC fails like this:

../../ui/color/color_set.cc:14:11: error: function
'ui::ColorSet& ui::ColorSet::operator=(ui::ColorSet&&)' defaulted on its
redeclaration with an exception-specification that differs from the
implicit exception-specification ''
   14 | ColorSet& ColorSet::operator=(ColorSet&&) noexcept = default;
      |           ^~~~~~~~

Bug: 819294
Change-Id: I10ce31851effc9ce78f2b5cbbb7148c339f065a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2179245
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#772175}
---

diff --git a/base/containers/flat_map.h b/base/containers/flat_map.h
index ed82c5d..1af6b40 100644
--- a/base/containers/flat_map.h
+++ b/base/containers/flat_map.h
@@ -202,7 +202,7 @@
   ~flat_map() = default;
 
   flat_map& operator=(const flat_map&) = default;
-  flat_map& operator=(flat_map&&) = default;
+  flat_map& operator=(flat_map&&) noexcept = default;
   // Takes the first if there are duplicates in the initializer list.
   flat_map& operator=(std::initializer_list<value_type> ilist);
 
diff --git a/base/containers/flat_tree.h b/base/containers/flat_tree.h
index 9412ff6..ce6e92b 100644
--- a/base/containers/flat_tree.h
+++ b/base/containers/flat_tree.h
@@ -125,7 +125,8 @@
   // Assume that move assignment invalidates iterators and references.
 
   flat_tree& operator=(const flat_tree&);
-  flat_tree& operator=(flat_tree&&);
+  flat_tree& operator=(flat_tree&&) noexcept(
+      std::is_nothrow_move_assignable<underlying_type>::value);
   // Takes the first if there are duplicates in the initializer list.
   flat_tree& operator=(std::initializer_list<value_type> ilist);
 
@@ -518,7 +519,9 @@
     const flat_tree&) -> flat_tree& = default;
 
 template <class Key, class Value, class GetKeyFromValue, class KeyCompare>
-auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::operator=(flat_tree &&)
+auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::
+operator=(flat_tree&&) noexcept(
+    std::is_nothrow_move_assignable<underlying_type>::value)
     -> flat_tree& = default;
 
 template <class Key, class Value, class GetKeyFromValue, class KeyCompare>