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