187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===--- StmtCXX.cpp - Classes for representing C++ statements ------------===//
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 implements the subclesses of Stmt class declared in StmtCXX.h
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/AST/StmtCXX.h"
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/AST/ASTContext.h"
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarusing namespace clang;
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarQualType CXXCatchStmt::getCaughtType() const {
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (ExceptionDecl)
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return ExceptionDecl->getType();
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return QualType();
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCXXTryStmt *CXXTryStmt::Create(const ASTContext &C, SourceLocation tryLoc,
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               Stmt *tryBlock, ArrayRef<Stmt *> handlers) {
2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::size_t Size = sizeof(CXXTryStmt);
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Size += ((handlers.size() + 1) * sizeof(Stmt *));
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void *Mem = C.Allocate(Size, llvm::alignOf<CXXTryStmt>());
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return new (Mem) CXXTryStmt(tryLoc, tryBlock, handlers);
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCXXTryStmt *CXXTryStmt::Create(const ASTContext &C, EmptyShell Empty,
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               unsigned numHandlers) {
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::size_t Size = sizeof(CXXTryStmt);
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Size += ((numHandlers + 1) * sizeof(Stmt *));
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void *Mem = C.Allocate(Size, llvm::alignOf<CXXTryStmt>());
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return new (Mem) CXXTryStmt(Empty, numHandlers);
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCXXTryStmt::CXXTryStmt(SourceLocation tryLoc, Stmt *tryBlock,
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       ArrayRef<Stmt *> handlers)
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    : Stmt(CXXTryStmtClass), TryLoc(tryLoc), NumHandlers(handlers.size()) {
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt **Stmts = reinterpret_cast<Stmt **>(this + 1);
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmts[0] = tryBlock;
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::copy(handlers.begin(), handlers.end(), Stmts + 1);
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCXXForRangeStmt::CXXForRangeStmt(DeclStmt *Range,
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 DeclStmt *BeginStmt, DeclStmt *EndStmt,
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 Expr *Cond, Expr *Inc, DeclStmt *LoopVar,
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 Stmt *Body, SourceLocation FL,
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 SourceLocation CAL, SourceLocation CL,
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                 SourceLocation RPL)
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    : Stmt(CXXForRangeStmtClass), ForLoc(FL), CoawaitLoc(CAL), ColonLoc(CL),
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      RParenLoc(RPL) {
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SubExprs[RANGE] = Range;
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SubExprs[BEGINSTMT] = BeginStmt;
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SubExprs[ENDSTMT] = EndStmt;
6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SubExprs[COND] = Cond;
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SubExprs[INC] = Inc;
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SubExprs[LOOPVAR] = LoopVar;
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SubExprs[BODY] = Body;
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarExpr *CXXForRangeStmt::getRangeInit() {
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  DeclStmt *RangeStmt = getRangeStmt();
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  VarDecl *RangeDecl = dyn_cast_or_null<VarDecl>(RangeStmt->getSingleDecl());
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(RangeDecl && "for-range should have a single var decl");
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return RangeDecl->getInit();
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarconst Expr *CXXForRangeStmt::getRangeInit() const {
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return const_cast<CXXForRangeStmt *>(this)->getRangeInit();
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarVarDecl *CXXForRangeStmt::getLoopVariable() {
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Decl *LV = cast<DeclStmt>(getLoopVarStmt())->getSingleDecl();
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(LV && "No loop variable in CXXForRangeStmt");
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return cast<VarDecl>(LV);
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarconst VarDecl *CXXForRangeStmt::getLoopVariable() const {
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return const_cast<CXXForRangeStmt *>(this)->getLoopVariable();
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
89