gcc/libstdc++-v3/testsuite/18_support/50594.cc
Paolo Carlini 578f023490 re PR c++/50594 (Option -fwhole-program discards replaced new operator for std::string)
2011-10-12  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/50594
	* decl.c (cxx_init_decl_processing): Add
	__attribute__((externally_visible)) to operator new and
	operator delete library fn.

2011-10-12  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/50594
	* libsupc++/new (operator new, operator delete): Decorate with
	__attribute__((__externally_visible__)).
	* include/bits/c++config: Add _GLIBCXX_THROW.
	* libsupc++/del_op.cc: Adjust.
	* libsupc++/del_opv.cc: Likewise.
	* libsupc++/del_opnt.cc: Likewise.
	* libsupc++/del_opvnt.cc: Likewise.
	* libsupc++/new_op.cc: Likewise.
	* libsupc++/new_opv.cc: Likewise.
	* libsupc++/new_opnt.cc: Likewise.
	* libsupc++/new_opvnt.cc: Likewise.
	* testsuite/18_support/50594.cc: New.
	* testsuite/ext/profile/mutex_extensions_neg.cc: Adjust dg-error
	line number.

From-SVN: r179863
2011-10-12 18:40:58 +00:00

73 lines
1.5 KiB
C++

// { dg-options "-fwhole-program" }
// Copyright (C) 2011 Free Software Foundation
//
// 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/>.
#include <new>
#include <string>
#include <cstdlib>
#include <testsuite_hooks.h>
bool user_new_called;
bool user_delete_called;
void* operator new(std::size_t n)
#ifndef __GXX_EXPERIMENTAL_CXX0X__
throw(std::bad_alloc)
#endif
{
user_new_called = true;
void* p = std::malloc(n);
if (!p)
throw std::bad_alloc();
return p;
}
void operator delete(void* p)
#ifdef __GXX_EXPERIMENTAL_CXX0X__
noexcept
#else
throw()
#endif
{
user_delete_called = true;
std::free(p);
}
// libstdc++/50594
void test01()
{
bool test __attribute__((unused)) = true;
{
std::string s = "Hello World.";
}
VERIFY( user_new_called );
VERIFY( user_delete_called );
}
int main()
{
test01();
return 0;
}