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.
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static QualType getBaseOriginalType(const 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