diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2014-10-13 15:08:44 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2014-10-13 15:08:44 +0100 |
commit | 01d6452fe545c30b8f9c9cb1a270d923aa572848 (patch) | |
tree | c85419d198c89115377e322d5a9bd51ee6eb4d47 | |
parent | 270cc99ec8a238b810460308687ea41ed6ecba14 (diff) | |
download | gcc-01d6452fe545c30b8f9c9cb1a270d923aa572848.zip gcc-01d6452fe545c30b8f9c9cb1a270d923aa572848.tar.gz gcc-01d6452fe545c30b8f9c9cb1a270d923aa572848.tar.bz2 |
re PR libstdc++/57350 (std::align missing)
PR libstdc++/57350
* include/std/memory (align): Do not adjust correctly aligned address.
* testsuite/20_util/align/2.cc: New.
From-SVN: r216149
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/std/memory | 9 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/align/2.cc | 42 |
3 files changed, 53 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a5436de..141a002 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2014-10-13 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/57350 + * include/std/memory (align): Do not adjust correctly aligned address. + * testsuite/20_util/align/2.cc: New. + 2014-10-13 Siva Chandra Reddy <sivachandra@google.com> * python/libstdcxx/v6/xmethods.py: Add xmethods for std::array, diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory index affc8b1..b5792ad 100644 --- a/libstdc++-v3/include/std/memory +++ b/libstdc++-v3/include/std/memory @@ -113,14 +113,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline void* align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept { - const size_t __diff = __align - reinterpret_cast<uintptr_t>(__ptr) % __align; - if (__diff + __size >= __space) + const auto __intptr = reinterpret_cast<uintptr_t>(__ptr); + const auto __aligned = (__intptr - 1u + __align) & -__align; + const auto __diff = __aligned - __intptr; + if ((__size + __diff) > __space) return nullptr; else { __space -= __diff; - __ptr = static_cast<char*>(__ptr) + __diff; - return __ptr; + return __ptr = reinterpret_cast<void*>(__aligned); } } diff --git a/libstdc++-v3/testsuite/20_util/align/2.cc b/libstdc++-v3/testsuite/20_util/align/2.cc new file mode 100644 index 0000000..efad56a --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/align/2.cc @@ -0,0 +1,42 @@ +// { dg-options " -std=gnu++11 " } + +// Copyright (C) 2014 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. + +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// C++11 [ptr.align] (20.6.5): std::align + +#include <memory> +#include <testsuite_hooks.h> + +void +test01() +{ + bool test __attribute__((unused)) = true; + + int i = 0; + void* ptr = &i; + auto space = sizeof(i); + auto p2 = std::align(alignof(i), space, ptr, space); + VERIFY( ptr == &i ); + VERIFY( p2 == &i ); + VERIFY(space == sizeof(i)); +} + +int main() +{ + test01(); +} |