Fix header inclusion order failures

Summary: See https://bugs.llvm.org/show_bug.cgi?id=41432

Subscribers: libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D60525

llvm-svn: 358121
GitOrigin-RevId: e3e24ad25fb1df489518d83550cde0a40c7c562c
diff --git a/include/pstl/internal/glue_algorithm_defs.h b/include/pstl/internal/glue_algorithm_defs.h
index c622ed3..14faaae 100644
--- a/include/pstl/internal/glue_algorithm_defs.h
+++ b/include/pstl/internal/glue_algorithm_defs.h
@@ -11,6 +11,7 @@
 #define __PSTL_glue_algorithm_defs_H
 
 #include <functional>
+#include <iterator>
 
 #include "execution_defs.h"
 
diff --git a/include/pstl/internal/glue_algorithm_impl.h b/include/pstl/internal/glue_algorithm_impl.h
index 2e0b818..56c1194 100644
--- a/include/pstl/internal/glue_algorithm_impl.h
+++ b/include/pstl/internal/glue_algorithm_impl.h
@@ -17,6 +17,8 @@
 #include "algorithm_fwd.h"
 #include "numeric_fwd.h" /* count and count_if use __pattern_transform_reduce */
 
+#include "execution_impl.h"
+
 namespace std
 {
 
diff --git a/include/pstl/internal/glue_memory_impl.h b/include/pstl/internal/glue_memory_impl.h
index 4cde9ba..9798b80 100644
--- a/include/pstl/internal/glue_memory_impl.h
+++ b/include/pstl/internal/glue_memory_impl.h
@@ -10,9 +10,12 @@
 #ifndef __PSTL_glue_memory_impl_H
 #define __PSTL_glue_memory_impl_H
 
+#include "execution_defs.h"
 #include "utils.h"
 #include "algorithm_fwd.h"
 
+#include "execution_impl.h"
+
 namespace std
 {
 
diff --git a/include/pstl/internal/glue_numeric_defs.h b/include/pstl/internal/glue_numeric_defs.h
index 55187f1..03d06c9 100644
--- a/include/pstl/internal/glue_numeric_defs.h
+++ b/include/pstl/internal/glue_numeric_defs.h
@@ -10,6 +10,8 @@
 #ifndef __PSTL_glue_numeric_defs_H
 #define __PSTL_glue_numeric_defs_H
 
+#include <iterator>
+
 #include "execution_defs.h"
 
 namespace std
diff --git a/include/pstl/internal/glue_numeric_impl.h b/include/pstl/internal/glue_numeric_impl.h
index bde0b03..c462891 100644
--- a/include/pstl/internal/glue_numeric_impl.h
+++ b/include/pstl/internal/glue_numeric_impl.h
@@ -14,6 +14,7 @@
 
 #include "utils.h"
 #include "numeric_fwd.h"
+#include "execution_impl.h"
 
 namespace std
 {
diff --git a/test/pstl/header_inclusion_order_algorithm_0.pass.cpp b/test/pstl/header_inclusion_order_algorithm_0.pass.cpp
new file mode 100644
index 0000000..0b0d79b
--- /dev/null
+++ b/test/pstl/header_inclusion_order_algorithm_0.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===-- header_inclusion_order_algorithm_0.pass.cpp -----------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "support/pstl_test_config.h"
+
+#ifdef PSTL_STANDALONE_TESTS
+#include "pstl/execution"
+#include "pstl/algorithm"
+#else
+#include <execution>
+#include <algorithm>
+#endif // PSTL_STANDALONE_TESTS
+
+int32_t
+main()
+{
+    return 0;
+}
diff --git a/test/pstl/header_inclusion_order_algorithm_1.pass.cpp b/test/pstl/header_inclusion_order_algorithm_1.pass.cpp
new file mode 100644
index 0000000..e346a3b
--- /dev/null
+++ b/test/pstl/header_inclusion_order_algorithm_1.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===-- header_inclusion_order_algorithm_1.pass.cpp -----------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "support/pstl_test_config.h"
+
+#ifdef PSTL_STANDALONE_TESTS
+#include "pstl/algorithm"
+#include "pstl/execution"
+#else
+#include <algorithm>
+#include <execution>
+#endif // PSTL_STANDALONE_TESTS
+
+int32_t
+main()
+{
+    return 0;
+}
diff --git a/test/pstl/header_inclusion_order_memory_0.pass.cpp b/test/pstl/header_inclusion_order_memory_0.pass.cpp
new file mode 100644
index 0000000..1a8a117
--- /dev/null
+++ b/test/pstl/header_inclusion_order_memory_0.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===-- header_inclusion_order_memory_0.pass.cpp --------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "support/pstl_test_config.h"
+
+#ifdef PSTL_STANDALONE_TESTS
+#include "pstl/execution"
+#include "pstl/memory"
+#else
+#include <execution>
+#include <memory>
+#endif // PSTL_STANDALONE_TESTS
+
+int32_t
+main()
+{
+    return 0;
+}
diff --git a/test/pstl/header_inclusion_order_memory_1.pass.cpp b/test/pstl/header_inclusion_order_memory_1.pass.cpp
new file mode 100644
index 0000000..2e34323
--- /dev/null
+++ b/test/pstl/header_inclusion_order_memory_1.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===-- header_inclusion_order_memory_1.pass.cpp --------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "support/pstl_test_config.h"
+
+#ifdef PSTL_STANDALONE_TESTS
+#include "pstl/memory"
+#include "pstl/execution"
+#else
+#include <memory>
+#include <execution>
+#endif // PSTL_STANDALONE_TESTS
+
+int32_t
+main()
+{
+    return 0;
+}
diff --git a/test/pstl/header_inclusion_order_numeric_0.pass.cpp b/test/pstl/header_inclusion_order_numeric_0.pass.cpp
new file mode 100644
index 0000000..1ff596e
--- /dev/null
+++ b/test/pstl/header_inclusion_order_numeric_0.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===-- header_inclusion_order_numeric_0.pass.cpp -------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "support/pstl_test_config.h"
+
+#ifdef PSTL_STANDALONE_TESTS
+#include "pstl/execution"
+#include "pstl/numeric"
+#else
+#include <execution>
+#include <numeric>
+#endif // PSTL_STANDALONE_TESTS
+
+int32_t
+main()
+{
+    return 0;
+}
diff --git a/test/pstl/header_inclusion_order_numeric_1.pass.cpp b/test/pstl/header_inclusion_order_numeric_1.pass.cpp
new file mode 100644
index 0000000..3c5b8cf
--- /dev/null
+++ b/test/pstl/header_inclusion_order_numeric_1.pass.cpp
@@ -0,0 +1,24 @@
+// -*- C++ -*-
+//===-- header_inclusion_order_numeric_0.pass.cpp -------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "support/pstl_test_config.h"
+
+#ifdef PSTL_STANDALONE_TESTS
+#include "pstl/numeric"
+#include "pstl/execution"
+#else
+#include <numeric>
+#include <execution>
+#endif // PSTL_STANDALONE_TESTS
+
+int32_t
+main()
+{
+    return 0;
+}