[gcc/devel/omp/gcc-9] PR libstdc++/51333 Define recursive_init_error constructor non-inline

Tobias Burnus burnus@gcc.gnu.org
Thu Mar 5 14:13:00 GMT 2020


https://gcc.gnu.org/g:9acd8777c4a7cbf14b405fd3e83992a319ef20ab

commit 9acd8777c4a7cbf14b405fd3e83992a319ef20ab
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Jul 31 20:56:04 2019 +0100

    PR libstdc++/51333 Define recursive_init_error constructor non-inline
    
    The recursive_init_error class is defined in a header, with an inline
    constructor, but the definition of the vtable and destructor are not
    exported from the shared library. With -fkeep-inline-functions the
    constructor gets emitted in user code, and requires the (non-exported)
    vtable. This fails to link.
    
    As far as I can tell, the recursive_init_error class definition was
    moved into <cxxabi.h> so it could be documented with Doxygen, not for
    any technical reason. But now it's there (and documented), somebody
    could be relying on it, by catching that type and possibly performing
    derived-to-base conversions to the std::exception base class. So the
    conservative fix is to leave the class definition in the header but make
    the constructor non-inline. This still allows the type to be caught and
    still defines its base class.
    
    Backport from mainline
    2019-07-29  Jonathan Wakely  <jwakely@redhat.com>
    
    	PR libstdc++/51333
    	* libsupc++/cxxabi.h (__gnu_cxx::recursive_init_error): Do not define
    	constructor inline.
    	* libsupc++/guard_error.cc (__gnu_cxx::recursive_init_error): Define
    	constructor.
    	* testsuite/18_support/51333.cc: New test.
    
    From-SVN: r273946

Diff:
---
 libstdc++-v3/ChangeLog                     | 12 ++++++++++++
 libstdc++-v3/libsupc++/cxxabi.h            |  9 +++++----
 libstdc++-v3/libsupc++/guard_error.cc      |  4 ++--
 libstdc++-v3/testsuite/18_support/51333.cc | 22 ++++++++++++++++++++++
 4 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index be5d990..feef1f6 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+2019-07-31  Jonathan Wakely  <jwakely@redhat.com>
+
+	Backport from mainline
+	2019-07-29  Jonathan Wakely  <jwakely@redhat.com>
+
+	PR libstdc++/51333
+	* libsupc++/cxxabi.h (__gnu_cxx::recursive_init_error): Do not define
+	constructor inline.
+	* libsupc++/guard_error.cc (__gnu_cxx::recursive_init_error): Define
+	constructor.
+	* testsuite/18_support/51333.cc: New test.
+
 2019-07-26  Jonathan Wakely  <jwakely@redhat.com>
 
 	Backport from mainline
diff --git a/libstdc++-v3/libsupc++/cxxabi.h b/libstdc++-v3/libsupc++/cxxabi.h
index 3562d4c..4d9f829 100644
--- a/libstdc++-v3/libsupc++/cxxabi.h
+++ b/libstdc++-v3/libsupc++/cxxabi.h
@@ -684,8 +684,9 @@ namespace __gnu_cxx
    *  @brief Exception thrown by __cxa_guard_acquire.
    *  @ingroup exceptions
    *
-   *  6.7[stmt.dcl]/4: If control re-enters the declaration (recursively)
-   *  while the object is being initialized, the behavior is undefined.
+   *  C++ 2011 6.7 [stmt.dcl]/4: If control re-enters the declaration
+   *  recursively while the variable is being initialized, the behavior
+   *  is undefined.
    *
    *  Since we already have a library function to handle locking, we might
    *  as well check for this situation and throw an exception.
@@ -695,8 +696,8 @@ namespace __gnu_cxx
   class recursive_init_error: public std::exception
   {
   public:
-    recursive_init_error() throw() { }
-    virtual ~recursive_init_error() throw ();
+    recursive_init_error() _GLIBCXX_NOTHROW;
+    virtual ~recursive_init_error() _GLIBCXX_NOTHROW;
   };
 }
 #endif // __cplusplus
diff --git a/libstdc++-v3/libsupc++/guard_error.cc b/libstdc++-v3/libsupc++/guard_error.cc
index 7595c67..d7625af 100644
--- a/libstdc++-v3/libsupc++/guard_error.cc
+++ b/libstdc++-v3/libsupc++/guard_error.cc
@@ -26,6 +26,6 @@
 
 namespace __gnu_cxx
 {
-  recursive_init_error::~recursive_init_error() throw() { }
+  recursive_init_error::recursive_init_error() noexcept { }
+  recursive_init_error::~recursive_init_error() noexcept { }
 }
-
diff --git a/libstdc++-v3/testsuite/18_support/51333.cc b/libstdc++-v3/testsuite/18_support/51333.cc
new file mode 100644
index 0000000..0fb7c33
--- /dev/null
+++ b/libstdc++-v3/testsuite/18_support/51333.cc
@@ -0,0 +1,22 @@
+// Copyright (C) 2019 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 "-fkeep-inline-functions" }
+// { dg-do link }
+
+#include <cxxabi.h>
+int main() { } // PR libstdc++/51333



More information about the Gcc-cvs mailing list