https://gcc.gnu.org/PR87822 From 581b5447f18f4758a55b1fda4f8bf597e9466d40 Mon Sep 17 00:00:00 2001 From: redi Date: Wed, 31 Oct 2018 12:29:02 +0000 Subject: [PATCH] PR libstdc++/87822 fix layout change for nested std::pair The introduction of the empty __pair_base base class for PR 86751 changed the layout of std::pair, ...>. The outer pair and its first member both have a base class of the same type, which cannot exist at the same address. This causes the first member to be at a non-zero offset. The solution is to make the base class depend on the template parameters, so that each pair type has a different base class type, which allows the base classes of the outer pair and its first member to have the same address. PR libstdc++/87822 * include/bits/stl_pair.h (__pair_base): Change to class template. (pair): Make base class type depend on template parameters. * testsuite/20_util/pair/87822.cc: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@265678 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/include/bits/stl_pair.h | 4 +- --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -187,7 +187,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION }; #endif // C++11 - class __pair_base + template class __pair_base { #if __cplusplus >= 201103L template friend struct pair; @@ -206,7 +206,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ template struct pair - : private __pair_base + : private __pair_base<_T1, _T2> { typedef _T1 first_type; /// @c first_type is the first bound type typedef _T2 second_type; /// @c second_type is the second bound type