Expr.h revision 4e99a5fc3b203397a91136c6e695e405fb8fc606
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This file defines the Expr interface and subclasses. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_AST_EXPR_H 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_AST_EXPR_H 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Stmt.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Type.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Decl.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/AST/DeclObjC.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Basic/IdentifierTable.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/APSInt.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/APFloat.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class IdentifierInfo; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Selector; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Decl; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class ASTContext; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Expr - This represents one expression. Note that Expr's are subclasses of 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// Stmt. This allows an expression to be transparently used any place a Stmt 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// is required. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Expr : public Stmt { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType TR; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(StmtClass SC, QualType T) : Stmt(SC), TR(T) {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QualType getType() const { return TR; } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void setType(QualType t) { TR = t; } 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// SourceLocation tokens are not useful in isolation - they are low level 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// value objects created/interpreted by SourceManager. We assume AST 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// clients will have a pointer to the respective SourceManager. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getExprLoc - Return the preferred location for the arrow when diagnosing 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// a problem with a generic expression. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceLocation getExprLoc() const { return getLocStart(); } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// hasLocalSideEffect - Return true if this immediate expression has side 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// effects, not counting any sub-expressions. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hasLocalSideEffect() const; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// incomplete type other than void. Nonarray expressions that can be lvalues: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - name, where name must be a variable 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - e[i] 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - (e), where e must be an lvalue 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - e.name, where e must be an lvalue 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - e->name 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - *e, the type of e cannot be a function type 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - string-constant 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - reference type [C++ [expr]] 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum isLvalueResult { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LV_Valid, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LV_NotObjectType, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LV_IncompleteVoidType, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LV_DuplicateVectorComponents, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LV_InvalidExpression 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isLvalueResult isLvalue() const; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// does not have an incomplete type, does not have a const-qualified type, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// and if it is a structure or union, does not have any member (including, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// recursively, any member or element of all contained aggregates or unions) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// with a const-qualified type. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum isModifiableLvalueResult { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_Valid, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_NotObjectType, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_IncompleteVoidType, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_DuplicateVectorComponents, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_InvalidExpression, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_IncompleteType, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_ConstQualified, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MLV_ArrayType 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isModifiableLvalueResult isModifiableLvalue() const; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isNullPointerConstant(ASTContext &Ctx) const; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isIntegerConstantExpr - Return true if this expression is a valid integer 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// constant expression, and, if so, return its value in Result. If not a 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// valid i-c-e, return false and fill in Loc (if specified) with the location 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// of the invalid expression. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation *Loc = 0, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isEvaluated = true) const; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc = 0) const { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::APSInt X(32); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return isIntegerConstantExpr(X, Ctx, Loc); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isConstantExpr - Return true if this expression is a valid constant expr. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// hasStaticStorage - Return true if this expression has static storage 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /// duration. This means that the address of this expression is a link-time 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// constant. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hasStaticStorage() const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// its subexpression. If that subexpression is also a ParenExpr, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// then this method recursively returns its subexpression, and so forth. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Otherwise, the method returns the current Expr. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr* IgnoreParens(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr* IgnoreParens() const { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_cast<Expr*>(this)->IgnoreParens(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() >= firstExprConstant && 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T->getStmtClass() <= lastExprConstant; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Expr *) { return true; } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline Expr* Create(llvm::Deserializer& D) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast<Expr>(Stmt::Create(D)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Primary Expressions. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// DeclRefExpr - [C99 6.5.1p2] - A reference to a declared variable, function, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// enum, etc. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeclRefExpr : public Expr { 142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ValueDecl *D; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation Loc; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclRefExpr(ValueDecl *d, QualType t, SourceLocation l) : 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(DeclRefExprClass, t), D(d), Loc(l) {} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ValueDecl *getDecl() { return D; } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ValueDecl *getDecl() const { return D; } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return T->getStmtClass() == DeclRefExprClass; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const DeclRefExpr *) { return true; } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_begin(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DeclRefExpr* CreateImpl(llvm::Deserializer& D); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// PreDefinedExpr - [C99 6.4.2.2] - A pre-defined identifier such as __func__. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PreDefinedExpr : public Expr { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IdentType { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Func, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Function, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrettyFunction 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation Loc; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IdentType Type; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PreDefinedExpr(SourceLocation l, QualType type, IdentType IT) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Expr(PreDefinedExprClass, type), Loc(l), Type(IT) {} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IdentType getIdentType() const { return Type; } 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const Stmt *T) { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return T->getStmtClass() == PreDefinedExprClass; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const PreDefinedExpr *) { return true; } 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterators 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_begin(); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_end(); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static PreDefinedExpr* CreateImpl(llvm::Deserializer& D); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IntegerLiteral : public Expr { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::APInt Value; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation Loc; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or UnsignedLongLongTy 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IntegerLiteral(const llvm::APInt &V, QualType type, SourceLocation l) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(IntegerLiteralClass, type), Value(V), Loc(l) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(type->isIntegerType() && "Illegal type in IntegerLiteral"); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const llvm::APInt &getValue() const { return Value; } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == IntegerLiteralClass; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const IntegerLiteral *) { return true; } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static IntegerLiteral* CreateImpl(llvm::Deserializer& D); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CharacterLiteral : public Expr { 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch unsigned Value; 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SourceLocation Loc; 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochpublic: 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // type should be IntTy 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CharacterLiteral(unsigned value, QualType type, SourceLocation l) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(CharacterLiteralClass, type), Value(value), Loc(l) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLoc() const { return Loc; } 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unsigned getValue() const { return Value; } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == CharacterLiteralClass; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const CharacterLiteral *) { return true; } 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Iterators 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static CharacterLiteral* CreateImpl(llvm::Deserializer& D); 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FloatingLiteral : public Expr { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::APFloat Value; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsExact : 1; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation Loc; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FloatingLiteral(const llvm::APFloat &V, bool* isexact, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType Type, SourceLocation L) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(FloatingLiteralClass, Type), Value(V), IsExact(*isexact), Loc(L) {} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const llvm::APFloat &getValue() const { return Value; } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isExact() const { return IsExact; } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /// getValueAsDouble - This returns the value as an inaccurate double. Note 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// that this may cause loss of precision, but is useful for debugging dumps 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// etc. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double getValueAsDouble() const { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: We need something for long double here. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cast<BuiltinType>(getType())->getKind() == BuiltinType::Float) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Value.convertToFloat(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Value.convertToDouble(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == FloatingLiteralClass; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const FloatingLiteral *) { return true; } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static FloatingLiteral* CreateImpl(llvm::Deserializer& D); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ImaginaryLiteral - We support imaginary integer and floating point literals, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// like "1.0i". We represent these as a wrapper around FloatingLiteral and 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// IntegerLiteral classes. Instances of this class always have a Complex type 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// whose element type matches the subexpression. 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImaginaryLiteral : public Expr { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *Val; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImaginaryLiteral(Expr *val, QualType Ty) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(ImaginaryLiteralClass, Ty), Val(val) {} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getSubExpr() const { return Val; } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getSubExpr() { return Val; } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { return Val->getSourceRange(); } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ImaginaryLiteralClass; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const ImaginaryLiteral *) { return true; } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ImaginaryLiteral* CreateImpl(llvm::Deserializer& D); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// StringLiteral - This represents a string literal expression, e.g. "foo" 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// or L"bar" (wide strings). The actual string is returned by getStrData() 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// is NOT null-terminated, and the length of the string is determined by 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// calling getByteLength(). 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringLiteral : public Expr { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *StrData; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned ByteLength; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsWide; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the StringLiteral was composed using token pasting, both locations 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are needed. If not (the common case), firstTokLoc == lastTokLoc. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: if space becomes an issue, we should create a sub-class. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation firstTokLoc, lastTokLoc; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringLiteral(const char *strData, unsigned byteLength, bool Wide, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType t, SourceLocation b, SourceLocation e); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~StringLiteral(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *getStrData() const { return StrData; } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned getByteLength() const { return ByteLength; } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isWide() const { return IsWide; } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(firstTokLoc,lastTokLoc); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == StringLiteralClass; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const StringLiteral *) { return true; } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterators 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_begin(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_end(); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static StringLiteral* CreateImpl(llvm::Deserializer& D); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// ParenExpr - This represents a parethesized expression, e.g. "(1)". This 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// AST node is only formed if full location information is requested. 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ParenExpr : public Expr { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation L, R; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr *Val; 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParenExpr(SourceLocation l, SourceLocation r, Expr *val) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Expr(ParenExprClass, val->getType()), L(l), R(r), Val(val) {} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getSubExpr() const { return Val; } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getSubExpr() { return Val; } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceRange getSourceRange() const { return SourceRange(L, R); } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ParenExprClass; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const ParenExpr *) { return true; } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_begin(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ParenExpr* CreateImpl(llvm::Deserializer& D); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// UnaryOperator - This represents the unary-expression's (except sizeof of 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// types), the postinc/postdec operators from postfix-expression, and various 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// extensions. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Notes on various nodes: 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// Real/Imag - These return the real/imag part of a complex operand. If 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// applied to a non-complex value, the former returns its operand and the 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// later returns zero in the type of the operand. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// __builtin_offsetof(type, a.b[10]) is represented as a unary operator whose 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// subexpression is a compound literal with the various MemberExpr and 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ArraySubscriptExpr's applied to it. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UnaryOperator : public Expr { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that additions to this should also update the StmtVisitor class. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Opcode { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostInc, PostDec, // [C99 6.5.2.4] Postfix increment and decrement operators 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreInc, PreDec, // [C99 6.5.3.1] Prefix increment and decrement operators. 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddrOf, Deref, // [C99 6.5.3.2] Address and indirection operators. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Plus, Minus, // [C99 6.5.3.3] Unary arithmetic operators. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Not, LNot, // [C99 6.5.3.3] Unary arithmetic operators. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeOf, AlignOf, // [C99 6.5.3.4] Sizeof (expr, not type) operator. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Real, Imag, // "__real expr"/"__imag expr" Extension. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension, // __extension__ marker. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffsetOf // __builtin_offsetof 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *Val; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Opcode Opc; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation Loc; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnaryOperator(Expr *input, Opcode opc, QualType type, SourceLocation l) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(UnaryOperatorClass, type), Val(input), Opc(opc), Loc(l) {} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Opcode getOpcode() const { return Opc; } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getSubExpr() const { return Val; } 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getOperatorLoc - Return the location of the operator. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getOperatorLoc() const { return Loc; } 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isPostfix - Return true if this is a postfix operation, like x++. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool isPostfix(Opcode Op); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isPostfix() const { return isPostfix(Opc); } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isIncrementDecrementOp() const { return Opc>=PostInc && Opc<=PreDec; } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isSizeOfAlignOfOp() const { return Opc == SizeOf || Opc == AlignOf; } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool isArithmeticOp(Opcode Op) { return Op >= Plus && Op <= LNot; } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// corresponds to, e.g. "sizeof" or "[pre]++" 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char *getOpcodeStr(Opcode Op); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isPostfix()) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SourceRange(Val->getLocStart(), Loc); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SourceRange(Loc, Val->getLocEnd()); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SourceLocation getExprLoc() const { return Loc; } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == UnaryOperatorClass; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const UnaryOperator *) { return true; } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static UnaryOperator* CreateImpl(llvm::Deserializer& D); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// SizeOfAlignOfTypeExpr - [C99 6.5.3.4] - This is only for sizeof/alignof of 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// *types*. sizeof(expr) is handled by UnaryOperator. 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SizeOfAlignOfTypeExpr : public Expr { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isSizeof; // true if sizeof, false if alignof. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType Ty; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation OpLoc, RParenLoc; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeOfAlignOfTypeExpr(bool issizeof, QualType argType, QualType resultType, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation op, SourceLocation rp) : 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(SizeOfAlignOfTypeExprClass, resultType), 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isSizeof(issizeof), Ty(argType), OpLoc(op), RParenLoc(rp) {} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isSizeOf() const { return isSizeof; } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType getArgumentType() const { return Ty; } 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation getOperatorLoc() const { return OpLoc; } 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceRange getSourceRange() const { return SourceRange(OpLoc, RParenLoc); } 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const Stmt *T) { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return T->getStmtClass() == SizeOfAlignOfTypeExprClass; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const SizeOfAlignOfTypeExpr *) { return true; } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SizeOfAlignOfTypeExpr* CreateImpl(llvm::Deserializer& D); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Postfix Operators. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ArraySubscriptExpr : public Expr { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { LHS, RHS, END_EXPR=2 }; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr* SubExprs[END_EXPR]; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation RBracketLoc; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation rbracketloc) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(ArraySubscriptExprClass, t), RBracketLoc(rbracketloc) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[LHS] = lhs; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[RHS] = rhs; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// An array access can be written A[4] or 4[A] (both are equivalent). 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - getBase() and getIdx() always present the normalized view: A[4]. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// In this case getBase() returns "A" and getIdx() returns "4". 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// - getLHS() and getRHS() present the syntactic view. e.g. for 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 4[A] getLHS() returns "4". 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Note: Because vector element access is also written A[4] we must 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// predicate the format conversion in getBase and getIdx only on the 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the type of the RHS, as it is possible for the LHS to be a vector of 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// integer type 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getLHS() { return SubExprs[LHS]; } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getLHS() const { return SubExprs[LHS]; } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getRHS() { return SubExprs[RHS]; } 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getRHS() const { return SubExprs[RHS]; } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getBase() { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (getRHS()->getType()->isIntegerType()) ? getLHS() : getRHS(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getBase() const { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (getRHS()->getType()->isIntegerType()) ? getLHS() : getRHS(); 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Expr *getIdx() { 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (getRHS()->getType()->isIntegerType()) ? getRHS() : getLHS(); 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Expr *getIdx() const { 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (getRHS()->getType()->isIntegerType()) ? getRHS() : getLHS(); 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SourceRange getSourceRange() const { 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SourceRange(getLHS()->getLocStart(), RBracketLoc); 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual SourceLocation getExprLoc() const { return RBracketLoc; } 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool classof(const Stmt *T) { 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return T->getStmtClass() == ArraySubscriptExprClass; 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool classof(const ArraySubscriptExpr *) { return true; } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Iterators 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual child_iterator child_begin(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ArraySubscriptExpr* CreateImpl(llvm::Deserializer& D); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// CallExpr - [C99 6.5.2.2] Function Calls. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallExpr : public Expr { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { FN=0, ARGS_START=1 }; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr **SubExprs; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned NumArgs; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation RParenLoc; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This version of the ctor is for deserialization. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallExpr(Expr** subexprs, unsigned numargs, QualType t, 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation rparenloc) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(CallExprClass,t), SubExprs(subexprs), 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NumArgs(numargs), RParenLoc(rparenloc) {} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation rparenloc); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CallExpr() { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] SubExprs; 577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Expr *getCallee() const { return SubExprs[FN]; } 580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Expr *getCallee() { return SubExprs[FN]; } 581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void setCallee(Expr *F) { SubExprs[FN] = F; } 582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// getNumArgs - Return the number of actual arguments to this call. 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unsigned getNumArgs() const { return NumArgs; } 586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getArg - Return the specified argument. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getArg(unsigned Arg) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(Arg < NumArgs && "Arg access out of range!"); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SubExprs[Arg+ARGS_START]; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getArg(unsigned Arg) const { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(Arg < NumArgs && "Arg access out of range!"); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SubExprs[Arg+ARGS_START]; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// setArg - Set the specified argument. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setArg(unsigned Arg, Expr *ArgExpr) { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(Arg < NumArgs && "Arg access out of range!"); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[Arg+ARGS_START] = ArgExpr; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// setNumArgs - This changes the number of arguments present in this call. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Any orphaned expressions are deleted by this, and any new operands are set 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// to null. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setNumArgs(unsigned NumArgs); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Expr **arg_iterator; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Expr * const *arg_const_iterator; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg_iterator arg_begin() { return SubExprs+ARGS_START; } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg_iterator arg_end() { return SubExprs+ARGS_START+getNumArgs(); } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg_const_iterator arg_begin() const { return SubExprs+ARGS_START; } 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arg_const_iterator arg_end() const { return SubExprs+ARGS_START+getNumArgs(); } 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// getNumCommas - Return the number of commas that must have been present in 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// this function call. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; } 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isBuiltinClassifyType(llvm::APSInt &Result) const; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getRParenLoc() const { return RParenLoc; } 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceRange getSourceRange() const { 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return SourceRange(getCallee()->getLocStart(), RParenLoc); 624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == CallExprClass; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const CallExpr *) { return true; } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterators 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static CallExpr* CreateImpl(llvm::Deserializer& D); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// MemberExpr - [C99 6.5.2.3] Structure and Union Members. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemberExpr : public Expr { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *Base; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldDecl *MemberDecl; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation MemberLoc; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsArrow; // True if this is "X->F", false if this is "X.F". 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemberExpr(Expr *base, bool isarrow, FieldDecl *memberdecl, SourceLocation l) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(MemberExprClass, memberdecl->getType()), 649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow) {} 650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Expr *getBase() const { return Base; } 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldDecl *getMemberDecl() const { return MemberDecl; } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isArrow() const { return IsArrow; } 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(getBase()->getLocStart(), MemberLoc); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceLocation getExprLoc() const { return MemberLoc; } 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == MemberExprClass; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const MemberExpr *) { return true; } 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static MemberExpr* CreateImpl(llvm::Deserializer& D); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// OCUVectorElementExpr - This represents access to specific elements of a 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// vector, and may occur on the left hand side or right hand side. For example 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// the following is legal: "V.xy = V.zw" if V is a 4 element ocu vector. 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OCUVectorElementExpr : public Expr { 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr *Base; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IdentifierInfo &Accessor; 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation AccessorLoc; 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum ElementType { 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Point, // xywz 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Color, // rgba 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Texture // stpq 6862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch }; 6872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch OCUVectorElementExpr(QualType ty, Expr *base, IdentifierInfo &accessor, 6882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch SourceLocation loc) 6892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch : Expr(OCUVectorElementExprClass, ty), 6902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Base(base), Accessor(accessor), AccessorLoc(loc) {} 6912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 6922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const Expr *getBase() const { return Base; } 6932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch Expr *getBase() { return Base; } 6942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 6952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch IdentifierInfo &getAccessor() const { return Accessor; } 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getNumElements - Get the number of components being selected. 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned getNumElements() const; 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getElementType - Determine whether the components of this access are 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// "point" "color" or "texture" elements. 702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ElementType getElementType() const; 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// containsDuplicateElements - Return true if any element access is 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// repeated. 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool containsDuplicateElements() const; 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getEncodedElementAccess - Encode the elements accessed into a bit vector. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// The encoding currently uses 2-bit bitfields, but clients should use the 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// accessors below to access them. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned getEncodedElementAccess() const; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getAccessedFieldNo - Given an encoded value and a result number, return 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the input field number being accessed. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static unsigned getAccessedFieldNo(unsigned Idx, unsigned EncodedVal) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (EncodedVal >> (Idx*2)) & 3; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(getBase()->getLocStart(), AccessorLoc); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == OCUVectorElementExprClass; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const OCUVectorElementExpr *) { return true; } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// CompoundLiteralExpr - [C99 6.5.2.5] 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompoundLiteralExpr : public Expr { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LParenLoc - If non-null, this is the location of the left paren in a 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// compound literal like "(int){4}". This can be null if this is a 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// synthesized compound expression. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation LParenLoc; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *Init; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool FileScope; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompoundLiteralExpr(SourceLocation lparenloc, QualType ty, Expr *init, bool fileScope) : 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(CompoundLiteralExprClass, ty), LParenLoc(lparenloc), Init(init), FileScope(fileScope) {} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getInitializer() const { return Init; } 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getInitializer() { return Init; } 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isFileScope() const { return FileScope; } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getLParenLoc() const { return LParenLoc; } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: Init should never be null. 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Init) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LParenLoc.isInvalid()) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Init->getSourceRange(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(LParenLoc, Init->getLocEnd()); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == CompoundLiteralExprClass; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const CompoundLiteralExpr *) { return true; } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static CompoundLiteralExpr* CreateImpl(llvm::Deserializer& D); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// ImplicitCastExpr - Allows us to explicitly represent implicit type 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// conversions. For example: converting T[]->T*, void f()->void (*f)(), 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// float->double, short->int, etc. 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImplicitCastExpr : public Expr { 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr *Op; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImplicitCastExpr(QualType ty, Expr *op) : 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(ImplicitCastExprClass, ty), Op(op) {} 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getSubExpr() { return Op; } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getSubExpr() const { return Op; } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { return Op->getSourceRange(); } 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return T->getStmtClass() == ImplicitCastExprClass; 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const ImplicitCastExpr *) { return true; } 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterators 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_begin(); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_end(); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static ImplicitCastExpr* CreateImpl(llvm::Deserializer& D); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// CastExpr - [C99 6.5.4] Cast Operators. 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CastExpr : public Expr { 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr *Op; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation Loc; // the location of the left paren 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CastExpr(QualType ty, Expr *op, SourceLocation l) : 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr(CastExprClass, ty), Op(op), Loc(l) {} 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation getLParenLoc() const { return Loc; } 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr *getSubExpr() const { return Op; } 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SourceRange getSourceRange() const { 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd()); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return T->getStmtClass() == CastExprClass; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const CastExpr *) { return true; } 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static CastExpr* CreateImpl(llvm::Deserializer& D); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BinaryOperator : public Expr { 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Opcode { 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Operators listed in order of precedence. 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that additions to this should also update the StmtVisitor class. 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mul, Div, Rem, // [C99 6.5.5] Multiplicative operators. 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Add, Sub, // [C99 6.5.6] Additive operators. 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shl, Shr, // [C99 6.5.7] Bitwise shift operators. 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LT, GT, LE, GE, // [C99 6.5.8] Relational operators. 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EQ, NE, // [C99 6.5.9] Equality operators. 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) And, // [C99 6.5.10] Bitwise AND operator. 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Xor, // [C99 6.5.11] Bitwise XOR operator. 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Or, // [C99 6.5.12] Bitwise OR operator. 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAnd, // [C99 6.5.13] Logical AND operator. 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOr, // [C99 6.5.14] Logical OR operator. 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Assign, MulAssign,// [C99 6.5.16] Assignment operators. 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DivAssign, RemAssign, 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddAssign, SubAssign, 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShlAssign, ShrAssign, 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AndAssign, XorAssign, 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OrAssign, 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Comma // [C99 6.5.17] Comma operator. 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum { LHS, RHS, END_EXPR }; 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Expr* SubExprs[END_EXPR]; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Opcode Opc; 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation OpLoc; 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation opLoc) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(BinaryOperatorClass, ResTy), Opc(opc), OpLoc(opLoc) { 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[LHS] = lhs; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[RHS] = rhs; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(!isCompoundAssignmentOp() && 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Use ArithAssignBinaryOperator for compound assignments"); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation getOperatorLoc() const { return OpLoc; } 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Opcode getOpcode() const { return Opc; } 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getLHS() const { return SubExprs[LHS]; } 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getRHS() const { return SubExprs[RHS]; } 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd()); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// corresponds to, e.g. "<<=". 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char *getOpcodeStr(Opcode Op); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// predicates to categorize the respective opcodes. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isMultiplicativeOp() const { return Opc >= Mul && Opc <= Rem; } 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isAdditiveOp() const { return Opc == Add || Opc == Sub; } 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isShiftOp() const { return Opc == Shl || Opc == Shr; } 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isBitwiseOp() const { return Opc >= And && Opc <= Or; } 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isRelationalOp() const { return Opc >= LT && Opc <= GE; } 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isEqualityOp() const { return Opc == EQ || Opc == NE; } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isLogicalOp() const { return Opc == LAnd || Opc == LOr; } 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isAssignmentOp() const { return Opc >= Assign && Opc <= OrAssign; } 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isCompoundAssignmentOp() const { return Opc > Assign && Opc <= OrAssign;} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isShiftAssignOp() const { return Opc == ShlAssign || Opc == ShrAssign; } 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *S) { 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S->getStmtClass() == BinaryOperatorClass || 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) S->getStmtClass() == CompoundAssignOperatorClass; 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const BinaryOperator *) { return true; } 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static BinaryOperator* CreateImpl(llvm::Deserializer& D); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected: 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation oploc, bool dead) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Expr(CompoundAssignOperatorClass, ResTy), Opc(opc), OpLoc(oploc) { 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SubExprs[LHS] = lhs; 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SubExprs[RHS] = rhs; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// CompoundAssignOperator - For compound assignments (e.g. +=), we keep 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// track of the type the operation is performed in. Due to the semantics of 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// these operators, the operands are promoted, the aritmetic performed, an 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// implicit conversion back to the result type done, then the assignment takes 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// place. This captures the intermediate type which the computation is done 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// in. 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompoundAssignOperator : public BinaryOperator { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType ComputationType; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType ResType, QualType CompType, 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation OpLoc) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : BinaryOperator(lhs, rhs, opc, ResType, OpLoc, true), 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComputationType(CompType) { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(isCompoundAssignmentOp() && 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Only should be used for compound assignments"); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType getComputationType() const { return ComputationType; } 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const CompoundAssignOperator *) { return true; } 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *S) { 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S->getStmtClass() == CompoundAssignOperatorClass; 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static CompoundAssignOperator* CreateImpl(llvm::Deserializer& D); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 945a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 946a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/// ConditionalOperator - The ?: operator. Note that LHS may be null when the 947a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/// GNU "missing LHS" extension is in use. 948a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/// 949a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class ConditionalOperator : public Expr { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { COND, LHS, RHS, END_EXPR }; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConditionalOperator(Expr *cond, Expr *lhs, Expr *rhs, QualType t) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(ConditionalOperatorClass, t) { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[COND] = cond; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[LHS] = lhs; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[RHS] = rhs; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getCond - Return the expression representing the condition for 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ?: operator. 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getCond() const { return SubExprs[COND]; } 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getTrueExpr - Return the subexpression representing the value of the ?: 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expression if the condition evaluates to true. In most cases this value 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be the same as getLHS() except a GCC extension allows the left 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subexpression to be omitted, and instead of the condition be returned. 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // e.g: x ?: y is shorthand for x ? x : y, except that the expression "x" 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is only evaluated once. 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getTrueExpr() const { 9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SubExprs[LHS] ? SubExprs[COND] : SubExprs[LHS]; 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getTrueExpr - Return the subexpression representing the value of the ?: 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expression if the condition evaluates to false. This is the same as getRHS. 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getFalseExpr() const { return SubExprs[RHS]; } 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Expr *getLHS() const { return SubExprs[LHS]; } 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getRHS() const { return SubExprs[RHS]; } 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd()); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const Stmt *T) { 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return T->getStmtClass() == ConditionalOperatorClass; 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool classof(const ConditionalOperator *) { return true; } 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Iterators 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_begin(); 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual child_iterator child_end(); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static ConditionalOperator* CreateImpl(llvm::Deserializer& D); 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// AddrLabelExpr - The GNU address of label extension, representing &&label. 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AddrLabelExpr : public Expr { 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SourceLocation AmpAmpLoc, LabelLoc; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LabelStmt *Label; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelStmt *L, 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType t) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(AddrLabelExprClass, t), AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {} 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(AmpAmpLoc, LabelLoc); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LabelStmt *getLabel() const { return Label; } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == AddrLabelExprClass; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const AddrLabelExpr *) { return true; } 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AddrLabelExpr* CreateImpl(llvm::Deserializer& D); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// The StmtExpr contains a single CompoundStmt node, which it evaluates and 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// takes the value of the last subexpression. 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StmtExpr : public Expr { 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompoundStmt *SubStmt; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation LParenLoc, RParenLoc; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StmtExpr(CompoundStmt *substmt, QualType T, 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation lp, SourceLocation rp) : 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(StmtExprClass, T), SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompoundStmt *getSubStmt() { return SubStmt; } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompoundStmt *getSubStmt() const { return SubStmt; } 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(LParenLoc, RParenLoc); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == StmtExprClass; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const StmtExpr *) { return true; } 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EmitImpl(llvm::Serializer& S) const; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static StmtExpr* CreateImpl(llvm::Deserializer& D); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// TypesCompatibleExpr - GNU builtin-in function __builtin_type_compatible_p. 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// This AST node represents a function that returns 1 if two *types* (not 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// expressions) are compatible. The result of this built-in function can be 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// used in integer constant expressions. 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TypesCompatibleExpr : public Expr { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType Type1; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType Type2; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation BuiltinLoc, RParenLoc; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypesCompatibleExpr(QualType ReturnType, SourceLocation BLoc, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType t1, QualType t2, SourceLocation RP) : 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr(TypesCompatibleExprClass, ReturnType), Type1(t1), Type2(t2), 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuiltinLoc(BLoc), RParenLoc(RP) {} 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType getArgType1() const { return Type1; } 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType getArgType2() const { return Type2; } 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(BuiltinLoc, RParenLoc); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == TypesCompatibleExprClass; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const TypesCompatibleExpr *) { return true; } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual child_iterator child_end(); 1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// ChooseExpr - GNU builtin-in function __builtin_choose_expr. 1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// This AST node is similar to the conditional operator (?:) in C, with 1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// the following exceptions: 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// - the test expression much be a constant expression. 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// - the expression returned has it's type unaltered by promotion rules. 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// - does not evaluate the expression that was not chosen. 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChooseExpr : public Expr { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { COND, LHS, RHS, END_EXPR }; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation BuiltinLoc, RParenLoc; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t, 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation RP) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(ChooseExprClass, t), 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BuiltinLoc(BLoc), RParenLoc(RP) { 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[COND] = cond; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[LHS] = lhs; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubExprs[RHS] = rhs; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isConditionTrue - Return true if the condition is true. This is always 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// statically knowable for a well-formed choosexpr. 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isConditionTrue(ASTContext &C) const; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getCond() const { return SubExprs[COND]; } 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getLHS() const { return SubExprs[LHS]; } 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getRHS() const { return SubExprs[RHS]; } 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(BuiltinLoc, RParenLoc); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == ChooseExprClass; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const ChooseExpr *) { return true; } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// VAArgExpr, used for the builtin function __builtin_va_start. 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VAArgExpr : public Expr { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *Val; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation BuiltinLoc, RParenLoc; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VAArgExpr(SourceLocation BLoc, Expr* e, QualType t, SourceLocation RPLoc) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Expr(VAArgExprClass, t), 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Val(e), 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuiltinLoc(BLoc), 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RParenLoc(RPLoc) { } 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *getSubExpr() const { return Val; } 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *getSubExpr() { return Val; } 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SourceRange getSourceRange() const { 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SourceRange(BuiltinLoc, RParenLoc); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const Stmt *T) { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return T->getStmtClass() == VAArgExprClass; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const VAArgExpr *) { return true; } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterators 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_begin(); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual child_iterator child_end(); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1152 1153/// InitListExpr, used for struct and array initializers. 1154class InitListExpr : public Expr { 1155 Expr **InitExprs; 1156 unsigned NumInits; 1157 SourceLocation LBraceLoc, RBraceLoc; 1158public: 1159 InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits, 1160 SourceLocation rbraceloc); 1161 ~InitListExpr() { 1162 delete [] InitExprs; 1163 } 1164 1165 unsigned getNumInits() const { return NumInits; } 1166 1167 const Expr* getInit(unsigned Init) const { 1168 assert(Init < NumInits && "Initializer access out of range!"); 1169 return InitExprs[Init]; 1170 } 1171 1172 Expr* getInit(unsigned Init) { 1173 assert(Init < NumInits && "Initializer access out of range!"); 1174 return InitExprs[Init]; 1175 } 1176 1177 void setInit(unsigned Init, Expr *expr) { 1178 assert(Init < NumInits && "Initializer access out of range!"); 1179 InitExprs[Init] = expr; 1180 } 1181 1182 virtual SourceRange getSourceRange() const { 1183 return SourceRange(LBraceLoc, RBraceLoc); 1184 } 1185 static bool classof(const Stmt *T) { 1186 return T->getStmtClass() == InitListExprClass; 1187 } 1188 static bool classof(const InitListExpr *) { return true; } 1189 1190 // Iterators 1191 virtual child_iterator child_begin(); 1192 virtual child_iterator child_end(); 1193 1194 virtual void EmitImpl(llvm::Serializer& S) const; 1195 static InitListExpr* CreateImpl(llvm::Deserializer& D); 1196 1197private: 1198 // Used by serializer. 1199 InitListExpr() : Expr(InitListExprClass, QualType()), 1200 InitExprs(NULL), NumInits(0) {} 1201}; 1202 1203/// ObjCStringLiteral, used for Objective-C string literals 1204/// i.e. @"foo". 1205class ObjCStringLiteral : public Expr { 1206 StringLiteral *String; 1207 SourceLocation AtLoc; 1208public: 1209 ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L) 1210 : Expr(ObjCStringLiteralClass, T), String(SL), AtLoc(L) {} 1211 1212 StringLiteral* getString() { return String; } 1213 1214 const StringLiteral* getString() const { return String; } 1215 1216 SourceLocation getAtLoc() const { return AtLoc; } 1217 1218 virtual SourceRange getSourceRange() const { 1219 return SourceRange(AtLoc, String->getLocEnd()); 1220 } 1221 1222 static bool classof(const Stmt *T) { 1223 return T->getStmtClass() == ObjCStringLiteralClass; 1224 } 1225 static bool classof(const ObjCStringLiteral *) { return true; } 1226 1227 // Iterators 1228 virtual child_iterator child_begin(); 1229 virtual child_iterator child_end(); 1230 1231 virtual void EmitImpl(llvm::Serializer& S) const; 1232 static ObjCStringLiteral* CreateImpl(llvm::Deserializer& D); 1233}; 1234 1235/// ObjCEncodeExpr, used for @encode in Objective-C. 1236class ObjCEncodeExpr : public Expr { 1237 QualType EncType; 1238 SourceLocation AtLoc, RParenLoc; 1239public: 1240 ObjCEncodeExpr(QualType T, QualType ET, 1241 SourceLocation at, SourceLocation rp) 1242 : Expr(ObjCEncodeExprClass, T), EncType(ET), AtLoc(at), RParenLoc(rp) {} 1243 1244 SourceLocation getAtLoc() const { return AtLoc; } 1245 SourceLocation getRParenLoc() const { return RParenLoc; } 1246 1247 SourceRange getSourceRange() const { return SourceRange(AtLoc, RParenLoc); } 1248 1249 QualType getEncodedType() const { return EncType; } 1250 1251 static bool classof(const Stmt *T) { 1252 return T->getStmtClass() == ObjCEncodeExprClass; 1253 } 1254 static bool classof(const ObjCEncodeExpr *) { return true; } 1255 1256 // Iterators 1257 virtual child_iterator child_begin(); 1258 virtual child_iterator child_end(); 1259 1260 virtual void EmitImpl(llvm::Serializer& S) const; 1261 static ObjCEncodeExpr* CreateImpl(llvm::Deserializer& D); 1262}; 1263 1264/// ObjCSelectorExpr used for @selector in Objective-C. 1265class ObjCSelectorExpr : public Expr { 1266 Selector SelName; 1267 SourceLocation AtLoc, RParenLoc; 1268public: 1269 ObjCSelectorExpr(QualType T, Selector selInfo, 1270 SourceLocation at, SourceLocation rp) 1271 : Expr(ObjCSelectorExprClass, T), SelName(selInfo), 1272 AtLoc(at), RParenLoc(rp) {} 1273 1274 const Selector &getSelector() const { return SelName; } 1275 Selector &getSelector() { return SelName; } 1276 1277 SourceLocation getAtLoc() const { return AtLoc; } 1278 SourceLocation getRParenLoc() const { return RParenLoc; } 1279 SourceRange getSourceRange() const { return SourceRange(AtLoc, RParenLoc); } 1280 1281 /// getNumArgs - Return the number of actual arguments to this call. 1282 unsigned getNumArgs() const { return SelName.getNumArgs(); } 1283 1284 static bool classof(const Stmt *T) { 1285 return T->getStmtClass() == ObjCSelectorExprClass; 1286 } 1287 static bool classof(const ObjCSelectorExpr *) { return true; } 1288 1289 // Iterators 1290 virtual child_iterator child_begin(); 1291 virtual child_iterator child_end(); 1292 1293 virtual void EmitImpl(llvm::Serializer& S) const; 1294 static ObjCSelectorExpr* CreateImpl(llvm::Deserializer& D); 1295}; 1296 1297/// ObjCProtocolExpr used for protocol in Objective-C. 1298class ObjCProtocolExpr : public Expr { 1299 ObjCProtocolDecl *Protocol; 1300 SourceLocation AtLoc, RParenLoc; 1301public: 1302 ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol, 1303 SourceLocation at, SourceLocation rp) 1304 : Expr(ObjCProtocolExprClass, T), Protocol(protocol), 1305 AtLoc(at), RParenLoc(rp) {} 1306 1307 ObjCProtocolDecl *getProtocol() const { return Protocol; } 1308 1309 SourceLocation getAtLoc() const { return AtLoc; } 1310 SourceLocation getRParenLoc() const { return RParenLoc; } 1311 SourceRange getSourceRange() const { return SourceRange(AtLoc, RParenLoc); } 1312 1313 static bool classof(const Stmt *T) { 1314 return T->getStmtClass() == ObjCProtocolExprClass; 1315 } 1316 static bool classof(const ObjCProtocolExpr *) { return true; } 1317 1318 // Iterators 1319 virtual child_iterator child_begin(); 1320 virtual child_iterator child_end(); 1321}; 1322 1323/// ObjCIvarRefExpr - A reference to an ObjC instance variable. 1324class ObjCIvarRefExpr : public Expr { 1325 class ObjCIvarDecl *D; 1326 SourceLocation Loc; 1327 Expr *Base; 1328 bool IsArrow:1; // True if this is "X->F", false if this is "X.F". 1329 bool IsFreeIvar:1; // True if ivar reference has no base (self assumed). 1330 1331public: 1332 ObjCIvarRefExpr(ObjCIvarDecl *d, QualType t, SourceLocation l, Expr *base=0, 1333 bool arrow = false, bool freeIvar = false) : 1334 Expr(ObjCIvarRefExprClass, t), D(d), Loc(l), Base(base), IsArrow(arrow), 1335 IsFreeIvar(freeIvar) {} 1336 1337 ObjCIvarDecl *getDecl() { return D; } 1338 const ObjCIvarDecl *getDecl() const { return D; } 1339 virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 1340 Expr *const getBase() const { return Base; } 1341 const bool isArrow() const { return IsArrow; } 1342 const bool isFreeIvar() const { return IsFreeIvar; } 1343 1344 SourceLocation getLocation() const { return Loc; } 1345 1346 static bool classof(const Stmt *T) { 1347 return T->getStmtClass() == ObjCIvarRefExprClass; 1348 } 1349 static bool classof(const ObjCIvarRefExpr *) { return true; } 1350 1351 // Iterators 1352 virtual child_iterator child_begin(); 1353 virtual child_iterator child_end(); 1354 1355 virtual void EmitImpl(llvm::Serializer& S) const; 1356 static ObjCIvarRefExpr* CreateImpl(llvm::Deserializer& D); 1357}; 1358 1359class ObjCMessageExpr : public Expr { 1360 enum { RECEIVER=0, ARGS_START=1 }; 1361 1362 Expr **SubExprs; 1363 1364 unsigned NumArgs; 1365 1366 // A unigue name for this message. 1367 Selector SelName; 1368 1369 // A method prototype for this message (optional). 1370 // FIXME: Since method decls contain the selector, and most messages have a 1371 // prototype, consider devising a scheme for unifying SelName/MethodProto. 1372 ObjCMethodDecl *MethodProto; 1373 1374 IdentifierInfo *ClassName; // optional - 0 for instance messages. 1375 1376 SourceLocation LBracloc, RBracloc; 1377public: 1378 // constructor for class messages. 1379 // FIXME: clsName should be typed to ObjCInterfaceType 1380 ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo, 1381 QualType retType, ObjCMethodDecl *methDecl, 1382 SourceLocation LBrac, SourceLocation RBrac, 1383 Expr **ArgExprs, unsigned NumArgs); 1384 // constructor for instance messages. 1385 ObjCMessageExpr(Expr *receiver, Selector selInfo, 1386 QualType retType, ObjCMethodDecl *methDecl, 1387 SourceLocation LBrac, SourceLocation RBrac, 1388 Expr **ArgExprs, unsigned NumArgs); 1389 ~ObjCMessageExpr() { 1390 delete [] SubExprs; 1391 } 1392 1393 const Expr *getReceiver() const { return SubExprs[RECEIVER]; } 1394 Expr *getReceiver() { return SubExprs[RECEIVER]; } 1395 1396 const Selector &getSelector() const { return SelName; } 1397 Selector &getSelector() { return SelName; } 1398 1399 const ObjCMethodDecl *getMethodDecl() const { return MethodProto; } 1400 ObjCMethodDecl *getMethodDecl() { return MethodProto; } 1401 1402 const IdentifierInfo *getClassName() const { return ClassName; } 1403 IdentifierInfo *getClassName() { return ClassName; } 1404 1405 /// getNumArgs - Return the number of actual arguments to this call. 1406 unsigned getNumArgs() const { return NumArgs; } 1407 1408/// getArg - Return the specified argument. 1409 Expr *getArg(unsigned Arg) { 1410 assert(Arg < NumArgs && "Arg access out of range!"); 1411 return SubExprs[Arg+ARGS_START]; 1412 } 1413 const Expr *getArg(unsigned Arg) const { 1414 assert(Arg < NumArgs && "Arg access out of range!"); 1415 return SubExprs[Arg+ARGS_START]; 1416 } 1417 /// setArg - Set the specified argument. 1418 void setArg(unsigned Arg, Expr *ArgExpr) { 1419 assert(Arg < NumArgs && "Arg access out of range!"); 1420 SubExprs[Arg+ARGS_START] = ArgExpr; 1421 } 1422 SourceRange getSourceRange() const { return SourceRange(LBracloc, RBracloc); } 1423 1424 static bool classof(const Stmt *T) { 1425 return T->getStmtClass() == ObjCMessageExprClass; 1426 } 1427 static bool classof(const ObjCMessageExpr *) { return true; } 1428 1429 // Iterators 1430 virtual child_iterator child_begin(); 1431 virtual child_iterator child_end(); 1432}; 1433 1434} // end namespace clang 1435 1436#endif 1437