diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2011-10-12 18:40:58 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-10-12 18:40:58 +0000 |
commit | 578f023490bab56ea603aa4374ecbf31b38c24b5 (patch) | |
tree | 86535a35e8420259fa52ecd17bb9798257bc4968 | |
parent | 0a6fa37645370f2bbbee102afd270464259c4124 (diff) | |
download | gcc-578f023490bab56ea603aa4374ecbf31b38c24b5.zip gcc-578f023490bab56ea603aa4374ecbf31b38c24b5.tar.gz gcc-578f023490bab56ea603aa4374ecbf31b38c24b5.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 13 | ||||
-rw-r--r-- | libstdc++-v3/ChangeLog | 18 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/c++config | 2 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/del_op.cc | 5 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/del_opnt.cc | 5 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/del_opv.cc | 5 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/del_opvnt.cc | 5 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/new | 36 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/new_op.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/new_opnt.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/new_opv.cc | 5 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/new_opvnt.cc | 6 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/18_support/50594.cc | 72 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc | 2 |
15 files changed, 152 insertions, 33 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ca8566f..e7c5b49 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +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-11 Michael Meissner <meissner@linux.vnet.ibm.com> * decl.c (duplicate_decls): Delete old interface with two parallel diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c8f3255..8b5033f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3654,7 +3654,7 @@ cxx_init_decl_processing (void) current_lang_name = lang_name_cplusplus; { - tree newattrs; + tree newattrs, extvisattr; tree newtype, deltype; tree ptr_ftype_sizetype; tree new_eh_spec; @@ -3684,12 +3684,15 @@ cxx_init_decl_processing (void) /* Ensure attribs.c is initialized. */ init_attributes (); - newattrs - = build_tree_list (get_identifier ("alloc_size"), - build_tree_list (NULL_TREE, integer_one_node)); + extvisattr = build_tree_list (get_identifier ("externally_visible"), + NULL_TREE); + newattrs = tree_cons (get_identifier ("alloc_size"), + build_tree_list (NULL_TREE, integer_one_node), + extvisattr); newtype = cp_build_type_attribute_variant (ptr_ftype_sizetype, newattrs); newtype = build_exception_variant (newtype, new_eh_spec); - deltype = build_exception_variant (void_ftype_ptr, empty_except_spec); + deltype = cp_build_type_attribute_variant (void_ftype_ptr, extvisattr); + deltype = build_exception_variant (deltype, empty_except_spec); push_cp_library_fn (NEW_EXPR, newtype); push_cp_library_fn (VEC_NEW_EXPR, newtype); global_delete_fndecl = push_cp_library_fn (DELETE_EXPR, deltype); diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 628e213..31bf711 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,21 @@ +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. + 2011-10-11 Emil Wojak <emil@wojak.eu> PR c++/50661 diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 8c61de3..f77da5e 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -103,9 +103,11 @@ # ifdef __GXX_EXPERIMENTAL_CXX0X__ # define _GLIBCXX_NOEXCEPT noexcept # define _GLIBCXX_USE_NOEXCEPT noexcept +# define _GLIBCXX_THROW(_EXC) # else # define _GLIBCXX_NOEXCEPT # define _GLIBCXX_USE_NOEXCEPT throw() +# define _GLIBCXX_THROW(_EXC) throw(_EXC) # endif #endif diff --git a/libstdc++-v3/libsupc++/del_op.cc b/libstdc++-v3/libsupc++/del_op.cc index 86d4c1e..0d69aa3 100644 --- a/libstdc++-v3/libsupc++/del_op.cc +++ b/libstdc++-v3/libsupc++/del_op.cc @@ -1,6 +1,7 @@ // Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2007, 2009 Free Software Foundation +// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2007, 2009, 2010, 2011 +// Free Software Foundation // // This file is part of GCC. // @@ -41,7 +42,7 @@ _GLIBCXX_END_NAMESPACE_VERSION #include "new" _GLIBCXX_WEAK_DEFINITION void -operator delete(void* ptr) throw () +operator delete(void* ptr) _GLIBCXX_USE_NOEXCEPT { if (ptr) std::free(ptr); diff --git a/libstdc++-v3/libsupc++/del_opnt.cc b/libstdc++-v3/libsupc++/del_opnt.cc index 29eab10..1a43ca4 100644 --- a/libstdc++-v3/libsupc++/del_opnt.cc +++ b/libstdc++-v3/libsupc++/del_opnt.cc @@ -1,6 +1,7 @@ // Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009 Free Software Foundation +// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 +// Free Software Foundation // // This file is part of GCC. // @@ -29,7 +30,7 @@ extern "C" void free (void *); _GLIBCXX_WEAK_DEFINITION void -operator delete (void *ptr, const std::nothrow_t&) throw () +operator delete (void *ptr, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT { free (ptr); } diff --git a/libstdc++-v3/libsupc++/del_opv.cc b/libstdc++-v3/libsupc++/del_opv.cc index c56df07..594f862 100644 --- a/libstdc++-v3/libsupc++/del_opv.cc +++ b/libstdc++-v3/libsupc++/del_opv.cc @@ -1,6 +1,7 @@ // Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009 Free Software Foundation +// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 +// Free Software Foundation // // This file is part of GCC. // @@ -27,7 +28,7 @@ #include "new" _GLIBCXX_WEAK_DEFINITION void -operator delete[] (void *ptr) throw () +operator delete[] (void *ptr) _GLIBCXX_USE_NOEXCEPT { ::operator delete (ptr); } diff --git a/libstdc++-v3/libsupc++/del_opvnt.cc b/libstdc++-v3/libsupc++/del_opvnt.cc index fec6495..e27eb58 100644 --- a/libstdc++-v3/libsupc++/del_opvnt.cc +++ b/libstdc++-v3/libsupc++/del_opvnt.cc @@ -1,6 +1,7 @@ // Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009 Free Software Foundation +// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 +// Free Software Foundation // // This file is part of GCC. // @@ -27,7 +28,7 @@ #include "new" _GLIBCXX_WEAK_DEFINITION void -operator delete[] (void *ptr, const std::nothrow_t&) throw () +operator delete[] (void *ptr, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT { ::operator delete (ptr); } diff --git a/libstdc++-v3/libsupc++/new b/libstdc++-v3/libsupc++/new index 80ee3ba..1c25800 100644 --- a/libstdc++-v3/libsupc++/new +++ b/libstdc++-v3/libsupc++/new @@ -1,7 +1,7 @@ // The -*- C++ -*- dynamic memory management header. // Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -// 2003, 2004, 2005, 2006, 2007, 2009, 2010 +// 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 // Free Software Foundation // This file is part of GCC. @@ -90,22 +90,32 @@ namespace std * Placement new and delete signatures (take a memory address argument, * does nothing) may not be replaced by a user's program. */ -void* operator new(std::size_t) throw (std::bad_alloc); -void* operator new[](std::size_t) throw (std::bad_alloc); -void operator delete(void*) throw(); -void operator delete[](void*) throw(); -void* operator new(std::size_t, const std::nothrow_t&) throw(); -void* operator new[](std::size_t, const std::nothrow_t&) throw(); -void operator delete(void*, const std::nothrow_t&) throw(); -void operator delete[](void*, const std::nothrow_t&) throw(); +void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) + __attribute__((__externally_visible__)); +void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) + __attribute__((__externally_visible__)); +void operator delete(void*) _GLIBCXX_USE_NOEXCEPT + __attribute__((__externally_visible__)); +void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT + __attribute__((__externally_visible__)); +void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT + __attribute__((__externally_visible__)); +void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT + __attribute__((__externally_visible__)); +void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT + __attribute__((__externally_visible__)); +void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT + __attribute__((__externally_visible__)); // Default placement versions of operator new. -inline void* operator new(std::size_t, void* __p) throw() { return __p; } -inline void* operator new[](std::size_t, void* __p) throw() { return __p; } +inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT +{ return __p; } +inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT +{ return __p; } // Default placement versions of operator delete. -inline void operator delete (void*, void*) throw() { } -inline void operator delete[](void*, void*) throw() { } +inline void operator delete (void*, void*) _GLIBCXX_USE_NOEXCEPT { } +inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { } //@} } // extern "C++" diff --git a/libstdc++-v3/libsupc++/new_op.cc b/libstdc++-v3/libsupc++/new_op.cc index c61e941..bb0199e 100644 --- a/libstdc++-v3/libsupc++/new_op.cc +++ b/libstdc++-v3/libsupc++/new_op.cc @@ -42,7 +42,7 @@ extern "C" void *malloc (std::size_t); extern new_handler __new_handler; _GLIBCXX_WEAK_DEFINITION void * -operator new (std::size_t sz) throw (std::bad_alloc) +operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc) { void *p; diff --git a/libstdc++-v3/libsupc++/new_opnt.cc b/libstdc++-v3/libsupc++/new_opnt.cc index 1bcdead..71600a6 100644 --- a/libstdc++-v3/libsupc++/new_opnt.cc +++ b/libstdc++-v3/libsupc++/new_opnt.cc @@ -34,7 +34,7 @@ extern "C" void *malloc (std::size_t); extern new_handler __new_handler; _GLIBCXX_WEAK_DEFINITION void * -operator new (std::size_t sz, const std::nothrow_t&) throw() +operator new (std::size_t sz, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT { void *p; diff --git a/libstdc++-v3/libsupc++/new_opv.cc b/libstdc++-v3/libsupc++/new_opv.cc index b200e23..4080bd2 100644 --- a/libstdc++-v3/libsupc++/new_opv.cc +++ b/libstdc++-v3/libsupc++/new_opv.cc @@ -1,6 +1,7 @@ // Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009 Free Software Foundation +// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 +// Free Software Foundation // // This file is part of GCC. // @@ -27,7 +28,7 @@ #include "new" _GLIBCXX_WEAK_DEFINITION void* -operator new[] (std::size_t sz) throw (std::bad_alloc) +operator new[] (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc) { return ::operator new(sz); } diff --git a/libstdc++-v3/libsupc++/new_opvnt.cc b/libstdc++-v3/libsupc++/new_opvnt.cc index da4ae80..0609e68 100644 --- a/libstdc++-v3/libsupc++/new_opvnt.cc +++ b/libstdc++-v3/libsupc++/new_opvnt.cc @@ -1,6 +1,7 @@ // Boilerplate support routines for -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009 Free Software Foundation +// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 +// Free Software Foundation // // This file is part of GCC. // @@ -27,7 +28,8 @@ #include "new" _GLIBCXX_WEAK_DEFINITION void* -operator new[] (std::size_t sz, const std::nothrow_t& nothrow) throw() +operator new[] (std::size_t sz, const std::nothrow_t& nothrow) + _GLIBCXX_USE_NOEXCEPT { return ::operator new(sz, nothrow); } diff --git a/libstdc++-v3/testsuite/18_support/50594.cc b/libstdc++-v3/testsuite/18_support/50594.cc new file mode 100644 index 0000000..047f4a7 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/50594.cc @@ -0,0 +1,72 @@ +// { 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; +} diff --git a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc index ba515b7..4e2d071 100644 --- a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc +++ b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc @@ -25,4 +25,4 @@ #include <vector> -// { dg-error "multiple inlined namespaces" "" { target *-*-* } 256 } +// { dg-error "multiple inlined namespaces" "" { target *-*-* } 258 } |