Meinersbur created this revision. Meinersbur added a reviewer: ABataev. Meinersbur added a project: OpenMP. Herald added subscribers: guansong, yaxunl. Meinersbur requested review of this revision. Herald added a reviewer: jdoerfert. Herald added subscribers: cfe-commits, sstefan1. Herald added a project: clang.
The current method getSingleClause requires an instance of OMPExecutableDirective to be called. Introduce a static version taking a list of clauses as argument instead that can be used during parsing/Sema before any OMPExecutableDirective has been created. This is the same approach as taken for getClausesOfKind for getting more more than a single clause of a type which also has a method and static version. NFC patch extracted out of D99459 <https://reviews.llvm.org/D99459> by request. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103665 Files: clang/include/clang/AST/StmtOpenMP.h Index: clang/include/clang/AST/StmtOpenMP.h =================================================================== --- clang/include/clang/AST/StmtOpenMP.h +++ clang/include/clang/AST/StmtOpenMP.h @@ -460,17 +460,22 @@ /// directive). Returns nullptr if no clause of this kind is associated with /// the directive. template <typename SpecificClause> - const SpecificClause *getSingleClause() const { - auto Clauses = getClausesOfKind<SpecificClause>(); + static const SpecificClause *getSingleClause(ArrayRef<OMPClause *> Clauses) { + auto ClausesOfKind = getClausesOfKind<SpecificClause>(Clauses); - if (Clauses.begin() != Clauses.end()) { - assert(std::next(Clauses.begin()) == Clauses.end() && + if (ClausesOfKind.begin() != ClausesOfKind.end()) { + assert(std::next(ClausesOfKind.begin()) == ClausesOfKind.end() && "There are at least 2 clauses of the specified kind"); - return *Clauses.begin(); + return *ClausesOfKind.begin(); } return nullptr; } + template <typename SpecificClause> + const SpecificClause *getSingleClause() const { + return getSingleClause<SpecificClause>(clauses()); + } + /// Returns true if the current directive has one or more clauses of a /// specific kind. template <typename SpecificClause>
Index: clang/include/clang/AST/StmtOpenMP.h =================================================================== --- clang/include/clang/AST/StmtOpenMP.h +++ clang/include/clang/AST/StmtOpenMP.h @@ -460,17 +460,22 @@ /// directive). Returns nullptr if no clause of this kind is associated with /// the directive. template <typename SpecificClause> - const SpecificClause *getSingleClause() const { - auto Clauses = getClausesOfKind<SpecificClause>(); + static const SpecificClause *getSingleClause(ArrayRef<OMPClause *> Clauses) { + auto ClausesOfKind = getClausesOfKind<SpecificClause>(Clauses); - if (Clauses.begin() != Clauses.end()) { - assert(std::next(Clauses.begin()) == Clauses.end() && + if (ClausesOfKind.begin() != ClausesOfKind.end()) { + assert(std::next(ClausesOfKind.begin()) == ClausesOfKind.end() && "There are at least 2 clauses of the specified kind"); - return *Clauses.begin(); + return *ClausesOfKind.begin(); } return nullptr; } + template <typename SpecificClause> + const SpecificClause *getSingleClause() const { + return getSingleClause<SpecificClause>(clauses()); + } + /// Returns true if the current directive has one or more clauses of a /// specific kind. template <typename SpecificClause>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits