From 01d6452fe545c30b8f9c9cb1a270d923aa572848 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 13 Oct 2014 15:08:44 +0100 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 6 ++++ libstdc++-v3/include/std/memory | 9 ++--- libstdc++-v3/testsuite/20_util/align/2.cc | 42 +++++++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/align/2.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a5436de0fe3..141a002a038 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2014-10-13 Jonathan Wakely + + 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 * 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 affc8b176eb..b5792ad78b7 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(__ptr) % __align; - if (__diff + __size >= __space) + const auto __intptr = reinterpret_cast(__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(__ptr) + __diff; - return __ptr; + return __ptr = reinterpret_cast(__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 00000000000..efad56a6f48 --- /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 +// . + +// C++11 [ptr.align] (20.6.5): std::align + +#include +#include + +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(); +} -- 2.30.2