ExprOpenMP.h revision 87d948ecccffea9e9e37d0d053b246e2d6d6c47b
187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===--- ExprOpenMP.h - Classes for representing expressions ----*- C++ -*-===// 287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// The LLVM Compiler Infrastructure 487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// License. See LICENSE.TXT for details. 787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===// 987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This file defines the Expr interface and subclasses. 1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===// 1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#ifndef LLVM_CLANG_AST_EXPROPENMP_H 1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define LLVM_CLANG_AST_EXPROPENMP_H 1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/AST/Expr.h" 1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace clang { 2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief OpenMP 4.0 [2.4, Array Sections]. 2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// To specify an array section in an OpenMP construct, array subscript 2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expressions are extended with the following syntax: 2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code 2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// [ lower-bound : length ] 2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// [ lower-bound : ] 2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// [ : length ] 2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// [ : ] 2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode 2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The array section must be a subset of the original array. 3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Array sections are allowed on multidimensional arrays. Base language array 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// subscript expressions can be used to specify length-one dimensions of 3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// multidimensional array sections. 3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The lower-bound and length are integral type expressions. When evaluated 3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// they represent a set of integer values as follows: 3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code 3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// { lower-bound, lower-bound + 1, lower-bound + 2,... , lower-bound + length - 3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// 1 } 3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode 3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The lower-bound and length must evaluate to non-negative integers. 4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// When the size of the array dimension is not known, the length must be 4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// specified explicitly. 4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// When the length is absent, it defaults to the size of the array dimension 4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// minus the lower-bound. 4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// When the lower-bound is absent it defaults to 0. 4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPArraySectionExpr : public Expr { 4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar enum { BASE, LOWER_BOUND, LENGTH, END_EXPR }; 4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stmt *SubExprs[END_EXPR]; 4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ColonLoc; 4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation RBracketLoc; 5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OMPArraySectionExpr(Expr *Base, Expr *LowerBound, Expr *Length, QualType Type, 5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ExprValueKind VK, ExprObjectKind OK, 5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ColonLoc, SourceLocation RBracketLoc) 5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr( 5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OMPArraySectionExprClass, Type, VK, OK, 5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Base->isTypeDependent() || 5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (LowerBound && LowerBound->isTypeDependent()) || 5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (Length && Length->isTypeDependent()), 6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Base->isValueDependent() || 6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (LowerBound && LowerBound->isValueDependent()) || 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (Length && Length->isValueDependent()), 6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Base->isInstantiationDependent() || 6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (LowerBound && LowerBound->isInstantiationDependent()) || 6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (Length && Length->isInstantiationDependent()), 6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Base->containsUnexpandedParameterPack() || 6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (LowerBound && LowerBound->containsUnexpandedParameterPack()) || 6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (Length && Length->containsUnexpandedParameterPack())), 6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ColonLoc(ColonLoc), RBracketLoc(RBracketLoc) { 7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[BASE] = Base; 7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[LOWER_BOUND] = LowerBound; 7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[LENGTH] = Length; 7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Create an empty array section expression. 7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar explicit OMPArraySectionExpr(EmptyShell Shell) 7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(OMPArraySectionExprClass, Shell) {} 7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// An array section can be written only as Base[LowerBound:Length]. 8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Get base of the array section. 8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getBase() { return cast<Expr>(SubExprs[BASE]); } 8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); } 8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Set base of the array section. 8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setBase(Expr *E) { SubExprs[BASE] = E; } 8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Return original type of the base expression for array section. 8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static QualType getBaseOriginalType(Expr *Base); 8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Get lower bound of array section. 9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getLowerBound() { return cast_or_null<Expr>(SubExprs[LOWER_BOUND]); } 9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Expr *getLowerBound() const { 9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return cast_or_null<Expr>(SubExprs[LOWER_BOUND]); 9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Set lower bound of the array section. 9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setLowerBound(Expr *E) { SubExprs[LOWER_BOUND] = E; } 9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Get length of array section. 9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getLength() { return cast_or_null<Expr>(SubExprs[LENGTH]); } 10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Expr *getLength() const { return cast_or_null<Expr>(SubExprs[LENGTH]); } 10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Set length of the array section. 10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setLength(Expr *E) { SubExprs[LENGTH] = E; } 10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getLocStart() const LLVM_READONLY { 10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getBase()->getLocStart(); 10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getLocEnd() const LLVM_READONLY { return RBracketLoc; } 10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getColonLoc() const { return ColonLoc; } 11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setColonLoc(SourceLocation L) { ColonLoc = L; } 11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getRBracketLoc() const { return RBracketLoc; } 11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getExprLoc() const LLVM_READONLY { 11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getBase()->getExprLoc(); 11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static bool classof(const Stmt *T) { 12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return T->getStmtClass() == OMPArraySectionExprClass; 12187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 12287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 12387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(&SubExprs[BASE], &SubExprs[END_EXPR]); 12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}; 12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end namespace clang 12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 130