From: Jonathan Wakely Date: Fri, 21 Oct 2016 13:21:09 +0000 (+0100) Subject: Use global operator new in std::make_exception_ptr X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6652a944dcf82fe518090e8cb2629b473b70ac5c;p=gcc.git Use global operator new in std::make_exception_ptr * libsupc++/exception_ptr.h (make_exception_ptr): Qualify new. * testsuite/18_support/exception_ptr/make_exception_ptr_2.cc: New test. From-SVN: r241404 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6f47e0d2b62..933d8d32e17 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2016-10-21 Jonathan Wakely + + * libsupc++/exception_ptr.h (make_exception_ptr): Qualify new. + * testsuite/18_support/exception_ptr/make_exception_ptr_2.cc: New + test. + 2016-10-20 Jonathan Wakely * include/backward/auto_ptr.h (__shared_ptr(auto_ptr&&)) diff --git a/libstdc++-v3/libsupc++/exception_ptr.h b/libstdc++-v3/libsupc++/exception_ptr.h index 21e4e8b8348..a47a58568bd 100644 --- a/libstdc++-v3/libsupc++/exception_ptr.h +++ b/libstdc++-v3/libsupc++/exception_ptr.h @@ -187,10 +187,10 @@ namespace std { #if __cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI void *__e = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ex)); - (void)__cxxabiv1::__cxa_init_primary_exception(__e, - const_cast(&typeid(__ex)), - __exception_ptr::__dest_thunk<_Ex>); - new (__e) _Ex(__ex); + (void)__cxxabiv1::__cxa_init_primary_exception( + __e, const_cast(&typeid(__ex)), + __exception_ptr::__dest_thunk<_Ex>); + ::new (__e) _Ex(__ex); return exception_ptr(__e); #else throw __ex; diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/make_exception_ptr_2.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/make_exception_ptr_2.cc new file mode 100644 index 00000000000..3787777c9cf --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/make_exception_ptr_2.cc @@ -0,0 +1,43 @@ +// { dg-do run { target c++11 } } +// { dg-require-atomic-builtins "" } + +// Copyright (C) 2010-2016 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 +// . + +#include +#include + +// https://gcc.gnu.org/ml/libstdc++/2016-10/msg00139.html + +struct E { + void* operator new(std::size_t) = delete; +}; + +void test01() +{ + E e; + std::exception_ptr p = std::make_exception_ptr(e); + + VERIFY( p ); +} + +int main() +{ + test01(); + + return 0; +}