[PATCH] Avoid #include <functional> in other headers

Jonathan Wakely jwakely@redhat.com
Thu Oct 13 16:55:00 GMT 2016


The <functional> header is pretty large, especially in C++17 mode
because the searchers include <vector> and <unordered_map>. This
tweaks other headers to avoid including it unnecessarily.

We could reduce things much further by splitting std::function and
std::reference_wrapper into their own headers, which I'm working on.
This kind of internal refactoring helps counteract the fact that the
library keep growing with each new standard revision so the headers
are larger and larger.

Any time we reduce interdepencies within the library headers we cause
compilation errors for some user code, but the fix is just to add the
missing headers. I'll mention this in the GCC 7 porting-to doc nearer
the release.

	* include/bits/shared_ptr_base.h: Include <functional>.
	[!__cpp_rtti]: Do not include <typeinfo>.
	* include/experimental/array: Do not include <functional>.
	* include/experimental/memory: Include <bits/functional_hash.h>
	instead of <functional>.
	* include/experimental/propagate_const: Include <bits/stl_function.h>,
	<bits/functional_hash.h>, and <bits/move.h> instead of <functional>.
	* include/experimental/tuple: Do not include <functional>.
	* include/std/future: Include <functional>.
	* include/std/memory: Do not include <functional>.
	* include/std/mutex: [_GLIBCXX_HAVE_TLS]: Likewise.
	* testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc: Add
	missing includes.
	* testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc: Likewise.
	* testsuite/20_util/specialized_algorithms/memory_management_tools/
	1.cc: Likewise.
	* testsuite/30_threads/call_once/60497.cc: Likewise.
	* testsuite/30_threads/lock/2.cc: Likewise.
	* testsuite/30_threads/thread/native_handle/cancel.cc: Likewise.
	* testsuite/experimental/algorithm/sample.cc: Likewise.
	* testsuite/experimental/array/make_array.cc: Likewise.
	* testsuite/experimental/array/neg.cc: Likewise. Adjust dg-error line.
	* testsuite/experimental/propagate_const/assignment/move_neg.cc:
	Adjust dg-error lines.
	* testsuite/experimental/propagate_const/cons/move_neg.cc: Likewise.
	* testsuite/experimental/propagate_const/requirements2.cc: Likewise.
	* testsuite/experimental/propagate_const/requirements3.cc: Likewise.
	* testsuite/experimental/propagate_const/requirements4.cc: Likewise.
	* testsuite/experimental/propagate_const/requirements5.cc: Likewise.

Tested powerpc64le-linux (without PCH), committed to trunk.


-------------- next part --------------
commit b125f5397462eee46dec2693232afc677df4e421
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Oct 13 15:55:18 2016 +0100

    Avoid #include <functional> in other headers
    
    	* include/bits/shared_ptr_base.h: Include <functional>.
    	[!__cpp_rtti]: Do not include <typeinfo>.
    	* include/experimental/array: Do not include <functional>.
    	* include/experimental/memory: Include <bits/functional_hash.h>
    	instead of <functional>.
    	* include/experimental/propagate_const: Include <bits/stl_function.h>,
    	<bits/functional_hash.h>, and <bits/move.h> instead of <functional>.
    	* include/experimental/tuple: Do not include <functional>.
    	* include/std/future: Include <functional>.
    	* include/std/memory: Do not include <functional>.
    	* include/std/mutex: [_GLIBCXX_HAVE_TLS]: Likewise.
    	* testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc: Add
    	missing includes.
    	* testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc: Likewise.
    	* testsuite/20_util/specialized_algorithms/memory_management_tools/
    	1.cc: Likewise.
    	* testsuite/30_threads/call_once/60497.cc: Likewise.
    	* testsuite/30_threads/lock/2.cc: Likewise.
    	* testsuite/30_threads/thread/native_handle/cancel.cc: Likewise.
    	* testsuite/experimental/algorithm/sample.cc: Likewise.
    	* testsuite/experimental/array/make_array.cc: Likewise.
    	* testsuite/experimental/array/neg.cc: Likewise. Adjust dg-error line.
    	* testsuite/experimental/propagate_const/assignment/move_neg.cc:
    	Adjust dg-error lines.
    	* testsuite/experimental/propagate_const/cons/move_neg.cc: Likewise.
    	* testsuite/experimental/propagate_const/requirements2.cc: Likewise.
    	* testsuite/experimental/propagate_const/requirements3.cc: Likewise.
    	* testsuite/experimental/propagate_const/requirements4.cc: Likewise.
    	* testsuite/experimental/propagate_const/requirements5.cc: Likewise.

diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h
index e8820a1..422e3b5 100644
--- a/libstdc++-v3/include/bits/shared_ptr_base.h
+++ b/libstdc++-v3/include/bits/shared_ptr_base.h
@@ -49,7 +49,10 @@
 #ifndef _SHARED_PTR_BASE_H
 #define _SHARED_PTR_BASE_H 1
 
-#include <typeinfo>
+#include <functional>
+#if __cpp_rtti
+# include <typeinfo>
+#endif
 #include <bits/allocated_ptr.h>
 #include <ext/aligned_buffer.h>
 
diff --git a/libstdc++-v3/include/experimental/array b/libstdc++-v3/include/experimental/array
index 31a066b..34d75cc 100644
--- a/libstdc++-v3/include/experimental/array
+++ b/libstdc++-v3/include/experimental/array
@@ -36,7 +36,6 @@
 #else
 
 #include <array>
-#include <functional>
 #include <experimental/type_traits>
 
 namespace std _GLIBCXX_VISIBILITY(default)
diff --git a/libstdc++-v3/include/experimental/memory b/libstdc++-v3/include/experimental/memory
index 885d11c..81def24 100644
--- a/libstdc++-v3/include/experimental/memory
+++ b/libstdc++-v3/include/experimental/memory
@@ -42,8 +42,8 @@
 #include <memory>
 #include <type_traits>
 #include <utility>
-#include <functional>
 #include <experimental/bits/shared_ptr.h>
+#include <bits/functional_hash.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/propagate_const b/libstdc++-v3/include/experimental/propagate_const
index e1fb4e4..5f32111 100644
--- a/libstdc++-v3/include/experimental/propagate_const
+++ b/libstdc++-v3/include/experimental/propagate_const
@@ -36,7 +36,9 @@
 #else
 
 #include <type_traits>
-#include <functional>
+#include <bits/functional_hash.h>
+#include <bits/move.h>
+#include <bits/stl_function.h>
 #include <experimental/bits/lfts_config.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
diff --git a/libstdc++-v3/include/experimental/tuple b/libstdc++-v3/include/experimental/tuple
index dc158e8..e83a0ed 100644
--- a/libstdc++-v3/include/experimental/tuple
+++ b/libstdc++-v3/include/experimental/tuple
@@ -36,7 +36,6 @@
 #else
 
 #include <tuple>
-#include <functional>
 #include <bits/invoke.h>
 #include <experimental/bits/lfts_config.h>
 
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index fffbdbb..31a21f9 100644
--- a/libstdc++-v3/include/std/future
+++ b/libstdc++-v3/include/std/future
@@ -40,6 +40,7 @@
 #include <condition_variable>
 #include <system_error>
 #include <atomic>
+#include <functional>
 #include <bits/atomic_futex.h>
 #include <bits/functexcept.h>
 #include <bits/invoke.h>
diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory
index beee91a..0f6d8bc 100644
--- a/libstdc++-v3/include/std/memory
+++ b/libstdc++-v3/include/std/memory
@@ -76,7 +76,6 @@
 #  include <bits/stl_function.h>  // std::less
 #  include <bits/uses_allocator.h>
 #  include <type_traits>
-#  include <functional>
 #  include <debug/debug.h>
 #  include <bits/unique_ptr.h>
 #  include <bits/shared_ptr.h>
diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex
index e90006f..0e1bc7f 100644
--- a/libstdc++-v3/include/std/mutex
+++ b/libstdc++-v3/include/std/mutex
@@ -39,13 +39,15 @@
 #include <chrono>
 #include <exception>
 #include <type_traits>
-#include <functional>
 #include <system_error>
 #include <bits/std_mutex.h>
 #if ! _GTHREAD_USE_MUTEX_TIMEDLOCK
 # include <condition_variable>
 # include <thread>
 #endif
+#ifndef _GLIBCXX_HAVE_TLS
+# include <functional>
+#endif
 
 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
 
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc
index 5014898..e78093f 100644
--- a/libstdc++-v3/testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc
+++ b/libstdc++-v3/testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc
@@ -28,6 +28,7 @@
 #include <cstdlib>
 #include <thread>
 #include <atomic>
+#include <functional>
 #include <testsuite_hooks.h>
 
 #ifdef _GLIBCXX_HAVE_UNISTD_H
diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc
index eaa72c4..96a5cf8 100644
--- a/libstdc++-v3/testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc
+++ b/libstdc++-v3/testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc
@@ -28,6 +28,7 @@
 #include <cstdlib>
 #include <thread>
 #include <atomic>
+#include <functional>
 #include <testsuite_hooks.h>
 
 #ifdef _GLIBCXX_HAVE_UNISTD_H
diff --git a/libstdc++-v3/testsuite/20_util/specialized_algorithms/memory_management_tools/1.cc b/libstdc++-v3/testsuite/20_util/specialized_algorithms/memory_management_tools/1.cc
index a86e61a..a847767 100644
--- a/libstdc++-v3/testsuite/20_util/specialized_algorithms/memory_management_tools/1.cc
+++ b/libstdc++-v3/testsuite/20_util/specialized_algorithms/memory_management_tools/1.cc
@@ -21,6 +21,7 @@
 #include <testsuite_hooks.h>
 #include <string>
 #include <array>
+#include <vector>
 #include <sstream>
 
 int del_count = 0;
diff --git a/libstdc++-v3/testsuite/30_threads/call_once/60497.cc b/libstdc++-v3/testsuite/30_threads/call_once/60497.cc
index 43dc917..a9e6449 100644
--- a/libstdc++-v3/testsuite/30_threads/call_once/60497.cc
+++ b/libstdc++-v3/testsuite/30_threads/call_once/60497.cc
@@ -25,6 +25,7 @@
 
 #include <mutex>
 #include <memory>
+#include <functional>
 
 struct A;
 template<typename T> struct B { T t; };
diff --git a/libstdc++-v3/testsuite/30_threads/lock/2.cc b/libstdc++-v3/testsuite/30_threads/lock/2.cc
index d3692a0..c174420 100644
--- a/libstdc++-v3/testsuite/30_threads/lock/2.cc
+++ b/libstdc++-v3/testsuite/30_threads/lock/2.cc
@@ -24,6 +24,7 @@
 
 #include <mutex>
 #include <thread>
+#include <functional>
 #include <testsuite_hooks.h>
 
 void locker(std::mutex& m1, std::mutex& m2, std::mutex& m3)
diff --git a/libstdc++-v3/testsuite/30_threads/thread/native_handle/cancel.cc b/libstdc++-v3/testsuite/30_threads/thread/native_handle/cancel.cc
index 9b5417c..db04b05 100644
--- a/libstdc++-v3/testsuite/30_threads/thread/native_handle/cancel.cc
+++ b/libstdc++-v3/testsuite/30_threads/thread/native_handle/cancel.cc
@@ -24,6 +24,7 @@
 #include <pthread.h>
 #include <thread>
 #include <atomic>
+#include <functional>
 
 void f(std::atomic<bool>& started)
 {
diff --git a/libstdc++-v3/testsuite/experimental/algorithm/sample.cc b/libstdc++-v3/testsuite/experimental/algorithm/sample.cc
index 0d84e9d..16e6a74 100644
--- a/libstdc++-v3/testsuite/experimental/algorithm/sample.cc
+++ b/libstdc++-v3/testsuite/experimental/algorithm/sample.cc
@@ -23,6 +23,7 @@
 #include <forward_list>
 #include <vector>
 #include <random>
+#include <algorithm>
 #include <testsuite_hooks.h>
 
 std::mt19937 rng;
diff --git a/libstdc++-v3/testsuite/experimental/array/make_array.cc b/libstdc++-v3/testsuite/experimental/array/make_array.cc
index 56611df..e91a5d8 100644
--- a/libstdc++-v3/testsuite/experimental/array/make_array.cc
+++ b/libstdc++-v3/testsuite/experimental/array/make_array.cc
@@ -18,6 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 #include <experimental/array>
+#include <functional>
 
 struct MoveOnly
 {
diff --git a/libstdc++-v3/testsuite/experimental/array/neg.cc b/libstdc++-v3/testsuite/experimental/array/neg.cc
index e91a5c5..cd08657 100644
--- a/libstdc++-v3/testsuite/experimental/array/neg.cc
+++ b/libstdc++-v3/testsuite/experimental/array/neg.cc
@@ -18,10 +18,11 @@
 // <http://www.gnu.org/licenses/>.
 
 #include <experimental/array>
+#include <functional>
 
 int main()
 {
   int dummy;
   auto bad = std::experimental::make_array(std::ref(dummy));
-  // { dg-error "make_array cannot be used without an explicit target type if any of the types given is a reference_wrapper" "" { target *-*-* } 77 }
+  // { dg-error "make_array cannot be used without an explicit target type if any of the types given is a reference_wrapper" "" { target *-*-* } 76 }
 }
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc b/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc
index 1b0366d..6dc0e2e 100644
--- a/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc
+++ b/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc
@@ -25,7 +25,7 @@
 using std::experimental::propagate_const;
 using std::unique_ptr;
 
-// { dg-error "no type" "" { target *-*-* } 159 }
+// { dg-error "no type" "" { target *-*-* } 161 }
 
 int main()
 {
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc b/libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc
index ffdc756..abfc62d 100644
--- a/libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc
+++ b/libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc
@@ -25,10 +25,10 @@
 using std::experimental::propagate_const;
 using std::unique_ptr;
 
-// { dg-error "no type" "" { target *-*-* } 118 }
-// { dg-error "no type" "" { target *-*-* } 125 }
-// { dg-error "no type" "" { target *-*-* } 134 }
-// { dg-error "no type" "" { target *-*-* } 143 }
+// { dg-error "no type" "" { target *-*-* } 120 }
+// { dg-error "no type" "" { target *-*-* } 127 }
+// { dg-error "no type" "" { target *-*-* } 136 }
+// { dg-error "no type" "" { target *-*-* } 145 }
 
 int main()
 {
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc
index de2d293..5f46dc4 100644
--- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc
+++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc
@@ -21,9 +21,9 @@
 
 using std::experimental::propagate_const;
 
-// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 }
-// { dg-error "not a pointer-to-object type" "" { target *-*-* } 66 }
-// { dg-error "forming pointer to reference type" "" { target *-*-* } 185 }
-// { dg-error "forming pointer to reference type" "" { target *-*-* } 211 }
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 }
+// { dg-error "not a pointer-to-object type" "" { target *-*-* } 68 }
+// { dg-error "forming pointer to reference type" "" { target *-*-* } 187 }
+// { dg-error "forming pointer to reference type" "" { target *-*-* } 213 }
 
 propagate_const<void*> test1;
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc
index fd25204..abc4839 100644
--- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc
+++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc
@@ -21,6 +21,6 @@
 
 using std::experimental::propagate_const;
 
-// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 }
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 }
 
 propagate_const<void (*)()> test1;
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc
index 3cea93d..1c3c653 100644
--- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc
+++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc
@@ -21,8 +21,8 @@
 
 using std::experimental::propagate_const;
 
-// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 }
-// { dg-error "invalid type" "" { target *-*-* } 66 }
-// { dg-error "uninitialized reference member" "" { target *-*-* } 112 }
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 }
+// { dg-error "invalid type" "" { target *-*-* } 68 }
+// { dg-error "uninitialized reference member" "" { target *-*-* } 114 }
 
 propagate_const<int&> test1; // { dg-error "use of deleted function" }
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc
index 9740fc3..72844fa 100644
--- a/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc
+++ b/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc
@@ -21,6 +21,6 @@
 
 using std::experimental::propagate_const;
 
-// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 105 }
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 }
 
 propagate_const<int[1]> test1;


More information about the Libstdc++ mailing list