
pair, and a couple of pair-like implementation detail types. The C++98/03 and 11 standards all specify that the copy constructor of pair<int, int> is trivial. However as libc++ tracked the draft C++11 standard over the years, this copy constructor became non-trivial, and then just recently was corrected back to trivial for C++11. Unfortunately (for libc++1) the Itanium ABI specifies different calling conventions for trivial and non-trivial copy constructors. Therefore currently the C++03 libc++ copy constructor for pair<int, int> is ABI incompatible with the C++11 libc++ copy constructor for pair<int, int>. This is Bad(tm). This patch corrects the situation by making this copy constructor trivial in C++03 mode as well. Just in case it is needed for an incomplete C++11 compiler, libc++ retains the ability to support pair with rvalue references, but without defaulted special members. However the pair needs non-trivial special members to implement this special case, (as it did when clang was in this place a couple of years ago). During this work a bug was also found and fixed in is_trivially_constructible. And there is a minor drive-by fix in <__config> regarding __type_visibility__. A test is updated to ensure that the copy constructor of pair<int, int> is trivial in both C++03 and C++11. This test will necessarily fail for a compiler that implements rvalue references but not defaulted special members. llvm-svn: 194536
41 lines
988 B
C++
41 lines
988 B
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// <utility>
|
|
|
|
// template <class T1, class T2> struct pair
|
|
|
|
// pair(const pair&) = default;
|
|
|
|
#include <utility>
|
|
#include <cassert>
|
|
|
|
int main()
|
|
{
|
|
{
|
|
typedef std::pair<int, short> P1;
|
|
P1 p1(3, 4);
|
|
P1 p2 = p1;
|
|
assert(p2.first == 3);
|
|
assert(p2.second == 4);
|
|
}
|
|
|
|
static_assert((std::is_trivially_copy_constructible<std::pair<int, int> >::value), "");
|
|
|
|
#if _LIBCPP_STD_VER > 11
|
|
{
|
|
typedef std::pair<int, short> P1;
|
|
constexpr P1 p1(3, 4);
|
|
constexpr P1 p2 = p1;
|
|
static_assert(p2.first == 3, "");
|
|
static_assert(p2.second == 4, "");
|
|
}
|
|
#endif
|
|
}
|