[flang-commits] [flang] e3dda81 - [flang][OpenMP] Add `is_range<R>` trait to detect classes with begin/end, NFC (#183615)
via flang-commits
flang-commits at lists.llvm.org
Fri Feb 27 04:26:42 PST 2026
Author: Krzysztof Parzyszek
Date: 2026-02-27T06:26:37-06:00
New Revision: e3dda81e2a802112fb9b3129ec34d1103e5ed5d6
URL: https://github.com/llvm/llvm-project/commit/e3dda81e2a802112fb9b3129ec34d1103e5ed5d6
DIFF: https://github.com/llvm/llvm-project/commit/e3dda81e2a802112fb9b3129ec34d1103e5ed5d6.diff
LOG: [flang][OpenMP] Add `is_range<R>` trait to detect classes with begin/end, NFC (#183615)
Added:
Modified:
flang/include/flang/Parser/openmp-utils.h
Removed:
################################################################################
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index 65a9890d85293..6cfaf8bb21712 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -239,6 +239,19 @@ struct OmpAllocateInfo {
OmpAllocateInfo SplitOmpAllocate(const OmpAllocateDirective &x);
+template <typename R, typename = void, typename = void> struct is_range {
+ static constexpr bool value{false};
+};
+
+template <typename R>
+struct is_range<R, //
+ std::void_t<decltype(std::declval<R>().begin())>,
+ std::void_t<decltype(std::declval<R>().end())>> {
+ static constexpr bool value{true};
+};
+
+template <typename R> constexpr bool is_range_v = is_range<R>::value;
+
// Iterate over a range of parser::Block::const_iterator's. When the end
// of the range is reached, the iterator becomes invalid.
// Treat BLOCK constructs as if they were transparent, i.e. as if the
@@ -296,9 +309,7 @@ struct ExecutionPartIterator {
stack_.emplace_back(b, e, c);
adjust();
}
- template <typename R, //
- typename = decltype(std::declval<R>().begin()),
- typename = decltype(std::declval<R>().end())>
+ template <typename R, typename = std::enable_if_t<is_range_v<R>>>
ExecutionPartIterator(const R &range, Step stepping = Step::Default,
const ExecutionPartConstruct *construct = nullptr)
: ExecutionPartIterator(range.begin(), range.end(), stepping, construct) {
@@ -368,9 +379,7 @@ template <typename Iterator = ExecutionPartIterator> struct ExecutionPartRange {
Step stepping = Step::Default,
const ExecutionPartConstruct *owner = nullptr)
: begin_(begin, end, stepping, owner), end_() {}
- template <typename R, //
- typename = decltype(std::declval<R>().begin()),
- typename = decltype(std::declval<R>().end())>
+ template <typename R, typename = std::enable_if_t<is_range_v<R>>>
ExecutionPartRange(const R &range, Step stepping = Step::Default,
const ExecutionPartConstruct *owner = nullptr)
: ExecutionPartRange(range.begin(), range.end(), stepping, owner) {}
@@ -390,9 +399,7 @@ struct LoopNestIterator : public ExecutionPartIterator {
: ExecutionPartIterator(b, e, s, c) {
adjust();
}
- template <typename R, //
- typename = decltype(std::declval<R>().begin()),
- typename = decltype(std::declval<R>().end())>
+ template <typename R, typename = std::enable_if_t<is_range_v<R>>>
LoopNestIterator(const R &range, Step stepping = Step::Default,
const ExecutionPartConstruct *construct = nullptr)
: LoopNestIterator(range.begin(), range.end(), stepping, construct) {}
More information about the flang-commits
mailing list