aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2013-04-07 16:44:40 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2013-04-07 17:44:40 +0100
commitf2e2de5f851555162cbfa88fdcd10b785e348b10 (patch)
treea427b2c8c95bf6fd4b43a6ee8922094857bb694e /libstdc++-v3
parentfb037b5da5351a714aaf3421836196f645e25347 (diff)
downloadgcc-f2e2de5f851555162cbfa88fdcd10b785e348b10.zip
gcc-f2e2de5f851555162cbfa88fdcd10b785e348b10.tar.gz
gcc-f2e2de5f851555162cbfa88fdcd10b785e348b10.tar.bz2
Makefile.am: Add ext/aligned_buffer.h
* include/Makefile.am: Add ext/aligned_buffer.h * include/Makefile.in: Regenerate. * include/ext/aligned_buffer.h: New. * include/std/future (_Result): Use __aligned_buffer. * include/bits/forward_list.h (_Fwd_list_node): Likewise. * include/bits/shared_ptr_base.h (_Sp_counted_ptr_inplace): Likewise. * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error line number. From-SVN: r197554
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog11
-rw-r--r--libstdc++-v3/include/Makefile.am1
-rw-r--r--libstdc++-v3/include/Makefile.in1
-rw-r--r--libstdc++-v3/include/bits/forward_list.h12
-rw-r--r--libstdc++-v3/include/bits/shared_ptr_base.h11
-rw-r--r--libstdc++-v3/include/ext/aligned_buffer.h73
-rw-r--r--libstdc++-v3/include/std/future17
-rw-r--r--libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc2
8 files changed, 102 insertions, 26 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index fd0d09c..0dfa2f9 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,16 @@
2013-04-07 Jonathan Wakely <jwakely.gcc@gmail.com>
+ * include/Makefile.am: Add ext/aligned_buffer.h
+ * include/Makefile.in: Regenerate.
+ * include/ext/aligned_buffer.h: New.
+ * include/std/future (_Result): Use __aligned_buffer.
+ * include/bits/forward_list.h (_Fwd_list_node): Likewise.
+ * include/bits/shared_ptr_base.h (_Sp_counted_ptr_inplace): Likewise.
+ * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error line
+ number.
+
+2013-04-07 Jonathan Wakely <jwakely.gcc@gmail.com>
+
* include/bits/forward_list.h: Only include required headers.
(forward_list::reference): Define directly, not using __alloc_traits.
(forward_list::const_reference): Likewise.
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 6bd3b43..b0ea41d 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -495,6 +495,7 @@ ext_srcdir = ${glibcxx_srcdir}/include/ext
ext_builddir = ./ext
ext_headers = \
${ext_srcdir}/algorithm \
+ ${ext_srcdir}/aligned_buffer.h \
${ext_srcdir}/alloc_traits.h \
${ext_srcdir}/atomicity.h \
${ext_srcdir}/array_allocator.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 6e3c894..a644155 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -755,6 +755,7 @@ ext_srcdir = ${glibcxx_srcdir}/include/ext
ext_builddir = ./ext
ext_headers = \
${ext_srcdir}/algorithm \
+ ${ext_srcdir}/aligned_buffer.h \
${ext_srcdir}/alloc_traits.h \
${ext_srcdir}/atomicity.h \
${ext_srcdir}/array_allocator.h \
diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h
index 8270c4e..e7c4bdd 100644
--- a/libstdc++-v3/include/bits/forward_list.h
+++ b/libstdc++-v3/include/bits/forward_list.h
@@ -39,6 +39,7 @@
#include <bits/stl_function.h>
#include <bits/allocator.h>
#include <ext/alloc_traits.h>
+#include <ext/aligned_buffer.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -99,20 +100,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
{
_Fwd_list_node() = default;
- typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type
- _M_storage;
+ __gnu_cxx::__aligned_buffer<_Tp> _M_storage;
_Tp*
_M_valptr() noexcept
- {
- return static_cast<_Tp*>(static_cast<void*>(&_M_storage));
- }
+ { return _M_storage._M_ptr(); }
const _Tp*
_M_valptr() const noexcept
- {
- return static_cast<const _Tp*>(static_cast<const void*>(&_M_storage));
- }
+ { return _M_storage._M_ptr(); }
};
/**
diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h
index c5df1fb..f463645 100644
--- a/libstdc++-v3/include/bits/shared_ptr_base.h
+++ b/libstdc++-v3/include/bits/shared_ptr_base.h
@@ -49,6 +49,8 @@
#ifndef _SHARED_PTR_BASE_H
#define _SHARED_PTR_BASE_H 1
+#include <ext/aligned_buffer.h>
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -393,7 +395,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
: _M_impl(__a), _M_storage()
{
- _M_impl._M_ptr = static_cast<_Tp*>(static_cast<void*>(&_M_storage));
+ _M_impl._M_ptr = _M_storage._M_ptr();
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2070. allocate_shared should use allocator_traits<A>::construct
allocator_traits<_Alloc>::construct(__a, _M_impl._M_ptr,
@@ -422,9 +424,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_get_deleter(const std::type_info& __ti) noexcept
{
#ifdef __GXX_RTTI
- return __ti == typeid(_Sp_make_shared_tag)
- ? static_cast<void*>(&_M_storage)
- : 0;
+ return __ti == typeid(_Sp_make_shared_tag) ? _M_storage._M_addr() : 0;
#else
return 0;
#endif
@@ -432,8 +432,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
private:
_Impl _M_impl;
- typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type
- _M_storage;
+ __gnu_cxx::__aligned_buffer<_Tp> _M_storage;
};
template<_Lock_policy _Lp>
diff --git a/libstdc++-v3/include/ext/aligned_buffer.h b/libstdc++-v3/include/ext/aligned_buffer.h
new file mode 100644
index 0000000..ffed88c
--- /dev/null
+++ b/libstdc++-v3/include/ext/aligned_buffer.h
@@ -0,0 +1,73 @@
+// Aligned memory buffer -*- C++ -*-
+
+// Copyright (C) 2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file ext/aligned_buffer.h
+ * This file is a GNU extension to the Standard C++ Library.
+ */
+
+#ifndef _ALIGNED_BUFFER_H
+#define _ALIGNED_BUFFER_H 1
+
+#pragma GCC system_header
+
+#if __cplusplus >= 201103L
+# include <type_traits>
+#else
+# include <bits/c++0x_warning.h>
+#endif
+
+namespace __gnu_cxx
+{
+ template<typename _Tp>
+ struct __aligned_buffer
+ : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
+ {
+ typename
+ std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>::type
+ _M_storage;
+
+ void*
+ _M_addr() noexcept
+ {
+ return static_cast<void*>(&_M_storage);
+ }
+
+ const void*
+ _M_addr() const noexcept
+ {
+ return static_cast<const void*>(&_M_storage);
+ }
+
+ _Tp*
+ _M_ptr() noexcept
+ { return static_cast<_Tp*>(_M_addr()); }
+
+ const _Tp*
+ _M_ptr() const noexcept
+ { return static_cast<const _Tp*>(_M_addr()); }
+ };
+
+} // namespace
+
+#endif /* _ALIGNED_BUFFER_H */
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index 30100fe..a86a7ca 100644
--- a/libstdc++-v3/include/std/future
+++ b/libstdc++-v3/include/std/future
@@ -46,6 +46,7 @@
#include <bits/shared_ptr.h>
#include <bits/uses_allocator.h>
#include <bits/alloc_traits.h>
+#include <ext/aligned_buffer.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -206,12 +207,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct _Result : _Result_base
{
private:
- typedef alignment_of<_Res> __a_of;
- typedef aligned_storage<sizeof(_Res), __a_of::value> __align_storage;
- typedef typename __align_storage::type __align_type;
-
- __align_type _M_storage;
- bool _M_initialized;
+ __gnu_cxx::__aligned_buffer<_Res> _M_storage;
+ bool _M_initialized;
public:
typedef _Res result_type;
@@ -226,26 +223,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Return lvalue, future will add const or rvalue-reference
_Res&
- _M_value() noexcept { return *static_cast<_Res*>(_M_addr()); }
+ _M_value() noexcept { return *_M_storage._M_ptr(); }
void
_M_set(const _Res& __res)
{
- ::new (_M_addr()) _Res(__res);
+ ::new (_M_storage._M_addr()) _Res(__res);
_M_initialized = true;
}
void
_M_set(_Res&& __res)
{
- ::new (_M_addr()) _Res(std::move(__res));
+ ::new (_M_storage._M_addr()) _Res(std::move(__res));
_M_initialized = true;
}
private:
void _M_destroy() { delete this; }
-
- void* _M_addr() noexcept { return static_cast<void*>(&_M_storage); }
};
/// A unique_ptr based on the instantiating type.
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
index 6fa34a9..3a5f053 100644
--- a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
@@ -32,7 +32,7 @@ void test01()
{
X* px = 0;
std::shared_ptr<X> p1(px); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 771 }
+ // { dg-error "incomplete" "" { target *-*-* } 770 }
std::shared_ptr<X> p9(ap()); // { dg-error "here" }
// { dg-error "incomplete" "" { target *-*-* } 307 }