re PR libstdc++/64241 (make_exception_ptr returns garbage with -fno-exceptions)

PR libstdc++/64241
	* libsupc++/exception_ptr.h: Return empty object when exceptions are
	disabled.
	* testsuite/18_support/exception_ptr/64241.cc: New.

From-SVN: r218675
This commit is contained in:
Jonathan Wakely 2014-12-12 15:10:08 +00:00 committed by Jonathan Wakely
parent dd92baee2a
commit 8f596ff51a
3 changed files with 52 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2014-12-12 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/64241
* libsupc++/exception_ptr.h: Return empty object when exceptions are
disabled.
* testsuite/18_support/exception_ptr/64241.cc: New.
2014-12-12 Jonathan Wakely <jwakely@redhat.com>
* include/bits/stl_iterator.h (make_reverse_iterator): LWG DR 2285.

View File

@ -168,16 +168,18 @@ namespace std
exception_ptr
make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
{
__try
{
#ifdef __EXCEPTIONS
try
{
throw __ex;
#endif
}
__catch(...)
catch(...)
{
return current_exception();
}
#else
return exception_ptr();
#endif
}
// _GLIBCXX_RESOLVE_LIB_DEFECTS

View File

@ -0,0 +1,39 @@
// 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/>.
// { dg-options "-std=gnu++11 -fno-exceptions -O0" }
#include <exception>
#include <testsuite_hooks.h>
void
test01()
{
bool test __attribute__((unused)) = true;
{
// Put some non-zero bytes on the stack
void* p __attribute__((unused)) = &test;
}
std::exception_ptr p = std::make_exception_ptr(1);
VERIFY( p == nullptr );
}
int
main()
{
test01();
}