re PR bootstrap/86739 (Bootstrap broken with host GCC 4.1.2)
authorJakub Jelinek <jakub@redhat.com>
Wed, 14 Nov 2018 16:43:38 +0000 (17:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 14 Nov 2018 16:43:38 +0000 (17:43 +0100)
PR bootstrap/86739
* hash-map.h (hash_map::iterator::reference_pair): New class.
(hash_map::iterator::operator*): Return it rather than std::pair.

From-SVN: r266152

gcc/ChangeLog
gcc/hash-map.h

index be75c6874c8798e4fe0087c87a8c0f01386da41e..ae27a137d15aa2fd08e9f6a927e923beeee48137 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR bootstrap/86739
+       * hash-map.h (hash_map::iterator::reference_pair): New class.
+       (hash_map::iterator::operator*): Return it rather than std::pair.
+
 2018-11-14  Jeff Law  <law@redhat.com>
 
        * optabs.c (expand_binop): Pass INT_MODE to operand_subword_force
index 39848289d80c8efb847f3fb7a122ed5329f11299..5cee4a400d87a5b8f1ae85c04f60f2d190aac88a 100644 (file)
@@ -223,10 +223,23 @@ public:
       return *this;
     }
 
-    std::pair<const Key&, Value&> operator* ()
+    /* Can't use std::pair here, because GCC before 4.3 don't handle
+       std::pair where template parameters are references well.
+       See PR86739.  */
+    struct reference_pair {
+      const Key &first;
+      Value &second;
+
+      reference_pair (const Key &key, Value &value) : first (key), second (value) {}
+
+      template <typename K, typename V>
+      operator std::pair<K, V> () const { return std::pair<K, V> (first, second); }
+    };
+
+    reference_pair operator* ()
     {
       hash_entry &e = *m_iter;
-      return std::pair<const Key&, Value&> (e.m_key, e.m_value);
+      return reference_pair (e.m_key, e.m_value);
     }
 
     bool