================ @@ -2013,6 +2064,184 @@ class OMPMergeableClause : public OMPClause { } }; +/// This represents the 'absent' clause in the '#pragma omp assume' +/// directive. +/// +/// \code +/// #pragma omp assume absent(<directive-name list>) +/// \endcode +/// In this example directive '#pragma omp assume' has an 'absent' clause. +class OMPAbsentClause final + : public OMPDirectiveListClause<OMPAbsentClause>, + private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> { + friend OMPDirectiveListClause; + friend TrailingObjects; + +public: + /// Build 'absent' clause. + /// + /// \param StartLoc Starting location of the clause. + /// \param LParenLoc Location of '('. + /// \param EndLoc Ending location of the clause. + /// \param NumKinds Number of directive kinds listed in the clause. + OMPAbsentClause(SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation EndLoc, unsigned NumKinds) + : OMPDirectiveListClause<OMPAbsentClause>( + llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc, NumKinds) {} + + /// Build an empty clause. + OMPAbsentClause(unsigned NumKinds) + : OMPDirectiveListClause<OMPAbsentClause>( + llvm::omp::OMPC_absent, SourceLocation(), SourceLocation(), + SourceLocation(), NumKinds) {} + + static OMPAbsentClause *Create(const ASTContext &C, + ArrayRef<OpenMPDirectiveKind> DKVec, + SourceLocation Loc, SourceLocation LLoc, + SourceLocation RLoc); + + static OMPAbsentClause *CreateEmpty(const ASTContext &C, unsigned NumKinds); + + static bool classof(const OMPClause *C) { + return C->getClauseKind() == llvm::omp::OMPC_absent; + } +}; + +/// This represents the 'contains' clause in the '#pragma omp assume' +/// directive. +/// +/// \code +/// #pragma omp assume contains(<directive-name list>) +/// \endcode +/// In this example directive '#pragma omp assume' has a 'contains' clause. +class OMPContainsClause final + : public OMPDirectiveListClause<OMPContainsClause>, + private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> { + friend OMPDirectiveListClause; + friend TrailingObjects; + +public: + /// Build 'contains' clause. + /// + /// \param StartLoc Starting location of the clause. + /// \param LParenLoc Location of '('. + /// \param EndLoc Ending location of the clause. + /// \param NumKinds Number of directive kinds listed in the clause. + OMPContainsClause(SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation EndLoc, unsigned NumKinds) + : OMPDirectiveListClause<OMPContainsClause>( + llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc, NumKinds) {} + + /// Build an empty clause. + OMPContainsClause(unsigned NumKinds) + : OMPDirectiveListClause<OMPContainsClause>( + llvm::omp::OMPC_contains, SourceLocation(), SourceLocation(), + SourceLocation(), NumKinds) {} + + static OMPContainsClause *Create(const ASTContext &C, + ArrayRef<OpenMPDirectiveKind> DKVec, + SourceLocation Loc, SourceLocation LLoc, + SourceLocation RLoc); + + static OMPContainsClause *CreateEmpty(const ASTContext &C, unsigned NumKinds); + + static bool classof(const OMPClause *C) { + return C->getClauseKind() == llvm::omp::OMPC_contains; + } +}; + +/// This represents the 'holds' clause in the '#pragma omp assume' +/// directive. +/// +/// \code +/// #pragma omp assume holds(<expr>) +/// \endcode +/// In this example directive '#pragma omp assume' has a 'holds' clause. +class OMPHoldsClause final + : public OMPOneStmtClause<llvm::omp::OMPC_holds, OMPClause> { + friend class OMPClauseReader; + +public: + /// Build 'holds' clause. + /// + /// \param StartLoc Starting location of the clause. + /// \param EndLoc Ending location of the clause. + OMPHoldsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation EndLoc) + : OMPOneStmtClause(E, StartLoc, LParenLoc, EndLoc) {} + + /// Build an empty clause. + OMPHoldsClause() : OMPOneStmtClause() {} + + Expr *getExpr() const { return getStmtAs<Expr>(); } + void setExpr(Expr *E) { setStmt(E); } +}; + +/// This represents the 'no_openmp' clause in the '#pragma omp assume' +/// directive. +/// +/// \code +/// #pragma omp assume no_openmp +/// \endcode +/// In this example directive '#pragma omp assume' has a 'no_openmp' clause. +class OMPNoOpenMPClause final + : public OMPNoChildClause<llvm::omp::OMPC_no_openmp> { +public: + /// Build 'no_openmp' clause. + /// + /// \param StartLoc Starting location of the clause. + /// \param EndLoc Ending location of the clause. + OMPNoOpenMPClause(SourceLocation StartLoc, SourceLocation EndLoc) + : OMPNoChildClause(StartLoc, EndLoc) {} + + /// Build an empty clause. + OMPNoOpenMPClause() : OMPNoChildClause() {} +}; + +/// This represents the 'no_openmp_routines' clause in the '#pragma omp assume' +/// directive. +/// +/// \code +/// #pragma omp assume no_openmp_routines +/// \endcode +/// In this example directive '#pragma omp assume' has a 'no_openmp_routines' +/// clause. +class OMPNoOpenMPRoutinesClause final ---------------- alexey-bataev wrote:
https://llvm.org/docs/DeveloperPolicy.html#id22 https://github.com/llvm/llvm-project/pull/92731 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits