[committed] libstdc++: Make testsuite usable with -fno-exceptions

Message ID 20200730121122.GA1004462@redhat.com
State New
Headers show
Series
  • [committed] libstdc++: Make testsuite usable with -fno-exceptions
Related show

Commit Message

Jonathan Wakely via Gcc-patches July 30, 2020, 12:11 p.m.
Previously it was not possible to add -fno-exceptions to the testsuite
flags, because some files that are compiled by the v3-build_support
procedure failed with exceptions disabled.

This adjusts those files to still compile without exceptions (with
degraded functionality in some cases).

The sole testcase that explicitly checks for -fno-exceptions has also
been adjusted to use the more robust exceptions_enabled effective-target
keyword from gcc/testsuite/lib/target-supports.exp.

libstdc++-v3/ChangeLog:

	* testsuite/23_containers/vector/bool/72847.cc: Use the
	exceptions_enabled effective-target keyword instead of
	checking for an explicit -fno-exceptions option.
	* testsuite/util/testsuite_abi.cc (examine_symbol): Remove
	redundant try-catch.
	* testsuite/util/testsuite_allocator.h [!__cpp_exceptions]:
	Do not define check_allocate_max_size and memory_resource.
	* testsuite/util/testsuite_containers.h: Replace comment with
	#error if wrong standard dialect used.
	* testsuite/util/testsuite_shared.cc: Likewise.

Tested powerpc64le-linux, committed to trunk.
commit 4c27c6584d0c15926f57ac40f931e238cf0b3110
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Jul 30 12:23:54 2020

    libstdc++: Make testsuite usable with -fno-exceptions
    
    Previously it was not possible to add -fno-exceptions to the testsuite
    flags, because some files that are compiled by the v3-build_support
    procedure failed with exceptions disabled.
    
    This adjusts those files to still compile without exceptions (with
    degraded functionality in some cases).
    
    The sole testcase that explicitly checks for -fno-exceptions has also
    been adjusted to use the more robust exceptions_enabled effective-target
    keyword from gcc/testsuite/lib/target-supports.exp.
    
    libstdc++-v3/ChangeLog:
    
            * testsuite/23_containers/vector/bool/72847.cc: Use the
            exceptions_enabled effective-target keyword instead of
            checking for an explicit -fno-exceptions option.
            * testsuite/util/testsuite_abi.cc (examine_symbol): Remove
            redundant try-catch.
            * testsuite/util/testsuite_allocator.h [!__cpp_exceptions]:
            Do not define check_allocate_max_size and memory_resource.
            * testsuite/util/testsuite_containers.h: Replace comment with
            #error if wrong standard dialect used.
            * testsuite/util/testsuite_shared.cc: Likewise.

Patch

diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc
index 26260e762af..c4fbc75abe8 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc
@@ -15,7 +15,7 @@ 
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-skip-if "" { *-*-* } { "-fno-exceptions" } }
+// { dg-require-effective-target exceptions_enabled }
 
 #include <vector>
 #include <ext/throw_allocator.h>
diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.cc b/libstdc++-v3/testsuite/util/testsuite_abi.cc
index fd8224b6789..f4bd319855a 100644
--- a/libstdc++-v3/testsuite/util/testsuite_abi.cc
+++ b/libstdc++-v3/testsuite/util/testsuite_abi.cc
@@ -362,14 +362,9 @@  get_symbol(const string& name, const symbols& s)
 void
 examine_symbol(const char* name, const char* file)
 {
-  try
-    {
-      symbols s = create_symbols(file);
-      const symbol& sym = get_symbol(name, s);
-      sym.print();
-    }
-  catch(...)
-    { __throw_exception_again; }
+    symbols s = create_symbols(file);
+    const symbol& sym = get_symbol(name, s);
+    sym.print();
 }
 
 int
diff --git a/libstdc++-v3/testsuite/util/testsuite_allocator.h b/libstdc++-v3/testsuite/util/testsuite_allocator.h
index e52ef788467..e030ed5500c 100644
--- a/libstdc++-v3/testsuite/util/testsuite_allocator.h
+++ b/libstdc++-v3/testsuite/util/testsuite_allocator.h
@@ -257,6 +257,7 @@  namespace __gnu_test
       return true;
     }
 
+#if __cpp_exceptions
   template<typename Alloc>
     bool
     check_allocate_max_size()
@@ -276,6 +277,7 @@  namespace __gnu_test
 	}
       throw;
     }
+#endif
 
   // A simple allocator which can be constructed endowed of a given
   // "personality" (an integer), queried in operator== to simulate the
@@ -761,7 +763,7 @@  namespace __gnu_test
 #endif // C++11
 
 #if __cplusplus >= 201703L
-#if __cpp_aligned_new && __cpp_rtti
+#if __cpp_aligned_new && __cpp_rtti && __cpp_exceptions
   // A concrete memory_resource, with error checking.
   class memory_resource : public std::pmr::memory_resource
   {
diff --git a/libstdc++-v3/testsuite/util/testsuite_containers.h b/libstdc++-v3/testsuite/util/testsuite_containers.h
index 8566af17c4a..33259ae3601 100644
--- a/libstdc++-v3/testsuite/util/testsuite_containers.h
+++ b/libstdc++-v3/testsuite/util/testsuite_containers.h
@@ -408,8 +408,9 @@  namespace __gnu_test
   void
   erase_external_iterators(std::multimap<int, int>& s);
 
-// NB: "must be compiled with C++11"
-#if __cplusplus >= 201103L
+#if __cplusplus < 201103L
+# error "must be compiled with C++11 (or later)"
+#else
 template<typename _Tp>
   void
   linkage_check_cxx98_cxx11_erase(_Tp& container)
diff --git a/libstdc++-v3/testsuite/util/testsuite_shared.cc b/libstdc++-v3/testsuite/util/testsuite_shared.cc
index b0458dd33d3..eabff4c25c5 100644
--- a/libstdc++-v3/testsuite/util/testsuite_shared.cc
+++ b/libstdc++-v3/testsuite/util/testsuite_shared.cc
@@ -45,12 +45,14 @@  try_allocation()
 extern "C" void
 try_throw_exception()
 {
+#if __cpp_exceptions
   try
     {
       std::__throw_bad_exception();
     }
   catch (const std::exception& e)
     { }
+#endif
 }
 
 extern "C" void
@@ -75,8 +77,9 @@  try_function_random_fail()
   std::__throw_bad_exception();
 }
 
-#if __cplusplus < 201103L
-// "must be compiled with C++98"
+#if __cplusplus >= 201103L
+# error "must be compiled with C++98"
+#else
   void
   erase_external(std::set<int>& s)
   { s.erase(s.begin()); }