Index: uspace/lib/cpp/include/internal/functional/hash.hpp
===================================================================
--- uspace/lib/cpp/include/internal/functional/hash.hpp	(revision 0e5e8bf9969aa30c5d54c5f019afab3cb17654d4)
+++ uspace/lib/cpp/include/internal/functional/hash.hpp	(revision 8f8f1d1e8f1446fa8c5b38625e3a6452a368570d)
@@ -30,6 +30,14 @@
 #define LIBCPP_INTERNAL_FUNCTIONAL_HASH
 
+#include <cstdlib>
+
 namespace std
 {
+    template<class>
+    struct is_arithmetic;
+
+    template<class>
+    struct is_pointer;
+
     /**
      * 20.9.13, hash function primary template:
@@ -64,5 +72,5 @@
         size_t hash(T x) noexcept
         {
-            static_assert(is_arithmetic_v<T> || is_pointer_v<T>,
+            static_assert(is_arithmetic<T>::value || is_pointer<T>::value,
                           "invalid type passed to aux::hash");
 
Index: uspace/lib/cpp/include/internal/functional/invoke.hpp
===================================================================
--- uspace/lib/cpp/include/internal/functional/invoke.hpp	(revision 0e5e8bf9969aa30c5d54c5f019afab3cb17654d4)
+++ uspace/lib/cpp/include/internal/functional/invoke.hpp	(revision 8f8f1d1e8f1446fa8c5b38625e3a6452a368570d)
@@ -32,5 +32,16 @@
 #include <internal/utility/declval.hpp>
 #include <internal/utility/forward_move.hpp>
-#include <type_traits>
+
+namespace std
+{
+    template<class>
+    struct is_member_function_pointer;
+
+    template<class, class>
+    struct is_base_of;
+
+    template<class>
+    struct is_member_object_pointer;
+}
 
 namespace std::aux
@@ -43,7 +54,7 @@
     decltype(auto) invoke(R T::* f, T1&& t1, Ts&&... args)
     {
-        if constexpr (is_member_function_pointer_v<decltype(f)>)
+        if constexpr (is_member_function_pointer<decltype(f)>::value)
         {
-            if constexpr (is_base_of_v<T, remove_reference_t<T1>>)
+            if constexpr (is_base_of<T, remove_reference_t<T1>>::value)
                 // (1.1)
                 return (t1.*f)(forward<Ts>(args)...);
@@ -52,5 +63,5 @@
                 return ((*t1).*f)(forward<Ts>(args)...);
         }
-        else if constexpr (is_member_object_pointer_v<decltype(f)> && sizeof...(args) == 0)
+        else if constexpr (is_member_object_pointer<decltype(f)>::value && sizeof...(args) == 0)
         {
             /**
@@ -58,5 +69,5 @@
              *       so we need sizeof...(args) to be 0.
              */
-            if constexpr (is_base_of_v<T, remove_reference_t<T1>>)
+            if constexpr (is_base_of<T, remove_reference_t<T1>>::value)
                 // (1.3)
                 return t1.*f;
@@ -73,5 +84,5 @@
          *       so we use this because we know it is false here.
          */
-        static_assert(is_member_function_pointer_v<decltype(f)>, "invalid invoke");
+        static_assert(is_member_function_pointer<decltype(f)>::value, "invalid invoke");
     }
 
