Expr.h revision f540305c5d834ad9412b41805b81a74249b7c5af
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===// 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 3c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// The LLVM Compiler Infrastructure 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// This file is distributed under the University of Illinois Open Source 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// License. See LICENSE.TXT for details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 9c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// 10c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// This file defines the Expr interface and subclasses. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef LLVM_CLANG_AST_EXPR_H 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define LLVM_CLANG_AST_EXPR_H 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "clang/AST/APValue.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "clang/AST/Stmt.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "clang/AST/Type.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/APSInt.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/APFloat.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/SmallVector.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/StringRef.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <vector> 251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace clang { 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class ASTContext; 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class APValue; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class Decl; 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class IdentifierInfo; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class ParmVarDecl; 321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt class NamedDecl; 331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt class ValueDecl; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class BlockDecl; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class CXXOperatorCallExpr; 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class CXXMemberCallExpr; 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class TemplateArgumentLoc; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt class TemplateArgumentListInfo; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt/// Expr - This represents one expression. Note that Expr's are subclasses of 411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// Stmt. This allows an expression to be transparently used any place a Stmt 421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// is required. 431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass Expr : public Stmt { 451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType TR; 461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtprotected: 481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// TypeDependent - Whether this expression is type-dependent 491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// (C++ [temp.dep.expr]). 501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool TypeDependent : 1; 511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// ValueDependent - Whether this expression is value-dependent 531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// (C++ [temp.dep.constexpr]). 541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool ValueDependent : 1; 551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr(StmtClass SC, QualType T, bool TD, bool VD) 571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Stmt(SC), TypeDependent(TD), ValueDependent(VD) { 581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt setType(T); 591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Construct an empty expression. 621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit Expr(StmtClass SC, EmptyShell) : Stmt(SC) { } 631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Increases the reference count for this expression. 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Invoke the Retain() operation when this expression 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// is being shared by another owner. 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *Retain() { 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt::Retain(); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return this; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType getType() const { return TR; } 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setType(QualType t) { 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // In C++, the type of an expression is always adjusted so that it 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // will not have reference type an expression will never have 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // reference type (C++ [expr]p6). Use 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // QualType::getNonReferenceType() to retrieve the non-reference 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // type. Additionally, inspect Expr::isLvalue to determine whether 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // an expression that is adjusted in this manner should be 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // considered an lvalue. 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert((t.isNull() || !t->isReferenceType()) && 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Expressions can't have reference type"); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TR = t; 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isValueDependent - Determines whether this expression is 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// value-dependent (C++ [temp.dep.constexpr]). For example, the 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// array bound of "Chars" in the following example is 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// value-dependent. 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @code 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template<int Size, char (&Chars)[Size]> struct meta_string; 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @endcode 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isValueDependent() const { return ValueDependent; } 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Set whether this expression is value-dependent or not. 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setValueDependent(bool VD) { ValueDependent = VD; } 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isTypeDependent - Determines whether this expression is 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// type-dependent (C++ [temp.dep.expr]), which means that its type 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// could change from one template instantiation to the next. For 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// example, the expressions "x" and "x + y" are type-dependent in 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// the following code, but "y" is not type-dependent: 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @code 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template<typename T> 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// void add(T x, int y) { 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// x + y; 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// } 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @endcode 1121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isTypeDependent() const { return TypeDependent; } 1131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Set whether this expression is type-dependent or not. 1151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setTypeDependent(bool TD) { TypeDependent = TD; } 1161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// SourceLocation tokens are not useful in isolation - they are low level 1181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// value objects created/interpreted by SourceManager. We assume AST 1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// clients will have a pointer to the respective SourceManager. 1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const = 0; 1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// getExprLoc - Return the preferred location for the arrow when diagnosing 1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// a problem with a generic expression. 1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceLocation getExprLoc() const { return getLocStart(); } 1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// isUnusedResultAWarning - Return true if this immediate expression should 1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// be warned about if the result is unused. If so, fill in Loc and Ranges 1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// with location to warn on and the source range[s] to report with the 1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// warning. 1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1, 1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceRange &R2, ASTContext &Ctx) const; 1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or 1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// incomplete type other than void. Nonarray expressions that can be lvalues: 1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - name, where name must be a variable 1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - e[i] 1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - (e), where e must be an lvalue 1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - e.name, where e must be an lvalue 1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - e->name 1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - *e, the type of e cannot be a function type 1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - string-constant 1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// - reference type [C++ [expr]] 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// - b ? x : y, where x and y are lvalues of suitable types [C++] 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum isLvalueResult { 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_Valid, 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_NotObjectType, 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_IncompleteVoidType, 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_DuplicateVectorComponents, 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_InvalidExpression, 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_MemberFunction, 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_SubObjCPropertySetting, 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LV_ClassTemporary 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt isLvalueResult isLvalue(ASTContext &Ctx) const; 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Same as above, but excluding checks for non-object and void types in C 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt isLvalueResult isLvalueInternal(ASTContext &Ctx) const; 1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 16134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// does not have an incomplete type, does not have a const-qualified type, 1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// and if it is a structure or union, does not have any member (including, 1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// recursively, any member or element of all contained aggregates or unions) 1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// with a const-qualified type. 1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// 1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \param Loc [in] [out] - A source location which *may* be filled 1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// in with the location of the expression making this a 1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// non-modifiable lvalue, if specified. 1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt enum isModifiableLvalueResult { 1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_Valid, 1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_NotObjectType, 1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_IncompleteVoidType, 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_DuplicateVectorComponents, 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_InvalidExpression, 1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_LValueCast, // Specialized form of MLV_InvalidExpression. 1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_IncompleteType, 1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_ConstQualified, 1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_ArrayType, 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_NotBlockQualified, 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MLV_ReadonlyProperty, 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MLV_NoSetterProperty, 1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_MemberFunction, 1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt MLV_SubObjCPropertySetting, 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MLV_ClassTemporary 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation *Loc = 0) const; 18834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief If this expression refers to a bit-field, retrieve the 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// declaration of that bit-field. 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FieldDecl *getBitField(); 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const FieldDecl *getBitField() const { 19404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return const_cast<Expr*>(this)->getBitField(); 19534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Returns whether this expression refers to a vector element. 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool refersToVectorElement() const; 1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 200b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt /// isIntegerConstantExpr - Return true if this expression is a valid integer 2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// constant expression, and, if so, return its value in Result. If not a 202a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt /// valid i-c-e, return false and fill in Loc (if specified) with the location 2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// of the invalid expression. 2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation *Loc = 0, 2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isEvaluated = true) const; 2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc = 0) const { 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llvm::APSInt X; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return isIntegerConstantExpr(X, Ctx, Loc); 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isConstantInitializer - Returns true if this expression is a constant 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// initializer, which can be emitted at compile-time. 2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isConstantInitializer(ASTContext &Ctx) const; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// EvalResult is a struct with detailed info about an evaluated expression. 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct EvalResult { 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Val - This is the value the expression can be folded to. 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt APValue Val; 2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// HasSideEffects - Whether the evaluated expression has side effects. 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// For example, (f() && 0) can be folded, but it still has side effects. 222444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt bool HasSideEffects; 223444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Diag - If the expression is unfoldable, then Diag contains a note 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// diagnostic indicating why it's not foldable. DiagLoc indicates a caret 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// position for the error, and DiagExpr is the expression that caused 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// the error. 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// If the expression is foldable, but not an integer constant expression, 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Diag contains a note diagnostic that describes why it isn't an integer 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// constant expression. If the expression *is* an integer constant 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// expression, then Diag will be zero. 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Diag; 2338bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt const Expr *DiagExpr; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation DiagLoc; 2358bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EvalResult() : HasSideEffects(false), Diag(0), DiagExpr(0) {} 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// Evaluate - Return true if this is a constant which we can fold using 2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// any crazy technique (that has nothing to do with language standards) that 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// we want to. If this function returns true, it returns the folded constant 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// in Result. 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool Evaluate(EvalResult &Result, ASTContext &Ctx) const; 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// EvaluateAsAny - The same as Evaluate, except that it also succeeds on 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// stack based objects. 2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool EvaluateAsAny(EvalResult &Result, ASTContext &Ctx) const; 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// EvaluateAsBooleanCondition - Return true if this is a constant 2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// which we we can fold and convert to a boolean condition using 2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// any crazy technique that we want to. 2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool EvaluateAsBooleanCondition(bool &Result, ASTContext &Ctx) const; 2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// isEvaluatable - Call Evaluate to see if this expression can be constant 2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// folded, but discard the result. 256d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt bool isEvaluatable(ASTContext &Ctx) const; 25734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// HasSideEffects - This routine returns true for all those expressions 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// which must be evaluated each time and must not be optimization away 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// or evaluated at compile time. Example is a function call, volatile 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// variable read. 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool HasSideEffects(ASTContext &Ctx) const; 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// EvaluateAsInt - Call Evaluate and return the folded integer. This 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// must be called on an expression that constant folds to an integer. 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llvm::APSInt EvaluateAsInt(ASTContext &Ctx) const; 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue 2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// with link time known address. 2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const; 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// EvaluateAsAnyLValue - The same as EvaluateAsLValue, except that it 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// also succeeds on stack based, immutable address lvalues. 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const; 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Enumeration used to describe how \c isNullPointerConstant() 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// should cope with value-dependent expressions. 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum NullPointerConstantValueDependence { 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Specifies that the expression should never be value-dependent. 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NPC_NeverValueDependent = 0, 2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Specifies that a value-dependent expression of integral or 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// dependent type should be considered a null pointer constant. 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt NPC_ValueDependentIsNull, 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Specifies that a value-dependent expression should be considered 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// to never be a null pointer constant. 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt NPC_ValueDependentIsNotNull 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt }; 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// isNullPointerConstant - C99 6.3.2.3p3 - Return true if this is either an 2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// integer constant expression with the value zero, or if this is one that is 2931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// cast to void*. 2941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isNullPointerConstant(ASTContext &Ctx, 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NullPointerConstantValueDependence NPC) const; 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isOBJCGCCandidate - Return true if this expression may be used in a read/ 2984b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt /// write barrier. 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isOBJCGCCandidate(ASTContext &Ctx) const; 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return 3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// its subexpression. If that subexpression is also a ParenExpr, 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// then this method recursively returns its subexpression, and so forth. 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Otherwise, the method returns the current Expr. 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr* IgnoreParens(); 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// or CastExprs, returning their operand. 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *IgnoreParenCasts(); 3101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// value (including ptr->int casts of the same size). Strip off any 3131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// ParenExpr or CastExprs, returning their operand. 314c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt Expr *IgnoreParenNoopCasts(ASTContext &Ctx); 315c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt 316c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt /// \brief Determine whether this expression is a default function argument. 3174b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt /// 3184b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt /// Default arguments are implicitly generated in the abstract syntax tree 3191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// by semantic analysis for function calls, object constructions, etc. in 3201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes; 3211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// this routine also looks through any implicit casts to determine whether 3221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// the expression is a default argument. 3231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isDefaultArgument() const; 3241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3256e933c1e09094a8972ef1e782c57f8b3c55c91d0Dmitry Shmidt const Expr* IgnoreParens() const { 3261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return const_cast<Expr*>(this)->IgnoreParens(); 3276e933c1e09094a8972ef1e782c57f8b3c55c91d0Dmitry Shmidt } 3286e933c1e09094a8972ef1e782c57f8b3c55c91d0Dmitry Shmidt const Expr *IgnoreParenCasts() const { 3296e933c1e09094a8972ef1e782c57f8b3c55c91d0Dmitry Shmidt return const_cast<Expr*>(this)->IgnoreParenCasts(); 3306e933c1e09094a8972ef1e782c57f8b3c55c91d0Dmitry Shmidt } 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *IgnoreParenNoopCasts(ASTContext &Ctx) const { 3321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return const_cast<Expr*>(this)->IgnoreParenNoopCasts(Ctx); 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs); 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs); 3374b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() >= firstExprConstant && 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt T->getStmtClass() <= lastExprConstant; 3411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 3421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Expr *) { return true; } 3431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 3441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt//===----------------------------------------------------------------------===// 3471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt// Primary Expressions. 3481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt//===----------------------------------------------------------------------===// 3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// \brief Represents the qualifier that may precede a C++ name, e.g., the 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// "std::" in "std::sort". 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct NameQualifier { 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief The nested name specifier. 354738a26e9e2087b0d43eba3534535632b27b49947Dmitry Shmidt NestedNameSpecifier *NNS; 355738a26e9e2087b0d43eba3534535632b27b49947Dmitry Shmidt 356738a26e9e2087b0d43eba3534535632b27b49947Dmitry Shmidt /// \brief The source range covered by the nested name specifier. 357738a26e9e2087b0d43eba3534535632b27b49947Dmitry Shmidt SourceRange Range; 358738a26e9e2087b0d43eba3534535632b27b49947Dmitry Shmidt}; 3594b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt 3604b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt/// \brief Represents an explicit template argument list in C++, e.g., 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// the "<int>" in "sort<int>". 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct ExplicitTemplateArgumentList { 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief The source location of the left angle bracket ('<'); 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation LAngleLoc; 3651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 3661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief The source location of the right angle bracket ('>'); 3671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation RAngleLoc; 368b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt 369b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt /// \brief The number of template arguments in TemplateArgs. 3701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// The actual template arguments (if any) are stored after the 37134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// ExplicitTemplateArgumentList structure. 37234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned NumTemplateArgs; 37334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 37434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the template arguments 37534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt TemplateArgumentLoc *getTemplateArgs() { 37634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return reinterpret_cast<TemplateArgumentLoc *> (this + 1); 37734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 37834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 37934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the template arguments 38034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const TemplateArgumentLoc *getTemplateArgs() const { 38134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return reinterpret_cast<const TemplateArgumentLoc *> (this + 1); 38234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 38334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 38434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void initializeFrom(const TemplateArgumentListInfo &List); 38534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void copyInto(TemplateArgumentListInfo &List) const; 38634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt static std::size_t sizeFor(const TemplateArgumentListInfo &List); 38734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt}; 38834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 38934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// DeclRefExpr - [C99 6.5.1p2] - A reference to a declared variable, function, 39034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// enum, etc. 39134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtclass DeclRefExpr : public Expr { 39234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt enum { 39334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // Flag on DecoratedD that specifies when this declaration reference 39434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // expression has a C++ nested-name-specifier. 39534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt HasQualifierFlag = 0x01, 39634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // Flag on DecoratedD that specifies when this declaration reference 39734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // expression has an explicit C++ template argument list. 39834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt HasExplicitTemplateArgumentListFlag = 0x02 39934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt }; 40034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 40134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // DecoratedD - The declaration that we are referencing, plus two bits to 40234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // indicate whether (1) the declaration's name was explicitly qualified and 40334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // (2) the declaration's name was followed by an explicit template 40434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // argument list. 40534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt llvm::PointerIntPair<ValueDecl *, 2> DecoratedD; 40634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 40734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // Loc - The location of the declaration name itself. 40834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation Loc; 40934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 41034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the qualifier that preceded the declaration name, if any. 41134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt NameQualifier *getNameQualifier() { 41234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt if ((DecoratedD.getInt() & HasQualifierFlag) == 0) 41334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return 0; 41434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 41534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return reinterpret_cast<NameQualifier *> (this + 1); 41634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 41734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 41834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the qualifier that preceded the member name, if any. 41934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const NameQualifier *getNameQualifier() const { 42034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return const_cast<DeclRefExpr *>(this)->getNameQualifier(); 42134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 42234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 42334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the explicit template argument list that followed the 42434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// member template name, if any. 42534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() { 42634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt if ((DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag) == 0) 42734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return 0; 42834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 42934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt if ((DecoratedD.getInt() & HasQualifierFlag) == 0) 43034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 43134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 43234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return reinterpret_cast<ExplicitTemplateArgumentList *>( 43334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt getNameQualifier() + 1); 43434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 43534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 43634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the explicit template argument list that followed the 43734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// member template name, if any. 43834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const { 43934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return const_cast<DeclRefExpr *>(this)->getExplicitTemplateArgumentList(); 44034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 44134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 44234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt DeclRefExpr(NestedNameSpecifier *Qualifier, SourceRange QualifierRange, 44334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt ValueDecl *D, SourceLocation NameLoc, 44434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const TemplateArgumentListInfo *TemplateArgs, 44534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt QualType T); 44634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 44734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtprotected: 44834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Computes the type- and value-dependence flags for this 44934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// declaration reference expression. 45034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void computeDependence(); 45134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 45234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt DeclRefExpr(StmtClass SC, ValueDecl *d, QualType t, SourceLocation l) : 45334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt Expr(SC, t, false, false), DecoratedD(d, 0), Loc(l) { 45434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt computeDependence(); 45534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 45634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 45734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtpublic: 45834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt DeclRefExpr(ValueDecl *d, QualType t, SourceLocation l) : 45934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt Expr(DeclRefExprClass, t, false, false), DecoratedD(d, 0), Loc(l) { 46034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt computeDependence(); 46134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 46234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 46334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Construct an empty declaration reference expression. 46434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt explicit DeclRefExpr(EmptyShell Empty) 46534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt : Expr(DeclRefExprClass, Empty) { } 46634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 46734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt static DeclRefExpr *Create(ASTContext &Context, 46834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt NestedNameSpecifier *Qualifier, 46934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceRange QualifierRange, 47034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt ValueDecl *D, 47134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation NameLoc, 47234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt QualType T, 47334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const TemplateArgumentListInfo *TemplateArgs = 0); 47434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 47534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt ValueDecl *getDecl() { return DecoratedD.getPointer(); } 47634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const ValueDecl *getDecl() const { return DecoratedD.getPointer(); } 47734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void setDecl(ValueDecl *NewD) { DecoratedD.setPointer(NewD); } 47834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 47934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation getLocation() const { return Loc; } 48034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void setLocation(SourceLocation L) { Loc = L; } 48134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt virtual SourceRange getSourceRange() const; 4821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Determine whether this declaration reference was preceded by a 4841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// C++ nested-name-specifier, e.g., \c N::foo. 4851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool hasQualifier() const { return DecoratedD.getInt() & HasQualifierFlag; } 4861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief If the name was qualified, retrieves the source range of 4881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// the nested-name-specifier that precedes the name. Otherwise, 4891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// returns an empty source range. 4901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceRange getQualifierRange() const { 4911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!hasQualifier()) 4921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(); 4931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 4941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return getNameQualifier()->Range; 4951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 49634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 4971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief If the name was qualified, retrieves the nested-name-specifier 4981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// that precedes the name. Otherwise, returns NULL. 4991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt NestedNameSpecifier *getQualifier() const { 5001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!hasQualifier()) 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5038bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt return getNameQualifier()->NNS; 5048bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt } 5058bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt 5068bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt /// \brief Determines whether this member expression actually had a C++ 5078bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt /// template argument list explicitly specified, e.g., x.f<int>. 5088bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt bool hasExplicitTemplateArgumentList() const { 5098bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt return DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag; 5108bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt } 5118bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt 51287fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// \brief Copies the template arguments (if present) into the given 51387fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// structure. 51487fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 51587fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen if (hasExplicitTemplateArgumentList()) 5161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt getExplicitTemplateArgumentList()->copyInto(List); 51787fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen } 51887fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 51987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// \brief Retrieve the location of the left angle bracket following the 52087fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// member name ('<'), if any. 52187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen SourceLocation getLAngleLoc() const { 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hasExplicitTemplateArgumentList()) 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceLocation(); 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getExplicitTemplateArgumentList()->LAngleLoc; 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the template arguments provided as part of this 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template-id. 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const TemplateArgumentLoc *getTemplateArgs() const { 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hasExplicitTemplateArgumentList()) 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getExplicitTemplateArgumentList()->getTemplateArgs(); 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the number of template arguments provided as part of this 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template-id. 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getNumTemplateArgs() const { 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hasExplicitTemplateArgumentList()) 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getExplicitTemplateArgumentList()->NumTemplateArgs; 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the location of the right angle bracket following the 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template arguments ('>'). 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRAngleLoc() const { 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!hasExplicitTemplateArgumentList()) 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceLocation(); 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return getExplicitTemplateArgumentList()->RAngleLoc; 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == DeclRefExprClass; 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const DeclRefExpr *) { return true; } 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// PredefinedExpr - [C99 6.4.2.2] - A predefined identifier such as __func__. 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass PredefinedExpr : public Expr { 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum IdentType { 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Func, 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Function, 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt PrettyFunction, 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// PrettyFunctionNoVirtual - The same as PrettyFunction, except that the 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// 'virtual' keyword is omitted for virtual member functions. 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt PrettyFunctionNoVirtual 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtprivate: 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation Loc; 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IdentType Type; 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt PredefinedExpr(SourceLocation l, QualType type, IdentType IT) 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(PredefinedExprClass, type, type->isDependentType(), 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type->isDependentType()), Loc(l), Type(IT) {} 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Construct an empty predefined expression. 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit PredefinedExpr(EmptyShell Empty) 5871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(PredefinedExprClass, Empty) { } 5881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt IdentType getIdentType() const { return Type; } 5901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setIdentType(IdentType IT) { Type = IT; } 5911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getLocation() const { return Loc; } 5931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setLocation(SourceLocation L) { Loc = L; } 5941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 5951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static std::string ComputeName(IdentType IT, const Decl *CurrentDecl); 59604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 59780da0428ce21beb670d31bd06d025d8609d658b4Jouni Malinen virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 59880da0428ce21beb670d31bd06d025d8609d658b4Jouni Malinen 59980da0428ce21beb670d31bd06d025d8609d658b4Jouni Malinen static bool classof(const Stmt *T) { 600738a26e9e2087b0d43eba3534535632b27b49947Dmitry Shmidt return T->getStmtClass() == PredefinedExprClass; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const PredefinedExpr *) { return true; } 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 6051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 6061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass IntegerLiteral : public Expr { 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llvm::APInt Value; 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation Loc; 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // or UnsignedLongLongTy 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IntegerLiteral(const llvm::APInt &V, QualType type, SourceLocation l) 61634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt : Expr(IntegerLiteralClass, type, false, false), Value(V), Loc(l) { 61734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt assert(type->isIntegerType() && "Illegal type in IntegerLiteral"); 61834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 61934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 62034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Construct an empty integer literal. 62134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt explicit IntegerLiteral(EmptyShell Empty) 62234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt : Expr(IntegerLiteralClass, Empty) { } 62334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 62434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const llvm::APInt &getValue() const { return Value; } 62534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 62634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 62734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Retrieve the location of the literal. 62834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation getLocation() const { return Loc; } 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setValue(const llvm::APInt &Val) { Value = Val; } 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLocation(SourceLocation Location) { Loc = Location; } 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == IntegerLiteralClass; 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const IntegerLiteral *) { return true; } 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass CharacterLiteral : public Expr { 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Value; 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation Loc; 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool IsWide; 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // type should be IntTy 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CharacterLiteral(unsigned value, bool iswide, QualType type, SourceLocation l) 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(CharacterLiteralClass, type, false, false), Value(value), Loc(l), 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IsWide(iswide) { 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Construct an empty character literal. 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { } 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getLocation() const { return Loc; } 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isWide() const { return IsWide; } 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getValue() const { return Value; } 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLocation(SourceLocation Location) { Loc = Location; } 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setWide(bool W) { IsWide = W; } 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setValue(unsigned Val) { Value = Val; } 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == CharacterLiteralClass; 6701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CharacterLiteral *) { return true; } 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 6741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass FloatingLiteral : public Expr { 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt llvm::APFloat Value; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool IsExact : 1; 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation Loc; 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FloatingLiteral(const llvm::APFloat &V, bool isexact, 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType Type, SourceLocation L) 6851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(FloatingLiteralClass, Type, false, false), Value(V), 6861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt IsExact(isexact), Loc(L) {} 6871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Construct an empty floating-point literal. 6891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit FloatingLiteral(EmptyShell Empty) 6901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(FloatingLiteralClass, Empty), Value(0.0) { } 6911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const llvm::APFloat &getValue() const { return Value; } 6931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setValue(const llvm::APFloat &Val) { Value = Val; } 6941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 69534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt bool isExact() const { return IsExact; } 69634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void setExact(bool E) { IsExact = E; } 6971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// getValueAsApproximateDouble - This returns the value as an inaccurate 6991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// double. Note that this may cause loss of precision, but is useful for 7001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// debugging dumps, etc. 7011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt double getValueAsApproximateDouble() const; 7021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getLocation() const { return Loc; } 7041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setLocation(SourceLocation L) { Loc = L; } 7051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 7071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 7091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == FloatingLiteralClass; 7101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 7111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const FloatingLiteral *) { return true; } 71234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 71334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // Iterators 71434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt virtual child_iterator child_begin(); 71534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt virtual child_iterator child_end(); 71634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt}; 71734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 71834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// ImaginaryLiteral - We support imaginary integer and floating point literals, 7191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// like "1.0i". We represent these as a wrapper around FloatingLiteral and 7201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// IntegerLiteral classes. Instances of this class always have a Complex type 7211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// whose element type matches the subexpression. 7221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 7231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass ImaginaryLiteral : public Expr { 7241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt *Val; 7251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ImaginaryLiteral(Expr *val, QualType Ty) 7271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ImaginaryLiteralClass, Ty, false, false), Val(val) {} 72834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 7291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Build an empty imaginary literal. 7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit ImaginaryLiteral(EmptyShell Empty) 7311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ImaginaryLiteralClass, Empty) { } 7321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 73334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const Expr *getSubExpr() const { return cast<Expr>(Val); } 7341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getSubExpr() { return cast<Expr>(Val); } 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setSubExpr(Expr *E) { Val = E; } 7361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 73734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt virtual SourceRange getSourceRange() const { return Val->getSourceRange(); } 73834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt static bool classof(const Stmt *T) { 7391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == ImaginaryLiteralClass; 7401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 7411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const ImaginaryLiteral *) { return true; } 7421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 7441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 7451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 7461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 7471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 7481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// StringLiteral - This represents a string literal expression, e.g. "foo" 74934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// or L"bar" (wide strings). The actual string is returned by getStrData() 75034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// is NOT null-terminated, and the length of the string is determined by 75134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// calling getByteLength(). The C type for a string is always a 75234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// ConstantArrayType. In C++, the char type is const qualified, in C it is 75334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// not. 75434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// 75534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// Note that strings in C can be formed by concatenation of multiple string 75634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// literal pptokens in translation phase #6. This keeps track of the locations 75734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// of each of these pieces. 75834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// 75934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// Strings in C can also be truncated and extended by assigning into arrays, 76034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// e.g. with constructs like: 76134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// char X[2] = "foobar"; 76234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// In this case, getByteLength() will return 6, but the string literal will 76334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt/// have type "char[2]". 76434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtclass StringLiteral : public Expr { 76534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const char *StrData; 76634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned ByteLength; 76734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt bool IsWide; 76834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned NumConcatenated; 76934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation TokLocs[1]; 77034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 77134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt StringLiteral(QualType Ty) : Expr(StringLiteralClass, Ty, false, false) {} 77234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 77334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtprotected: 77434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt virtual void DoDestroy(ASTContext &C); 77534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 77634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtpublic: 77734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// This is the "fully general" constructor that allows representation of 77834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// strings formed from multiple concatenated tokens. 77934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt static StringLiteral *Create(ASTContext &C, const char *StrData, 78034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned ByteLength, bool Wide, QualType Ty, 78134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const SourceLocation *Loc, unsigned NumStrs); 78234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 78334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// Simple constructor for string literals made from one token. 78434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt static StringLiteral *Create(ASTContext &C, const char *StrData, 78534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned ByteLength, 78634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt bool Wide, QualType Ty, SourceLocation Loc) { 78734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return Create(C, StrData, ByteLength, Wide, Ty, &Loc, 1); 78834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 78934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 79034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// \brief Construct an empty string literal. 79134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt static StringLiteral *CreateEmpty(ASTContext &C, unsigned NumStrs); 79234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 79334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt llvm::StringRef getString() const { 79434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return llvm::StringRef(StrData, ByteLength); 79534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 79634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // FIXME: These are deprecated, replace with StringRef. 79734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt const char *getStrData() const { return StrData; } 79834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned getByteLength() const { return ByteLength; } 79934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 8001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Sets the string data to the given string data. 8011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setString(ASTContext &C, llvm::StringRef Str); 8021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isWide() const { return IsWide; } 8041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setWide(bool W) { IsWide = W; } 8051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool containsNonAsciiOrNull() const { 8071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt llvm::StringRef Str = getString(); 8081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (unsigned i = 0, e = Str.size(); i != e; ++i) 8091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!isascii(Str[i]) || !Str[i]) 8101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return true; 8111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return false; 8121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 8131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// getNumConcatenated - Get the number of string literal tokens that were 8141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// concatenated in translation phase #6 to form this string literal. 8151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned getNumConcatenated() const { return NumConcatenated; } 8161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getStrTokenLoc(unsigned TokNum) const { 8181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt assert(TokNum < NumConcatenated && "Invalid tok number"); 8191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return TokLocs[TokNum]; 8201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 8211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setStrTokenLoc(unsigned TokNum, SourceLocation L) { 8221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt assert(TokNum < NumConcatenated && "Invalid tok number"); 8231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt TokLocs[TokNum] = L; 8241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 8251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt typedef const SourceLocation *tokloc_iterator; 8271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tokloc_iterator tokloc_begin() const { return TokLocs; } 8281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tokloc_iterator tokloc_end() const { return TokLocs+NumConcatenated; } 8291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { 8311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(TokLocs[0], TokLocs[NumConcatenated-1]); 8321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 833c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt static bool classof(const Stmt *T) { 8341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == StringLiteralClass; 8351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 8361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const StringLiteral *) { return true; } 8371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 8391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 8401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 8411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 8421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// ParenExpr - This represents a parethesized expression, e.g. "(1)". This 8441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// AST node is only formed if full location information is requested. 8451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass ParenExpr : public Expr { 8461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation L, R; 8471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt *Val; 8481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 8491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ParenExpr(SourceLocation l, SourceLocation r, Expr *val) 8501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ParenExprClass, val->getType(), 8511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt val->isTypeDependent(), val->isValueDependent()), 8521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt L(l), R(r), Val(val) {} 8531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Construct an empty parenthesized expression. 8551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit ParenExpr(EmptyShell Empty) 8561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ParenExprClass, Empty) { } 8571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const Expr *getSubExpr() const { return cast<Expr>(Val); } 8591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getSubExpr() { return cast<Expr>(Val); } 8601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setSubExpr(Expr *E) { Val = E; } 8611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { return SourceRange(L, R); } 8631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Get the location of the left parentheses '('. 8651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getLParen() const { return L; } 8661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setLParen(SourceLocation Loc) { L = Loc; } 8671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Get the location of the right parentheses ')'. 8691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getRParen() const { return R; } 8701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setRParen(SourceLocation Loc) { R = Loc; } 8711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 8731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == ParenExprClass; 8741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 8751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const ParenExpr *) { return true; } 8761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 8781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 8791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 8801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 8811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 8831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// UnaryOperator - This represents the unary-expression's (except sizeof and 8841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// alignof), the postinc/postdec operators from postfix-expression, and various 8851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// extensions. 8861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 8871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// Notes on various nodes: 8881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 8891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// Real/Imag - These return the real/imag part of a complex operand. If 8901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// applied to a non-complex value, the former returns its operand and the 8911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// later returns zero in the type of the operand. 8921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 8931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// __builtin_offsetof(type, a.b[10]) is represented as a unary operator whose 8941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// subexpression is a compound literal with the various MemberExpr and 8951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// ArraySubscriptExpr's applied to it. 8961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 8971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass UnaryOperator : public Expr { 8981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 8991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Note that additions to this should also update the StmtVisitor class. 9001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt enum Opcode { 9011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt PostInc, PostDec, // [C99 6.5.2.4] Postfix increment and decrement operators 9021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt PreInc, PreDec, // [C99 6.5.3.1] Prefix increment and decrement operators. 9031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt AddrOf, Deref, // [C99 6.5.3.2] Address and indirection operators. 9041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Plus, Minus, // [C99 6.5.3.3] Unary arithmetic operators. 9051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Not, LNot, // [C99 6.5.3.3] Unary arithmetic operators. 9061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Real, Imag, // "__real expr"/"__imag expr" Extension. 9071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Extension, // __extension__ marker. 9081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt OffsetOf // __builtin_offsetof 9091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt }; 9101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtprivate: 9111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt *Val; 9121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Opcode Opc; 9131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation Loc; 9141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 9151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt UnaryOperator(Expr *input, Opcode opc, QualType type, SourceLocation l) 9171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(UnaryOperatorClass, type, 9181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt input->isTypeDependent() && opc != OffsetOf, 9191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt input->isValueDependent()), 9201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Val(input), Opc(opc), Loc(l) {} 9211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Build an empty unary operator. 9231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit UnaryOperator(EmptyShell Empty) 9241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(UnaryOperatorClass, Empty), Opc(AddrOf) { } 9251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Opcode getOpcode() const { return Opc; } 9271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setOpcode(Opcode O) { Opc = O; } 9281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getSubExpr() const { return cast<Expr>(Val); } 9301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setSubExpr(Expr *E) { Val = E; } 9311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// getOperatorLoc - Return the location of the operator. 9331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getOperatorLoc() const { return Loc; } 9341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setOperatorLoc(SourceLocation L) { Loc = L; } 9351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// isPostfix - Return true if this is a postfix operation, like x++. 9371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool isPostfix(Opcode Op) { 9381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return Op == PostInc || Op == PostDec; 9391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 9401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// isPostfix - Return true if this is a prefix operation, like --x. 9421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool isPrefix(Opcode Op) { 9431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return Op == PreInc || Op == PreDec; 9441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 9451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isPrefix() const { return isPrefix(Opc); } 9471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isPostfix() const { return isPostfix(Opc); } 9481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isIncrementOp() const {return Opc==PreInc || Opc==PostInc; } 9491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isIncrementDecrementOp() const { return Opc>=PostInc && Opc<=PreDec; } 9501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isOffsetOfOp() const { return Opc == OffsetOf; } 9511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool isArithmeticOp(Opcode Op) { return Op >= Plus && Op <= LNot; } 9521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isArithmeticOp() const { return isArithmeticOp(Opc); } 9531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 9551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// corresponds to, e.g. "sizeof" or "[pre]++" 9561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static const char *getOpcodeStr(Opcode Op); 9571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Retrieve the unary opcode that corresponds to the given 9591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// overloaded operator. 9601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix); 9611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Retrieve the overloaded operator kind that corresponds to 9631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// the given unary opcode. 9641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 9651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { 9671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (isPostfix()) 9681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(Val->getLocStart(), Loc); 9691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 9701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(Loc, Val->getLocEnd()); 9711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 9721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceLocation getExprLoc() const { return Loc; } 9731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 9741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 9751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == UnaryOperatorClass; 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const UnaryOperator *) { return true; } 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// SizeOfAlignOfExpr - [C99 6.5.3.4] - This is for sizeof/alignof, both of 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// types and expressions. 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass SizeOfAlignOfExpr : public Expr { 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isSizeof : 1; // true if sizeof, false if alignof. 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isType : 1; // true if operand is a type, false if an expression 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union { 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TypeSourceInfo *Ty; 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt *Ex; 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } Argument; 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation OpLoc, RParenLoc; 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtprotected: 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual void DoDestroy(ASTContext& C); 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SizeOfAlignOfExpr(bool issizeof, TypeSourceInfo *TInfo, 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType resultType, SourceLocation op, 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation rp) : 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr(SizeOfAlignOfExprClass, resultType, 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt false, // Never type-dependent (C++ [temp.dep.expr]p3). 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Value-dependent if the argument is type-dependent. 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TInfo->getType()->isDependentType()), 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt isSizeof(issizeof), isType(true), OpLoc(op), RParenLoc(rp) { 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Argument.Ty = TInfo; 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SizeOfAlignOfExpr(bool issizeof, Expr *E, 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType resultType, SourceLocation op, 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation rp) : 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr(SizeOfAlignOfExprClass, resultType, 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt false, // Never type-dependent (C++ [temp.dep.expr]p3). 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Value-dependent if the argument is type-dependent. 101604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt E->isTypeDependent()), 101704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt isSizeof(issizeof), isType(false), OpLoc(op), RParenLoc(rp) { 101804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt Argument.Ex = E; 101904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 102004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 102104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// \brief Construct an empty sizeof/alignof expression. 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit SizeOfAlignOfExpr(EmptyShell Empty) 102304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt : Expr(SizeOfAlignOfExprClass, Empty) { } 102404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 102504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bool isSizeOf() const { return isSizeof; } 102604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt void setSizeof(bool S) { isSizeof = S; } 102704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 102804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bool isArgumentType() const { return isType; } 102904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt QualType getArgumentType() const { 103004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return getArgumentTypeInfo()->getType(); 103104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 103204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt TypeSourceInfo *getArgumentTypeInfo() const { 103304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt assert(isArgumentType() && "calling getArgumentType() when arg is expr"); 103404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return Argument.Ty; 103504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getArgumentExpr() { 103704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt assert(!isArgumentType() && "calling getArgumentExpr() when arg is type"); 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return static_cast<Expr*>(Argument.Ex); 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getArgumentExpr() const { 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return const_cast<SizeOfAlignOfExpr*>(this)->getArgumentExpr(); 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setArgument(Expr *E) { Argument.Ex = E; isType = false; } 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setArgument(TypeSourceInfo *TInfo) { 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Argument.Ty = TInfo; 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt isType = true; 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Gets the argument type, or the type of the argument expression, whichever 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// is appropriate. 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType getTypeOfArgument() const { 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType(); 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getOperatorLoc() const { return OpLoc; } 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setOperatorLoc(SourceLocation L) { OpLoc = L; } 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(OpLoc, RParenLoc); 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == SizeOfAlignOfExprClass; 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const SizeOfAlignOfExpr *) { return true; } 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Postfix Operators. 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ArraySubscriptExpr : public Expr { 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum { LHS, RHS, END_EXPR=2 }; 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt* SubExprs[END_EXPR]; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation RBracketLoc; 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 10861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, 10871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation rbracketloc) 10881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ArraySubscriptExprClass, t, 10891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt lhs->isTypeDependent() || rhs->isTypeDependent(), 10901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt lhs->isValueDependent() || rhs->isValueDependent()), 10911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt RBracketLoc(rbracketloc) { 10921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SubExprs[LHS] = lhs; 10931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SubExprs[RHS] = rhs; 10941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 10951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 10961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Create an empty array subscript expression. 10971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit ArraySubscriptExpr(EmptyShell Shell) 10981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ArraySubscriptExprClass, Shell) { } 10991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// An array access can be written A[4] or 4[A] (both are equivalent). 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// - getBase() and getIdx() always present the normalized view: A[4]. 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// In this case getBase() returns "A" and getIdx() returns "4". 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// - getLHS() and getRHS() present the syntactic view. e.g. for 11041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// 4[A] getLHS() returns "4". 11051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// Note: Because vector element access is also written A[4] we must 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// predicate the format conversion in getBase and getIdx only on the 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// the type of the RHS, as it is possible for the LHS to be a vector of 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// integer type 11091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); } 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 11111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setLHS(Expr *E) { SubExprs[LHS] = E; } 11121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); } 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRHS(Expr *E) { SubExprs[RHS] = E; } 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getBase() { 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getBase() const { 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getIdx() { 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 11271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 11281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const Expr *getIdx() const { 11301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 11311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 11321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(getLHS()->getLocStart(), RBracketLoc); 11351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 11361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getRBracketLoc() const { return RBracketLoc; } 11381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 11391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceLocation getExprLoc() const { return getBase()->getExprLoc(); } 11411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 11431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == ArraySubscriptExprClass; 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ArraySubscriptExpr *) { return true; } 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 11481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 11491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 11501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 11511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 115304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]). 115404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// CallExpr itself represents a normal function call, e.g., "f(x, 2)", 115504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// while its subclasses may represent alternative syntax that (semantically) 115604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// results in a function call. For example, CXXOperatorCallExpr is 115704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// a subclass for overloaded operator calls that use operator syntax, e.g., 115804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// "str1 + str2" to resolve to a function call. 115904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtclass CallExpr : public Expr { 116004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum { FN=0, ARGS_START=1 }; 11611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt **SubExprs; 11621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned NumArgs; 11631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation RParenLoc; 11641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtprotected: 11661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // This version of the constructor is for derived classes. 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args, unsigned numargs, 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType t, SourceLocation rparenloc); 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual void DoDestroy(ASTContext& C); 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, QualType t, 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation rparenloc); 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty call expression. 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty); 11781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ~CallExpr() {} 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); } 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getCallee() { return cast<Expr>(SubExprs[FN]); } 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setCallee(Expr *F) { SubExprs[FN] = F; } 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Decl *getCalleeDecl(); 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Decl *getCalleeDecl() const { 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return const_cast<CallExpr*>(this)->getCalleeDecl(); 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief If the callee is a FunctionDecl, return it. Otherwise return 0. 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FunctionDecl *getDirectCallee(); 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const FunctionDecl *getDirectCallee() const { 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return const_cast<CallExpr*>(this)->getDirectCallee(); 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getNumArgs - Return the number of actual arguments to this call. 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getNumArgs() const { return NumArgs; } 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getArg - Return the specified argument. 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getArg(unsigned Arg) { 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Arg < NumArgs && "Arg access out of range!"); 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(SubExprs[Arg+ARGS_START]); 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getArg(unsigned Arg) const { 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Arg < NumArgs && "Arg access out of range!"); 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(SubExprs[Arg+ARGS_START]); 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// setArg - Set the specified argument. 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setArg(unsigned Arg, Expr *ArgExpr) { 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Arg < NumArgs && "Arg access out of range!"); 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[Arg+ARGS_START] = ArgExpr; 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// setNumArgs - This changes the number of arguments present in this call. 12171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// Any orphaned expressions are deleted by this, and any new operands are set 12181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// to null. 12191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setNumArgs(ASTContext& C, unsigned NumArgs); 12201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 12211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt typedef ExprIterator arg_iterator; 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt typedef ConstExprIterator const_arg_iterator; 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg_iterator arg_begin() { return SubExprs+ARGS_START; } 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt arg_iterator arg_end() { return SubExprs+ARGS_START+getNumArgs(); } 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const_arg_iterator arg_begin() const { return SubExprs+ARGS_START; } 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const_arg_iterator arg_end() const { return SubExprs+ARGS_START+getNumArgs();} 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getNumCommas - Return the number of commas that must have been present in 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// this function call. 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; } 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// not, return 0. 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned isBuiltinCall(ASTContext &Context) const; 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getCallReturnType - Get the return type of the call expr. This is not 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// always the type of the expr itself, if the return type is a reference 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// type. 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType getCallReturnType() const; 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(getCallee()->getLocStart(), RParenLoc); 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == CallExprClass || 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt T->getStmtClass() == CXXOperatorCallExprClass || 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt T->getStmtClass() == CXXMemberCallExprClass; 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1254d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt static bool classof(const CallExpr *) { return true; } 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CXXOperatorCallExpr *) { return true; } 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CXXMemberCallExpr *) { return true; } 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12638bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt/// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass MemberExpr : public Expr { 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Base - the expression for the base pointer or structure references. In 1267d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// X.F, this is "X". 1268d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt Stmt *Base; 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// MemberDecl - This is the decl being referenced by the field/member name. 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// In X.F, this is the decl referenced by F. 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ValueDecl *MemberDecl; 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// MemberLoc - This is the location of the member name. 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation MemberLoc; 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// IsArrow - True if this is "X->F", false if this is "X.F". 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool IsArrow : 1; 127987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 128087fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// \brief True if this member expression used a nested-name-specifier to 128187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// refer to the member, e.g., "x->Base::f". When true, a NameQualifier 128287fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// structure is allocated immediately after the MemberExpr. 128387fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen bool HasQualifier : 1; 128487fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 128587fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// \brief True if this member expression specified a template argument list 128687fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// explicitly, e.g., x->f<int>. When true, an ExplicitTemplateArgumentList 128787fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// structure (and its TemplateArguments) are allocated immediately after 128887fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// the MemberExpr or, if the member expression also has a qualifier, after 128987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// the NameQualifier structure. 12901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool HasExplicitTemplateArgumentList : 1; 129187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 129287fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// \brief Retrieve the qualifier that preceded the member name, if any. 129387fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen NameQualifier *getMemberQualifier() { 129487fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen if (!HasQualifier) 129587fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen return 0; 129687fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 129787fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen return reinterpret_cast<NameQualifier *> (this + 1); 129887fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen } 129987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 1300b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt /// \brief Retrieve the qualifier that preceded the member name, if any. 1301b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt const NameQualifier *getMemberQualifier() const { 1302b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt return const_cast<MemberExpr *>(this)->getMemberQualifier(); 130387fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen } 130487fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 130587fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// \brief Retrieve the explicit template argument list that followed the 130687fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen /// member template name, if any. 130787fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() { 130887fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen if (!HasExplicitTemplateArgumentList) 130987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen return 0; 131087fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen 131187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen if (!HasQualifier) 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return reinterpret_cast<ExplicitTemplateArgumentList *>( 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getMemberQualifier() + 1); 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the explicit template argument list that followed the 1319d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// member template name, if any. 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const { 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return const_cast<MemberExpr *>(this)->getExplicitTemplateArgumentList(); 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MemberExpr(Expr *base, bool isarrow, NestedNameSpecifier *qual, 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceRange qualrange, ValueDecl *memberdecl, SourceLocation l, 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const TemplateArgumentListInfo *targs, QualType ty); 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl, 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation l, QualType ty) 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(MemberExprClass, ty, 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt base->isTypeDependent(), base->isValueDependent()), 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow), 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HasQualifier(false), HasExplicitTemplateArgumentList(false) {} 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty member reference expression. 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit MemberExpr(EmptyShell Empty) 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(MemberExprClass, Empty), HasQualifier(false), 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt HasExplicitTemplateArgumentList(false) { } 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static MemberExpr *Create(ASTContext &C, Expr *base, bool isarrow, 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NestedNameSpecifier *qual, SourceRange qualrange, 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ValueDecl *memberdecl, 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation l, 13458bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt const TemplateArgumentListInfo *targs, 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType ty); 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setBase(Expr *E) { Base = E; } 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getBase() const { return cast<Expr>(Base); } 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the member declaration to which this expression refers. 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// The returned declaration will either be a FieldDecl or (in C++) 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// a CXXMethodDecl. 135504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ValueDecl *getMemberDecl() const { return MemberDecl; } 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setMemberDecl(ValueDecl *D) { MemberDecl = D; } 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Determines whether this member expression actually had 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// a C++ nested-name-specifier prior to the name of the member, e.g., 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// x->Base::foo. 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool hasQualifier() const { return HasQualifier; } 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief If the member name was qualified, retrieves the source range of 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// the nested-name-specifier that precedes the member name. Otherwise, 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// returns an empty source range. 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceRange getQualifierRange() const { 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!HasQualifier) 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(); 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getMemberQualifier()->Range; 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief If the member name was qualified, retrieves the 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// nested-name-specifier that precedes the member name. Otherwise, returns 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// NULL. 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NestedNameSpecifier *getQualifier() const { 1377d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (!HasQualifier) 1378d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return 0; 1379d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 1380d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return getMemberQualifier()->NNS; 1381d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Determines whether this member expression actually had a C++ 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template argument list explicitly specified, e.g., x.f<int>. 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool hasExplicitTemplateArgumentList() const { 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return HasExplicitTemplateArgumentList; 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Copies the template arguments (if present) into the given 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// structure. 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hasExplicitTemplateArgumentList()) 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getExplicitTemplateArgumentList()->copyInto(List); 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the location of the left angle bracket following the 13978bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt /// member name ('<'), if any. 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getLAngleLoc() const { 13998bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt if (!HasExplicitTemplateArgumentList) 14008bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt return SourceLocation(); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getExplicitTemplateArgumentList()->LAngleLoc; 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the template arguments provided as part of this 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template-id. 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const TemplateArgumentLoc *getTemplateArgs() const { 14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!HasExplicitTemplateArgumentList) 14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 141187fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen return getExplicitTemplateArgumentList()->getTemplateArgs(); 141287fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen } 14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the number of template arguments provided as part of this 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// template-id. 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getNumTemplateArgs() const { 14171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!HasExplicitTemplateArgumentList) 1418c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt return 0; 1419c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 14201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return getExplicitTemplateArgumentList()->NumTemplateArgs; 14211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 1422d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 14231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Retrieve the location of the right angle bracket following the 14241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// template arguments ('>'). 14251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getRAngleLoc() const { 14261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!HasExplicitTemplateArgumentList) 14271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceLocation(); 14281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 14291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return getExplicitTemplateArgumentList()->RAngleLoc; 14301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 14311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 14321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isArrow() const { return IsArrow; } 14331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setArrow(bool A) { IsArrow = A; } 1434d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 1435d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// getMemberLoc - Return the location of the "member", in X->F, it is the 1436d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// location of 'F'. 1437d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt SourceLocation getMemberLoc() const { return MemberLoc; } 1438d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void setMemberLoc(SourceLocation L) { MemberLoc = L; } 1439d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 1440d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt virtual SourceRange getSourceRange() const { 1441d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt // If we have an implicit base (like a C++ implicit this), 1442d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt // make sure not to return its location 1443d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt SourceLocation EndLoc = MemberLoc; 1444d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (HasExplicitTemplateArgumentList) 1445d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt EndLoc = getRAngleLoc(); 1446d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 14478bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt SourceLocation BaseLoc = getBase()->getLocStart(); 14481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (BaseLoc.isInvalid()) 14491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(MemberLoc, EndLoc); 145004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return SourceRange(BaseLoc, EndLoc); 145104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 145204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 145304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt virtual SourceLocation getExprLoc() const { return MemberLoc; } 145404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 145504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt static bool classof(const Stmt *T) { 145604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return T->getStmtClass() == MemberExprClass; 145704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 145804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt static bool classof(const MemberExpr *) { return true; } 145904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 146004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt // Iterators 146104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt virtual child_iterator child_begin(); 146204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt virtual child_iterator child_end(); 146304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}; 146404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 146504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// CompoundLiteralExpr - [C99 6.5.2.5] 146604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// 146704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtclass CompoundLiteralExpr : public Expr { 146804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// LParenLoc - If non-null, this is the location of the left paren in a 146904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// compound literal like "(int){4}". This can be null if this is a 147004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// synthesized compound expression. 147104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt SourceLocation LParenLoc; 147204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 147304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// The type as written. This can be an incomplete array type, in 147404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// which case the actual expression type will be different. 147504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt TypeSourceInfo *TInfo; 147604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt Stmt *Init; 147704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt bool FileScope; 147804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtpublic: 147904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt // FIXME: Can compound literals be value-dependent? 148004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo, 148104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt QualType T, Expr *init, bool fileScope) 148204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt : Expr(CompoundLiteralExprClass, T, 148304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt tinfo->getType()->isDependentType(), false), 148404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt LParenLoc(lparenloc), TInfo(tinfo), Init(init), FileScope(fileScope) {} 148504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 148604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// \brief Construct an empty compound literal. 14871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit CompoundLiteralExpr(EmptyShell Empty) 14881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(CompoundLiteralExprClass, Empty) { } 14891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getInitializer() const { return cast<Expr>(Init); } 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getInitializer() { return cast<Expr>(Init); } 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setInitializer(Expr *E) { Init = E; } 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isFileScope() const { return FileScope; } 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setFileScope(bool FS) { FileScope = FS; } 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getLParenLoc() const { return LParenLoc; } 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLParenLoc(SourceLocation L) { LParenLoc = L; } 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TypeSourceInfo *getTypeSourceInfo() const { return TInfo; } 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setTypeSourceInfo(TypeSourceInfo* tinfo) { TInfo = tinfo; } 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // FIXME: Init should never be null. 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!Init) 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(); 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (LParenLoc.isInvalid()) 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return Init->getSourceRange(); 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(LParenLoc, Init->getLocEnd()); 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == CompoundLiteralExprClass; 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CompoundLiteralExpr *) { return true; } 151604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 151704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt // Iterators 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 152204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// CastExpr - Base class for type casts, including both implicit 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// casts (ImplicitCastExpr) and explicit casts that have some 15248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// representation in the source code (ExplicitCastExpr's derived 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// classes). 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass CastExpr : public Expr { 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CastKind - the kind of cast this represents. 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum CastKind { 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_Unknown - Unknown cast kind. 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// FIXME: The goal is to get rid of this and make all casts have a 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// kind so that the AST client doesn't have to try to figure out what's 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// going on. 153404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt CK_Unknown, 153504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 153604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// CK_BitCast - Used for reinterpret_cast. 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_BitCast, 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_NoOp - Used for const_cast. 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_NoOp, 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_BaseToDerived - Base to derived class casts. 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_BaseToDerived, 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_DerivedToBase - Derived to base class casts. 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_DerivedToBase, 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_Dynamic - Dynamic cast. 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_Dynamic, 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_ToUnion - Cast to union (GCC extension). 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_ToUnion, 155304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_ArrayToPointerDecay - Array to pointer decay. 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_ArrayToPointerDecay, 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // CK_FunctionToPointerDecay - Function to pointer decay. 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_FunctionToPointerDecay, 15591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 15601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// CK_NullToMemberPointer - Null pointer to member pointer. 15611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CK_NullToMemberPointer, 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_BaseToDerivedMemberPointer - Member pointer in base class to 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// member pointer in derived class. 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_BaseToDerivedMemberPointer, 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1567d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// CK_DerivedToBaseMemberPointer - Member pointer in derived class to 15681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// member pointer in base class. 15691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CK_DerivedToBaseMemberPointer, 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// CK_UserDefinedConversion - Conversion using a user defined type 15721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// conversion function. 15731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CK_UserDefinedConversion, 15741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 15751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// CK_ConstructorConversion - Conversion by constructor 15761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CK_ConstructorConversion, 15771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 15781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// CK_IntegralToPointer - Integral to pointer 15791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CK_IntegralToPointer, 15801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 15811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// CK_PointerToIntegral - Pointer to integral 15821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CK_PointerToIntegral, 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_ToVoid - Cast to void. 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_ToVoid, 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_VectorSplat - Casting from an integer/floating type to an extended 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// vector type with the same element type as the src type. Splats the 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// src expression into the destination expression. 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_VectorSplat, 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_IntegralCast - Casting between integral types of different size. 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_IntegralCast, 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_IntegralToFloating - Integral to floating point. 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_IntegralToFloating, 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_FloatingToIntegral - Floating point to integral. 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_FloatingToIntegral, 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_FloatingCast - Casting between floating types of different size. 16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_FloatingCast, 16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// CK_MemberPointerToBoolean - Member pointer to boolean 16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_MemberPointerToBoolean, 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1607d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// CK_AnyPointerToObjCPointerCast - Casting any pointer to objective-c 1608d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// pointer 1609d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt CK_AnyPointerToObjCPointerCast, 1610d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// CK_AnyPointerToBlockPointerCast - Casting any pointer to block 1611d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// pointer 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CK_AnyPointerToBlockPointerCast 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16168bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtprivate: 16178bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt CastKind Kind; 16188bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt Stmt *Op; 16198bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidtprotected: 16208bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt CastExpr(StmtClass SC, QualType ty, const CastKind kind, Expr *op) : 16218bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt Expr(SC, ty, 16228bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt // Cast expressions are type-dependent if the type is 16238bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt // dependent (C++ [temp.dep.expr]p3). 16248bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt ty->isDependentType(), 16258bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt // Cast expressions are value-dependent if the type is 16268bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt // dependent or if the subexpression is value-dependent. 16278bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt ty->isDependentType() || (op && op->isValueDependent())), 16288bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt Kind(kind), Op(op) {} 16298bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt 16308bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt /// \brief Construct an empty cast. 16318bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt CastExpr(StmtClass SC, EmptyShell Empty) 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(SC, Empty) { } 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CastKind getCastKind() const { return Kind; } 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setCastKind(CastKind K) { Kind = K; } 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *getCastKindName() const; 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getSubExpr() { return cast<Expr>(Op); } 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getSubExpr() const { return cast<Expr>(Op); } 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setSubExpr(Expr *E) { Op = E; } 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the cast subexpression as it was written in the source 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// code, looking through any implicit casts or other intermediate nodes 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// introduced by semantic analysis. 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getSubExprAsWritten(); 16478bae4138a0356709720a96f3e50b4d734e532c12Dmitry Shmidt const Expr *getSubExprAsWritten() const { 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return const_cast<CastExpr *>(this)->getSubExprAsWritten(); 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StmtClass SC = T->getStmtClass(); 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (SC >= CXXNamedCastExprClass && SC <= CXXFunctionalCastExprClass) 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return true; 1655c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 1656c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (SC >= ImplicitCastExprClass && SC <= CStyleCastExprClass) 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return true; 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return false; 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CastExpr *) { return true; } 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 1665c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt virtual child_iterator child_end(); 1666c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt}; 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// ImplicitCastExpr - Allows us to explicitly represent implicit type 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// conversions, which have no direct representation in the original 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// source code. For example: converting T[]->T*, void f()->void 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// (*f)(), float->double, short->int, etc. 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// In C, implicit casts always produce rvalues. However, in C++, an 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// implicit cast whose result is being bound to a reference will be 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// an lvalue. For example: 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// @code 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// class Base { }; 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// class Derived : public Base { }; 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// void f(Derived d) { 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// Base& b = d; // initializer is an ImplicitCastExpr to an lvalue of type Base 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// } 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// @endcode 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ImplicitCastExpr : public CastExpr { 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// LvalueCast - Whether this cast produces an lvalue. 16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool LvalueCast; 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1688d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtpublic: 1689d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, bool Lvalue) : 1690d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt CastExpr(ImplicitCastExprClass, ty, kind, op), LvalueCast(Lvalue) { } 1691d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 1692d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// \brief Construct an empty implicit cast. 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit ImplicitCastExpr(EmptyShell Shell) 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : CastExpr(ImplicitCastExprClass, Shell) { } 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getSubExpr()->getSourceRange(); 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isLvalueCast - Whether this cast produces an lvalue. 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isLvalueCast() const { return LvalueCast; } 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// setLvalueCast - Set whether this cast produces an lvalue. 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLvalueCast(bool Lvalue) { LvalueCast = Lvalue; } 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == ImplicitCastExprClass; 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ImplicitCastExpr *) { return true; } 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// ExplicitCastExpr - An explicit cast written in the source 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// code. 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// This class is effectively an abstract class, because it provides 17178da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// the basic representation of an explicitly-written cast without 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// specifying which kind of cast (C cast, functional cast, static 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// cast, etc.) was written; specific derived classes represent the 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// particular style of cast and its location information. 172104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/// 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// Unlike implicit casts, explicit cast nodes have two different 17238da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// types: the type that was written into the source code, and the 17248da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// actual type of the expression as determined by semantic 17258da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// analysis. These types may differ slightly. For example, in C++ one 17268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// can cast to a reference type, which indicates that the resulting 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// expression will be an lvalue. The reference type, however, will 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// not be used as the type of the expression. 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ExplicitCastExpr : public CastExpr { 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// TInfo - Source type info for the (written) type 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// this expression is casting to. 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TypeSourceInfo *TInfo; 173334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 173434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtprotected: 173534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt ExplicitCastExpr(StmtClass SC, QualType exprTy, CastKind kind, 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *op, TypeSourceInfo *writtenTy) 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : CastExpr(SC, exprTy, kind, op), TInfo(writtenTy) {} 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17398da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt /// \brief Construct an empty explicit cast. 17408da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt ExplicitCastExpr(StmtClass SC, EmptyShell Shell) 1741ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt : CastExpr(SC, Shell) { } 174234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 174334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtpublic: 174434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// getTypeInfoAsWritten - Returns the type source info for the type 174534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// that this expression is casting to. 17468da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; } 17478da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; } 174834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 174934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// getTypeAsWritten - Returns the type that this expression is 175034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// casting to, as written in the source code. 175134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt QualType getTypeAsWritten() const { return TInfo->getType(); } 175234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 17538da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt static bool classof(const Stmt *T) { 1754ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt StmtClass SC = T->getStmtClass(); 1755ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt if (SC >= CStyleCastExprClass && SC <= CStyleCastExprClass) 17568da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return true; 17578da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt if (SC >= CXXNamedCastExprClass && SC <= CXXFunctionalCastExprClass) 17588da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt return true; 17598da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return false; 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ExplicitCastExpr *) { return true; } 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// cast in C++ (C++ [expr.cast]), which uses the syntax 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// (Type)expr. For example: @c (int)f. 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass CStyleCastExpr : public ExplicitCastExpr { 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation LPLoc; // the location of the left paren 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation RPLoc; // the location of the right paren 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CStyleCastExpr(QualType exprTy, CastKind kind, Expr *op, 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TypeSourceInfo *writtenTy, 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation l, SourceLocation r) : 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ExplicitCastExpr(CStyleCastExprClass, exprTy, kind, op, writtenTy), 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LPLoc(l), RPLoc(r) {} 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Construct an empty C-style explicit cast. 177904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt explicit CStyleCastExpr(EmptyShell Shell) 178004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt : ExplicitCastExpr(CStyleCastExprClass, Shell) { } 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getLParenLoc() const { return LPLoc; } 17831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setLParenLoc(SourceLocation L) { LPLoc = L; } 17841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRParenLoc() const { return RPLoc; } 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRParenLoc(SourceLocation L) { RPLoc = L; } 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(LPLoc, getSubExpr()->getSourceRange().getEnd()); 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == CStyleCastExprClass; 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CStyleCastExpr *) { return true; } 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// \brief A builtin binary operation expression such as "x + y" or "x <= y". 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// This expression node kind describes a builtin binary operation, 1800a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt/// such as "x + y" for integer values "x" and "y". The operands will 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// already have been converted to appropriate types (e.g., by 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// performing promotions or conversions). 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// In C++, where operators may be overloaded, a different kind of 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// expression node (CXXOperatorCallExpr) is used to express the 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// invocation of an overloaded operator with operator syntax. Within 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// used to store an expression "x + y" depends on the subexpressions 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// for x and y. If neither x or y is type-dependent, and the "+" 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// operator resolves to a built-in operation, BinaryOperator will be 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// used to express the computation (x and y may still be 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// value-dependent). If either x or y is type-dependent, or if the 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// "+" resolves to an overloaded operator, CXXOperatorCallExpr will 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// be used to express the computation. 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass BinaryOperator : public Expr { 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum Opcode { 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Operators listed in order of precedence. 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Note that additions to this should also update the StmtVisitor class. 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt PtrMemD, PtrMemI, // [C++ 5.5] Pointer-to-member operators. 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mul, Div, Rem, // [C99 6.5.5] Multiplicative operators. 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Add, Sub, // [C99 6.5.6] Additive operators. 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Shl, Shr, // [C99 6.5.7] Bitwise shift operators. 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LT, GT, LE, GE, // [C99 6.5.8] Relational operators. 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EQ, NE, // [C99 6.5.9] Equality operators. 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt And, // [C99 6.5.10] Bitwise AND operator. 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Xor, // [C99 6.5.11] Bitwise XOR operator. 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Or, // [C99 6.5.12] Bitwise OR operator. 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LAnd, // [C99 6.5.13] Logical AND operator. 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LOr, // [C99 6.5.14] Logical OR operator. 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Assign, MulAssign,// [C99 6.5.16] Assignment operators. 1832a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt DivAssign, RemAssign, 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddAssign, SubAssign, 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ShlAssign, ShrAssign, 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AndAssign, XorAssign, 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt OrAssign, 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Comma // [C99 6.5.17] Comma operator. 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 1839c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidtprivate: 1840c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt enum { LHS, RHS, END_EXPR }; 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt* SubExprs[END_EXPR]; 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Opcode Opc; 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation OpLoc; 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 1847c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt SourceLocation opLoc) 1848c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt : Expr(BinaryOperatorClass, ResTy, 1849c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt lhs->isTypeDependent() || rhs->isTypeDependent(), 1850c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt lhs->isValueDependent() || rhs->isValueDependent()), 1851c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt Opc(opc), OpLoc(opLoc) { 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[LHS] = lhs; 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[RHS] = rhs; 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(!isCompoundAssignmentOp() && 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Use ArithAssignBinaryOperator for compound assignments"); 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Construct an empty binary operator. 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit BinaryOperator(EmptyShell Empty) 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(BinaryOperatorClass, Empty), Opc(Comma) { } 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getOperatorLoc() const { return OpLoc; } 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setOperatorLoc(SourceLocation L) { OpLoc = L; } 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Opcode getOpcode() const { return Opc; } 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setOpcode(Opcode O) { Opc = O; } 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLHS(Expr *E) { SubExprs[LHS] = E; } 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRHS(Expr *E) { SubExprs[RHS] = E; } 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd()); 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// corresponds to, e.g. "<<=". 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static const char *getOpcodeStr(Opcode Op); 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the binary opcode that corresponds to the given 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// overloaded operator. 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static Opcode getOverloadedOpcode(OverloadedOperatorKind OO); 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Retrieve the overloaded operator kind that corresponds to 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// the given binary opcode. 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// predicates to categorize the respective opcodes. 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isMultiplicativeOp() const { return Opc >= Mul && Opc <= Rem; } 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isAdditiveOp() const { return Opc == Add || Opc == Sub; } 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool isShiftOp(Opcode Opc) { return Opc == Shl || Opc == Shr; } 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isShiftOp() const { return isShiftOp(Opc); } 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool isBitwiseOp(Opcode Opc) { return Opc >= And && Opc <= Or; } 18961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isBitwiseOp() const { return isBitwiseOp(Opc); } 18971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool isRelationalOp(Opcode Opc) { return Opc >= LT && Opc <= GE; } 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isRelationalOp() const { return isRelationalOp(Opc); } 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool isEqualityOp(Opcode Opc) { return Opc == EQ || Opc == NE; } 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isEqualityOp() const { return isEqualityOp(Opc); } 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool isComparisonOp(Opcode Opc) { return Opc >= LT && Opc <= NE; } 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isComparisonOp() const { return isComparisonOp(Opc); } 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool isLogicalOp(Opcode Opc) { return Opc == LAnd || Opc == LOr; } 1908700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt bool isLogicalOp() const { return isLogicalOp(Opc); } 1909700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1910700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt bool isAssignmentOp() const { return Opc >= Assign && Opc <= OrAssign; } 1911700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt bool isCompoundAssignmentOp() const { return Opc > Assign && Opc <= OrAssign;} 1912700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt bool isShiftAssignOp() const { return Opc == ShlAssign || Opc == ShrAssign; } 1913700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1914700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt static bool classof(const Stmt *S) { 1915700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt return S->getStmtClass() == BinaryOperatorClass || 1916700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt S->getStmtClass() == CompoundAssignOperatorClass; 1917700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt } 1918700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt static bool classof(const BinaryOperator *) { return true; } 1919700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1920700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt // Iterators 1921700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt virtual child_iterator child_begin(); 1922700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt virtual child_iterator child_end(); 1923700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1924700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidtprotected: 1925700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 1926700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt SourceLocation opLoc, bool dead) 1927700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt : Expr(CompoundAssignOperatorClass, ResTy, 1928700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt lhs->isTypeDependent() || rhs->isTypeDependent(), 1929700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt lhs->isValueDependent() || rhs->isValueDependent()), 1930700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt Opc(opc), OpLoc(opLoc) { 1931700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt SubExprs[LHS] = lhs; 1932700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt SubExprs[RHS] = rhs; 1933700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt } 1934700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 1935700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt BinaryOperator(StmtClass SC, EmptyShell Empty) 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(SC, Empty), Opc(MulAssign) { } 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// CompoundAssignOperator - For compound assignments (e.g. +=), we keep 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// track of the type the operation is performed in. Due to the semantics of 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// these operators, the operands are promoted, the aritmetic performed, an 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// implicit conversion back to the result type done, then the assignment takes 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// place. This captures the intermediate type which the computation is done 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// in. 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass CompoundAssignOperator : public BinaryOperator { 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType ComputationLHSType; 19471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType ComputationResultType; 19481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 19491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, 19501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType ResType, QualType CompLHSType, 19511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType CompResultType, 19521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation OpLoc) 19531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : BinaryOperator(lhs, rhs, opc, ResType, OpLoc, true), 19541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ComputationLHSType(CompLHSType), 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ComputationResultType(CompResultType) { 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(isCompoundAssignmentOp() && 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Only should be used for compound assignments"); 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty compound assignment operator expression. 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit CompoundAssignOperator(EmptyShell Empty) 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : BinaryOperator(CompoundAssignOperatorClass, Empty) { } 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // The two computation types are the type the LHS is converted 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // to for the computation and the type of the result; the two are 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // distinct in a few cases (specifically, int+=ptr and ptr-=ptr). 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType getComputationLHSType() const { return ComputationLHSType; } 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setComputationLHSType(QualType T) { ComputationLHSType = T; } 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QualType getComputationResultType() const { return ComputationResultType; } 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setComputationResultType(QualType T) { ComputationResultType = T; } 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const CompoundAssignOperator *) { return true; } 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *S) { 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return S->getStmtClass() == CompoundAssignOperatorClass; 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// ConditionalOperator - The ?: operator. Note that LHS may be null when the 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// GNU "missing LHS" extension is in use. 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ConditionalOperator : public Expr { 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum { COND, LHS, RHS, END_EXPR }; 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation QuestionLoc, ColonLoc; 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs, 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation CLoc, Expr *rhs, QualType t) 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(ConditionalOperatorClass, t, 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // FIXME: the type of the conditional operator doesn't 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // depend on the type of the conditional, but the standard 199234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // seems to imply that it could. File a bug! 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ((lhs && lhs->isTypeDependent()) || (rhs && rhs->isTypeDependent())), 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (cond->isValueDependent() || 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (lhs && lhs->isValueDependent()) || 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (rhs && rhs->isValueDependent()))), 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QuestionLoc(QLoc), 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ColonLoc(CLoc) { 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[COND] = cond; 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[LHS] = lhs; 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[RHS] = rhs; 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty conditional operator. 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit ConditionalOperator(EmptyShell Empty) 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(ConditionalOperatorClass, Empty) { } 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // getCond - Return the expression representing the condition for 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // the ?: operator. 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setCond(Expr *E) { SubExprs[COND] = E; } 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // getTrueExpr - Return the subexpression representing the value of the ?: 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // expression if the condition evaluates to true. In most cases this value 201534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // will be the same as getLHS() except a GCC extension allows the left 201634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // subexpression to be omitted, and instead of the condition be returned. 201734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // e.g: x ?: y is shorthand for x ? x : y, except that the expression "x" 201834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // is only evaluated once. 201934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt Expr *getTrueExpr() const { 202034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return cast<Expr>(SubExprs[LHS] ? SubExprs[LHS] : SubExprs[COND]); 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // getTrueExpr - Return the subexpression representing the value of the ?: 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // expression if the condition evaluates to false. This is the same as getRHS. 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); } 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getLHS() const { return cast_or_null<Expr>(SubExprs[LHS]); } 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLHS(Expr *E) { SubExprs[LHS] = E; } 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRHS(Expr *E) { SubExprs[RHS] = E; } 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getQuestionLoc() const { return QuestionLoc; } 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setQuestionLoc(SourceLocation L) { QuestionLoc = L; } 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getColonLoc() const { return ColonLoc; } 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setColonLoc(SourceLocation L) { ColonLoc = L; } 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd()); 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == ConditionalOperatorClass; 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ConditionalOperator *) { return true; } 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 20511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// AddrLabelExpr - The GNU address of label extension, representing &&label. 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass AddrLabelExpr : public Expr { 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation AmpAmpLoc, LabelLoc; 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LabelStmt *Label; 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelStmt *L, 20581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType t) 20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(AddrLabelExprClass, t, false, false), 20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {} 20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty address of a label expression. 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit AddrLabelExpr(EmptyShell Empty) 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(AddrLabelExprClass, Empty) { } 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; } 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; } 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getLabelLoc() const { return LabelLoc; } 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLabelLoc(SourceLocation L) { LabelLoc = L; } 20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(AmpAmpLoc, LabelLoc); 20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LabelStmt *getLabel() const { return Label; } 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLabel(LabelStmt *S) { Label = S; } 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == AddrLabelExprClass; 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const AddrLabelExpr *) { return true; } 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). 20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// The StmtExpr contains a single CompoundStmt node, which it evaluates and 20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// takes the value of the last subexpression. 20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass StmtExpr : public Expr { 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt *SubStmt; 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation LParenLoc, RParenLoc; 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // FIXME: Does type-dependence need to be computed differently? 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StmtExpr(CompoundStmt *substmt, QualType T, 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation lp, SourceLocation rp) : 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr(StmtExprClass, T, T->isDependentType(), false), 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { } 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty statement expression. 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { } 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); } 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); } 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setSubStmt(CompoundStmt *S) { SubStmt = S; } 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(LParenLoc, RParenLoc); 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getLParenLoc() const { return LParenLoc; } 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setLParenLoc(SourceLocation L) { LParenLoc = L; } 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == StmtExprClass; 21191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const StmtExpr *) { return true; } 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 21251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 21261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// TypesCompatibleExpr - GNU builtin-in function __builtin_types_compatible_p. 21281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// This AST node represents a function that returns 1 if two *types* (not 21291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// expressions) are compatible. The result of this built-in function can be 21301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// used in integer constant expressions. 21311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass TypesCompatibleExpr : public Expr { 21321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType Type1; 21331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType Type2; 21341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation BuiltinLoc, RParenLoc; 21351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 21361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt TypesCompatibleExpr(QualType ReturnType, SourceLocation BLoc, 21371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType t1, QualType t2, SourceLocation RP) : 21381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr(TypesCompatibleExprClass, ReturnType, false, false), 21391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Type1(t1), Type2(t2), BuiltinLoc(BLoc), RParenLoc(RP) {} 21401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Build an empty __builtin_type_compatible_p expression. 21421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit TypesCompatibleExpr(EmptyShell Empty) 21431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(TypesCompatibleExprClass, Empty) { } 21441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType getArgType1() const { return Type1; } 21461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setArgType1(QualType T) { Type1 = T; } 21471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType getArgType2() const { return Type2; } 21481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setArgType2(QualType T) { Type2 = T; } 21491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 21511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 21521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 21541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 21551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { 21571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(BuiltinLoc, RParenLoc); 21581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 21591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 21601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == TypesCompatibleExprClass; 21611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 21621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const TypesCompatibleExpr *) { return true; } 21631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 21651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 21661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 21671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 21681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// ShuffleVectorExpr - clang-specific builtin-in function 21701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// __builtin_shufflevector. 21711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// This AST node represents a operator that does a constant 21721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// shuffle, similar to LLVM's shufflevector instruction. It takes 21731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// two vectors and a variable number of constant indices, 21741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// and returns the appropriately shuffled vector. 21751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass ShuffleVectorExpr : public Expr { 21761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation BuiltinLoc, RParenLoc; 21771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // SubExprs - the list of values passed to the __builtin_shufflevector 21791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // function. The first two are vectors, and the rest are constant 21801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // indices. The number of values in this list is always 21811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // 2+the number of indices in the vector type. 21821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt **SubExprs; 21831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned NumExprs; 21841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtprotected: 21861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual void DoDestroy(ASTContext &C); 21871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 21891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // FIXME: Can a shufflevector be value-dependent? Does type-dependence need 21901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // to be computed differently? 21911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr, 21921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt QualType Type, SourceLocation BLoc, 21931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation RP) : 21941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr(ShuffleVectorExprClass, Type, Type->isDependentType(), false), 21951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr) { 21961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SubExprs = new (C) Stmt*[nexpr]; 21981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (unsigned i = 0; i < nexpr; i++) 21991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SubExprs[i] = args[i]; 22001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty vector-shuffle expression. 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit ShuffleVectorExpr(EmptyShell Empty) 22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(ShuffleVectorExprClass, Empty), SubExprs(0) { } 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(BuiltinLoc, RParenLoc); 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == ShuffleVectorExprClass; 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ShuffleVectorExpr *) { return true; } 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ~ShuffleVectorExpr() {} 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getNumSubExprs - Return the size of the SubExprs array. This includes the 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// constant expression, the actual arguments passed in, and the function 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// pointers. 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getNumSubExprs() const { return NumExprs; } 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getExpr - Return the Expr at the specified index. 22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getExpr(unsigned Index) { 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert((Index < NumExprs) && "Arg access out of range!"); 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(SubExprs[Index]); 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getExpr(unsigned Index) const { 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert((Index < NumExprs) && "Arg access out of range!"); 22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cast<Expr>(SubExprs[Index]); 22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setExprs(ASTContext &C, Expr ** Exprs, unsigned NumExprs); 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned getShuffleMaskIdx(ASTContext &Ctx, unsigned N) { 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert((N < NumExprs - 2) && "Shuffle idx out of range!"); 22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getExpr(N+2)->EvaluateAsInt(Ctx).getZExtValue(); 22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// ChooseExpr - GNU builtin-in function __builtin_choose_expr. 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// This AST node is similar to the conditional operator (?:) in C, with 22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// the following exceptions: 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// - the test expression must be a integer constant expression. 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// - the expression returned acts like the chosen subexpression in every 22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// visible way: the type is the same as that of the chosen subexpression, 22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// and all predicates (whether it's an l-value, whether it's an integer 22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// constant expression, etc.) return the same result as for the chosen 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// sub-expression. 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ChooseExpr : public Expr { 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum { COND, LHS, RHS, END_EXPR }; 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation BuiltinLoc, RParenLoc; 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t, 22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation RP, bool TypeDependent, bool ValueDependent) 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(ChooseExprClass, t, TypeDependent, ValueDependent), 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BuiltinLoc(BLoc), RParenLoc(RP) { 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[COND] = cond; 22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[LHS] = lhs; 22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SubExprs[RHS] = rhs; 22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty __builtin_choose_expr. 22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { } 22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// isConditionTrue - Return whether the condition is true (i.e. not 22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// equal to zero). 22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool isConditionTrue(ASTContext &C) const; 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getChosenSubExpr - Return the subexpression chosen according to the 22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// condition. 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Expr *getChosenSubExpr(ASTContext &C) const { 2282c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt return isConditionTrue(C) ? getLHS() : getRHS(); 22831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2284c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt 2285c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 2286c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt void setCond(Expr *E) { SubExprs[COND] = E; } 2287c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 2288c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt void setLHS(Expr *E) { SubExprs[LHS] = E; } 2289c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 2290c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt void setRHS(Expr *E) { SubExprs[RHS] = E; } 2291c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt 2292c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 2293c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 2294c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt 22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(BuiltinLoc, RParenLoc); 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == ChooseExprClass; 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ChooseExpr *) { return true; } 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// GNUNullExpr - Implements the GNU __null extension, which is a name 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// for a null pointer constant that has integral type (e.g., int or 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// long) and is the same size and alignment as a pointer. The __null 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// extension is typically only used by system headers, which define 2315c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt/// NULL as __null in C++ rather than using 0 (which is an integer 23161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// that may not match the size of a pointer). 2317c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidtclass GNUNullExpr : public Expr { 2318c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt /// TokenLoc - The location of the __null keyword. 2319c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt SourceLocation TokenLoc; 2320c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt GNUNullExpr(QualType Ty, SourceLocation Loc) 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(GNUNullExprClass, Ty, false, false), TokenLoc(Loc) { } 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Build an empty GNU __null expression. 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { } 23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getTokenLocation - The location of the __null token. 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation getTokenLocation() const { return TokenLoc; } 23301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setTokenLocation(SourceLocation L) { TokenLoc = L; } 23311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 23331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(TokenLoc); 23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 23361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == GNUNullExprClass; 23371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const GNUNullExpr *) { return true; } 23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 23411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 23421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 23431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 23441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// VAArgExpr, used for the builtin function __builtin_va_start. 23461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass VAArgExpr : public Expr { 23471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt *Val; 23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation BuiltinLoc, RParenLoc; 23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 23501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt VAArgExpr(SourceLocation BLoc, Expr* e, QualType t, SourceLocation RPLoc) 23511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(VAArgExprClass, t, t->isDependentType(), false), 23521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Val(e), 23531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt BuiltinLoc(BLoc), 23541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt RParenLoc(RPLoc) { } 23551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Create an empty __builtin_va_start expression. 23571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit VAArgExpr(EmptyShell Empty) : Expr(VAArgExprClass, Empty) { } 23581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Expr *getSubExpr() const { return cast<Expr>(Val); } 23601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getSubExpr() { return cast<Expr>(Val); } 23611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setSubExpr(Expr *E) { Val = E; } 23621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 23641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 23651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 23671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setRParenLoc(SourceLocation L) { RParenLoc = L; } 23681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual SourceRange getSourceRange() const { 23701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceRange(BuiltinLoc, RParenLoc); 23711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const Stmt *T) { 23731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return T->getStmtClass() == VAArgExprClass; 23741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static bool classof(const VAArgExpr *) { return true; } 23761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Iterators 23781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_begin(); 23791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual child_iterator child_end(); 23801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 23811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// @brief Describes an C or C++ initializer list. 23831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 23841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// InitListExpr describes an initializer list, which can be used to 23851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// initialize objects of different types, including 2386d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/// struct/class/union types, arrays, and vectors. For example: 2387d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/// 23881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// @code 23891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// struct foo x = { 1, { 2, 3 } }; 23901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// @endcode 23911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 23921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// Prior to semantic analysis, an initializer list will represent the 23931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// initializer list as written by the user, but will have the 23941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// placeholder type "void". This initializer list is called the 23951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// syntactic form of the initializer, and may contain C99 designated 23961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// initializers (represented as DesignatedInitExprs), initializations 23971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// of subobject members without explicit braces, and so on. Clients 23981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// interested in the original syntax of the initializer list should 23991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// use the syntactic form of the initializer list. 24001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 24011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// After semantic analysis, the initializer list will represent the 24021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// semantic form of the initializer, where the initializations of all 24031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// subobjects are made explicit with nested InitListExpr nodes and 24041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// C99 designators have been eliminated by placing the designated 24051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// initializations into the subobject they initialize. Additionally, 24061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// any "holes" in the initialization, where no initializer has been 24071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// specified for a particular subobject, will be replaced with 24081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// implicitly-generated ImplicitValueInitExpr expressions that 24091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// value-initialize the subobjects. Note, however, that the 24101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// initializer lists may still have fewer initializers than there are 24111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// elements to initialize within the object. 24121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 2413d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/// Given the semantic form of the initializer list, one can retrieve 2414d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt/// the original syntactic form of that initializer list (if it 24151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// exists) using getSyntacticForm(). Since many initializer lists 24161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// have the same syntactic and semantic forms, getSyntacticForm() may 24171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// return NULL, indicating that the current initializer list also 24181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// serves as its syntactic form. 24191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass InitListExpr : public Expr { 24201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // FIXME: Eliminate this vector in favor of ASTContext allocation 24211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt std::vector<Stmt *> InitExprs; 24221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation LBraceLoc, RBraceLoc; 24231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 24241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// Contains the initializer list that describes the syntactic form 24251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// written in the source code. 2426d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt InitListExpr *SyntacticForm; 2427d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2428d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// If this initializer list initializes a union, specifies which 2429d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// field within the union will be initialized. 2430d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt FieldDecl *UnionFieldInit; 2431d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2432d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// Whether this initializer list originally had a GNU array-range 2433d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// designator in it. This is a temporary marker used by CodeGen. 2434d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt bool HadArrayRangeDesignator; 2435d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2436d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtpublic: 2437d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits, 2438d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt SourceLocation rbraceloc); 2439d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2440d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// \brief Build an empty initializer list. 2441d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt explicit InitListExpr(EmptyShell Empty) : Expr(InitListExprClass, Empty) { } 2442d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2443d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt unsigned getNumInits() const { return InitExprs.size(); } 2444d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2445d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt const Expr* getInit(unsigned Init) const { 2446d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt assert(Init < getNumInits() && "Initializer access out of range!"); 2447d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return cast_or_null<Expr>(InitExprs[Init]); 2448d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 2449d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2450d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt Expr* getInit(unsigned Init) { 2451d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt assert(Init < getNumInits() && "Initializer access out of range!"); 2452d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return cast_or_null<Expr>(InitExprs[Init]); 2453d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 2454d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2455d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void setInit(unsigned Init, Expr *expr) { 2456d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt assert(Init < getNumInits() && "Initializer access out of range!"); 2457d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt InitExprs[Init] = expr; 2458d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt } 2459d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2460d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt /// \brief Reserve space for some number of initializers. 2461d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt void reserveInits(unsigned NumInits); 2462d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 24635393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt /// @brief Specify the number of initializers 24645393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt /// 24655393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt /// If there are more than @p NumInits initializers, the remaining 24665393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt /// initializers will be destroyed. If there are fewer than @p 24675393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt /// NumInits initializers, NULL expressions will be added for the 24685393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt /// unknown initializers. 24695393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt void resizeInits(ASTContext &Context, unsigned NumInits); 2470f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2471f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// @brief Updates the initializer at index @p Init with the new 2472f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// expression @p expr, and returns the old expression at that 2473f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// location. 2474f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// 2475f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// When @p Init is out of range for this initializer list, the 2476f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// initializer list will be extended with NULL expressions to 2477f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// accomodate the new entry. 2478f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt Expr *updateInit(unsigned Init, Expr *expr); 2479f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2480f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// \brief If this initializes a union, specifies which field in the 2481f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// union to initialize. 2482f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// 2483f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// Typically, this field is the first named field within the 2484f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// union. However, a designated initializer can specify the 2485f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// initialization of a different field within the union. 2486f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt FieldDecl *getInitializedFieldInUnion() { return UnionFieldInit; } 2487f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt void setInitializedFieldInUnion(FieldDecl *FD) { UnionFieldInit = FD; } 2488f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2489f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt // Explicit InitListExpr's originate from source code (and have valid source 2490f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt // locations). Implicit InitListExpr's are created by the semantic analyzer. 2491f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt bool isExplicit() { 2492f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return LBraceLoc.isValid() && RBraceLoc.isValid(); 2493f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt } 2494f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2495f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt SourceLocation getLBraceLoc() const { return LBraceLoc; } 2496f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } 2497f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt SourceLocation getRBraceLoc() const { return RBraceLoc; } 2498f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; } 2499f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2500f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// @brief Retrieve the initializer list that describes the 2501f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// syntactic form of the initializer. 2502f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// 2503f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt /// 2504f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt InitListExpr *getSyntacticForm() const { return SyntacticForm; } 2505f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt void setSyntacticForm(InitListExpr *Init) { SyntacticForm = Init; } 2506f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2507ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt bool hadArrayRangeDesignator() const { return HadArrayRangeDesignator; } 2508ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt void sawArrayRangeDesignator(bool ARD = true) { 2509ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt HadArrayRangeDesignator = ARD; 2510ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt } 2511ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt 2512ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt virtual SourceRange getSourceRange() const { 2513ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt return SourceRange(LBraceLoc, RBraceLoc); 2514ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt } 2515ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt static bool classof(const Stmt *T) { 2516ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt return T->getStmtClass() == InitListExprClass; 2517ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt } 2518ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt static bool classof(const InitListExpr *) { return true; } 2519ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt 2520ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt // Iterators 2521ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt virtual child_iterator child_begin(); 2522ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt virtual child_iterator child_end(); 2523ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt 2524ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt typedef std::vector<Stmt *>::iterator iterator; 2525ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt typedef std::vector<Stmt *>::reverse_iterator reverse_iterator; 2526ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt 2527ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt iterator begin() { return InitExprs.begin(); } 2528ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt iterator end() { return InitExprs.end(); } 2529ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt reverse_iterator rbegin() { return InitExprs.rbegin(); } 2530ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt reverse_iterator rend() { return InitExprs.rend(); } 2531ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt}; 2532ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt 2533ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// @brief Represents a C99 designated initializer expression. 2534ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// 2535ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// A designated initializer expression (C99 6.7.8) contains one or 2536ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// more designators (which can be field designators, array 2537ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// designators, or GNU array-range designators) followed by an 2538ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// expression that initializes the field or element(s) that the 2539ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// designators refer to. For example, given: 2540ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// 2541ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// @code 2542ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// struct point { 2543ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt/// double x; 25441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// double y; 25451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// }; 25461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 25471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// @endcode 25481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 25491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// The InitListExpr contains three DesignatedInitExprs, the first of 25501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// which covers @c [2].y=1.0. This DesignatedInitExpr will have two 25511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// designators, one array designator for @c [2] followed by one field 25521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// designator for @c .y. The initalization expression will be 1.0. 25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtclass DesignatedInitExpr : public Expr { 25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtpublic: 25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Forward declaration of the Designator class. 25561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt class Designator; 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtprivate: 25591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// The location of the '=' or ':' prior to the actual initializer 25601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// expression. 25611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation EqualOrColonLoc; 2562a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 2563a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt /// Whether this designated initializer used the GNU deprecated 25641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// syntax rather than the C99 '=' syntax. 2565a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bool GNUSyntax : 1; 2566a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 256734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// The number of designators in this initializer expression. 256834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned NumDesignators : 15; 256934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 25701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief The designators in this designated initialization 25711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// expression. 25721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Designator *Designators; 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// The number of subexpressions of this initializer expression, 25751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// which contains both the initializer and any additional 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// expressions used by array and array-range designators. 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned NumSubExprs : 16; 25781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2580700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt DesignatedInitExpr(ASTContext &C, QualType Ty, unsigned NumDesignators, 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Designator *Designators, 25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation EqualOrColonLoc, bool GNUSyntax, 2583700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt Expr **IndexExprs, unsigned NumIndexExprs, 25841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *Init); 25851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2586700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt explicit DesignatedInitExpr(unsigned NumSubExprs) 25871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(DesignatedInitExprClass, EmptyShell()), 25881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt NumDesignators(0), Designators(0), NumSubExprs(NumSubExprs) { } 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2590700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidtprotected: 2591700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt virtual void DoDestroy(ASTContext &C); 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void DestroyDesignators(ASTContext &C); 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// A field designator, e.g., ".x". 25971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct FieldDesignator { 2598700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt /// Refers to the field that is being initialized. The low bit 2599700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt /// of this field determines whether this is actually a pointer 26001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When 26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// initially constructed, a field designator will store an 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// IdentifierInfo*. After semantic analysis has resolved that 2603700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt /// name, the field designator will instead store a FieldDecl*. 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt uintptr_t NameOrField; 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// The location of the '.' in the designated initializer. 26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned DotLoc; 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// The location of the field name in the designated initializer. 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned FieldLoc; 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ArrayOrRangeDesignator { 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// Location of the first index expression within the designated 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// initializer expression's list of subexpressions. 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Index; 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// The location of the '[' starting the array range designator. 26198da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt unsigned LBracketLoc; 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// The location of the ellipsis separating the start and end 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// indices. Only valid for GNU array-range designators. 262204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt unsigned EllipsisLoc; 262304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// The location of the ']' terminating the array range designator. 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned RBracketLoc; 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// @brief Represents a single C99 designator. 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @todo This class is infuriatingly similar to clang::Designator, 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// but minor differences (storing indices vs. storing pointers) 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// keep us from reusing it. Try harder, later, to rectify these 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// differences. 263304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt class Designator { 263404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// @brief The kind of designator this describes. 263504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt enum { 263604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt FieldDesignator, 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ArrayDesignator, 26381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ArrayRangeDesignator 2639c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt } Kind; 2640c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union { 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// A field designator, e.g., ".x". 2643a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt struct FieldDesignator Field; 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ArrayOrRangeDesignator ArrayOrRange; 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt friend class DesignatedInitExpr; 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt public: 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Designator() {} 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @brief Initializes a field designator. 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc, 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation FieldLoc) 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Kind(FieldDesignator) { 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01; 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Field.DotLoc = DotLoc.getRawEncoding(); 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Field.FieldLoc = FieldLoc.getRawEncoding(); 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @brief Initializes an array designator. 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Designator(unsigned Index, SourceLocation LBracketLoc, 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation RBracketLoc) 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Kind(ArrayDesignator) { 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ArrayOrRange.Index = Index; 26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ArrayOrRange.EllipsisLoc = SourceLocation().getRawEncoding(); 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// @brief Initializes a GNU array-range designator. 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Designator(unsigned Index, SourceLocation LBracketLoc, 26731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation EllipsisLoc, SourceLocation RBracketLoc) 26741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Kind(ArrayRangeDesignator) { 26751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ArrayOrRange.Index = Index; 26761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 26771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ArrayOrRange.EllipsisLoc = EllipsisLoc.getRawEncoding(); 26781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 26791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 26801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool isFieldDesignator() const { return Kind == FieldDesignator; } 2682d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt bool isArrayDesignator() const { return Kind == ArrayDesignator; } 2683d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; } 2684d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 2685f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt IdentifierInfo * getFieldName(); 2686f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 2687f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt FieldDecl *getField() { 2688700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt assert(Kind == FieldDesignator && "Only valid on a field designator"); 2689700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt if (Field.NameOrField & 0x01) 2690700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt return 0; 2691ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt else 2692ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt return reinterpret_cast<FieldDecl *>(Field.NameOrField); 2693ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt } 26945393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt 26955393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt void setField(FieldDecl *FD) { 26965393a0f77c5281735888bd9dcf8d8abeb5961461Dmitry Shmidt assert(Kind == FieldDesignator && "Only valid on a field designator"); 26971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Field.NameOrField = reinterpret_cast<uintptr_t>(FD); 2698700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt } 2699700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 27001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getDotLoc() const { 27011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt assert(Kind == FieldDesignator && "Only valid on a field designator"); 27021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceLocation::getFromRawEncoding(Field.DotLoc); 27031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getFieldLoc() const { 27061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt assert(Kind == FieldDesignator && "Only valid on a field designator"); 27071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceLocation::getFromRawEncoding(Field.FieldLoc); 27081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2710a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt SourceLocation getLBracketLoc() const { 2711a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 27121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "Only valid on an array or array-range designator"); 27131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return SourceLocation::getFromRawEncoding(ArrayOrRange.LBracketLoc); 27141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 271634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation getRBracketLoc() const { 2717a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 2718a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt "Only valid on an array or array-range designator"); 271934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return SourceLocation::getFromRawEncoding(ArrayOrRange.RBracketLoc); 272034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 272134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 272234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation getEllipsisLoc() const { 272334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt assert(Kind == ArrayRangeDesignator && 272434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt "Only valid on an array-range designator"); 272534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return SourceLocation::getFromRawEncoding(ArrayOrRange.EllipsisLoc); 272634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 272734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 272834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned getFirstExprIndex() const { 272934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 273034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt "Only valid on an array or array-range designator"); 273134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return ArrayOrRange.Index; 273234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt } 273334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 273434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation getStartLocation() const { 27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (Kind == FieldDesignator) 273634af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc(); 273734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt else 273834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt return getLBracketLoc(); 27391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt }; 27411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static DesignatedInitExpr *Create(ASTContext &C, Designator *Designators, 27431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned NumDesignators, 27441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr **IndexExprs, unsigned NumIndexExprs, 27451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation EqualOrColonLoc, 27461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt bool GNUSyntax, Expr *Init); 27471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt static DesignatedInitExpr *CreateEmpty(ASTContext &C, unsigned NumIndexExprs); 27491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 275004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt /// @brief Returns the number of designators in this initializer. 27511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned size() const { return NumDesignators; } 2752a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 275334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt // Iterator access to the designators. 275434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt typedef Designator* designators_iterator; 27551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt designators_iterator designators_begin() { return Designators; } 27561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt designators_iterator designators_end() { 27571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return Designators + NumDesignators; 27581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Designator *getDesignator(unsigned Idx) { return &designators_begin()[Idx]; } 276134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 276234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void setDesignators(ASTContext &C, const Designator *Desigs, 276334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned NumDesigs); 276434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 27651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getArrayIndex(const Designator& D); 276604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt Expr *getArrayRangeStart(const Designator& D); 276704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt Expr *getArrayRangeEnd(const Designator& D); 2768a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 276934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// @brief Retrieve the location of the '=' that precedes the 277034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// initializer value itself, if present. 277134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; } 277234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; } 2773a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 2774a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt /// @brief Determines whether this designated initializer used the 2775a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt /// deprecated GNU syntax for designated initializers. 2776a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt bool usesGNUSyntax() const { return GNUSyntax; } 27771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setGNUSyntax(bool GNU) { GNUSyntax = GNU; } 27781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// @brief Retrieve the initializer value. 27801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getInit() const { 27811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin()); 27821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setInit(Expr *init) { 27851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *child_begin() = init; 27861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 27871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 27881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Retrieve the total number of subexpressions in this 27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// designated initializer expression, including the actual 27901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// initialized value and any expressions that occur within array 27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// and array-range designators. 279234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt unsigned getNumSubExprs() const { return NumSubExprs; } 279334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 279434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt Expr *getSubExpr(unsigned Idx) { 279534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt assert(Idx < NumSubExprs && "Subscript out of range"); 27961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char* Ptr = static_cast<char*>(static_cast<void *>(this)); 27971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Ptr += sizeof(DesignatedInitExpr); 27981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx]; 27998da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt } 28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setSubExpr(unsigned Idx, Expr *E) { 280204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt assert(Idx < NumSubExprs && "Subscript out of range"); 280304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char* Ptr = static_cast<char*>(static_cast<void *>(this)); 28041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Ptr += sizeof(DesignatedInitExpr); 28051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx] = E; 28061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 28071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Replaces the designator at index @p Idx with the series 28091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// of designators in [First, Last). 28101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void ExpandDesignator(ASTContext &C, unsigned Idx, const Designator *First, 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const Designator *Last); 28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const; 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == DesignatedInitExprClass; 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const DesignatedInitExpr *) { return true; } 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 28241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// \brief Represents an implicitly-generated value initialization of 28268da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt/// an object of a given type. 28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// Implicit value initializations occur within semantic initializer 28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// list expressions (InitListExpr) as placeholders for subobject 28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// initializations not explicitly specified by the user. 28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// \see InitListExpr 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ImplicitValueInitExpr : public Expr { 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit ImplicitValueInitExpr(QualType ty) 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(ImplicitValueInitExprClass, ty, false, false) { } 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// \brief Construct an empty implicit value initialization. 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt explicit ImplicitValueInitExpr(EmptyShell Empty) 28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : Expr(ImplicitValueInitExprClass, Empty) { } 28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const Stmt *T) { 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return T->getStmtClass() == ImplicitValueInitExprClass; 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool classof(const ImplicitValueInitExpr *) { return true; } 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SourceRange(); 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Iterators 28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_begin(); 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual child_iterator child_end(); 28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ParenListExpr : public Expr { 28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Stmt **Exprs; 28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned NumExprs; 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation LParenLoc, RParenLoc; 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtprotected: 28631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt virtual void DoDestroy(ASTContext& C); 28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ParenListExpr(ASTContext& C, SourceLocation lparenloc, Expr **exprs, 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned numexprs, SourceLocation rparenloc); 28682f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28692f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt ~ParenListExpr() {} 28702f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28712f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// \brief Build an empty paren list. 28722f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt //explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { } 28732f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28742f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt unsigned getNumExprs() const { return NumExprs; } 28752f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28762f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt const Expr* getExpr(unsigned Init) const { 28772f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt assert(Init < getNumExprs() && "Initializer access out of range!"); 28782f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return cast_or_null<Expr>(Exprs[Init]); 28792f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 28802f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28812f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt Expr* getExpr(unsigned Init) { 28822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt assert(Init < getNumExprs() && "Initializer access out of range!"); 28832f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return cast_or_null<Expr>(Exprs[Init]); 28842f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 28852f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28862f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt Expr **getExprs() { return reinterpret_cast<Expr **>(Exprs); } 28872f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28882f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt SourceLocation getLParenLoc() const { return LParenLoc; } 28892f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt SourceLocation getRParenLoc() const { return RParenLoc; } 28902f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28912f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual SourceRange getSourceRange() const { 28922f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return SourceRange(LParenLoc, RParenLoc); 28932f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 28942f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const Stmt *T) { 28952f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return T->getStmtClass() == ParenListExprClass; 28962f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 28972f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const ParenListExpr *) { return true; } 28982f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 28992f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // Iterators 29002f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_begin(); 29012f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_end(); 29022f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt}; 29032f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2905444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt//===----------------------------------------------------------------------===// 29061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt// Clang Extensions 29071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt//===----------------------------------------------------------------------===// 2908c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt 2909c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt 29101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// ExtVectorElementExpr - This represents access to specific elements of a 29111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// vector, and may occur on the left hand side or right hand side. For example 29121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector. 29131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// 29141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/// Note that the base may have either vector or pointer to vector type, just 29152f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt/// like a struct field reference. 29162f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt/// 29172f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidtclass ExtVectorElementExpr : public Expr { 29182f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt Stmt *Base; 29192f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt IdentifierInfo *Accessor; 29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SourceLocation AccessorLoc; 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ExtVectorElementExpr(QualType ty, Expr *base, IdentifierInfo &accessor, 29231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation loc) 29241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ExtVectorElementExprClass, ty, base->isTypeDependent(), 29251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt base->isValueDependent()), 29261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Base(base), Accessor(&accessor), AccessorLoc(loc) {} 29271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Build an empty vector element expression. 29291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit ExtVectorElementExpr(EmptyShell Empty) 29301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt : Expr(ExtVectorElementExprClass, Empty) { } 29311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const Expr *getBase() const { return cast<Expr>(Base); } 29331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Expr *getBase() { return cast<Expr>(Base); } 29341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setBase(Expr *E) { Base = E; } 29351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt IdentifierInfo &getAccessor() const { return *Accessor; } 29371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setAccessor(IdentifierInfo *II) { Accessor = II; } 29381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getAccessorLoc() const { return AccessorLoc; } 29402f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt void setAccessorLoc(SourceLocation L) { AccessorLoc = L; } 29412f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /// getNumElements - Get the number of components being selected. 29432f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt unsigned getNumElements() const; 29442f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29452f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// containsDuplicateElements - Return true if any element access is 29462f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// repeated. 29472f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool containsDuplicateElements() const; 29482f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29492f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// getEncodedElementAccess - Encode the elements accessed into an llvm 29502f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// aggregate Constant of ConstantInt(s). 29512f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt void getEncodedElementAccess(llvm::SmallVectorImpl<unsigned> &Elts) const; 29522f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29532f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual SourceRange getSourceRange() const { 2954700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt return SourceRange(getBase()->getLocStart(), AccessorLoc); 2955700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt } 2956700a137ab366edc72e371da68ba187b4717ee660Dmitry Shmidt 295734af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// isArrow - Return true if the base expression is a pointer to vector, 295834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt /// return false if the base expression is a vector. 295934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt bool isArrow() const; 296034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt 29612f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const Stmt *T) { 29622f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return T->getStmtClass() == ExtVectorElementExprClass; 29632f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 29642f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const ExtVectorElementExpr *) { return true; } 29652f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29662f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // Iterators 29672f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_begin(); 29682f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_end(); 29692f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt}; 29702f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29712f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29722f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt/// BlockExpr - Adaptor class for mixing a BlockDecl with expressions. 29732f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt/// ^{ statement-body } or ^(int arg1, float arg2){ statement-body } 29742f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidtclass BlockExpr : public Expr { 29752f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidtprotected: 29762f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt BlockDecl *TheBlock; 29772f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool HasBlockDeclRefExprs; 29782f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidtpublic: 29792f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt BlockExpr(BlockDecl *BD, QualType ty, bool hasBlockDeclRefExprs) 29802f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt : Expr(BlockExprClass, ty, ty->isDependentType(), false), 29812f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt TheBlock(BD), HasBlockDeclRefExprs(hasBlockDeclRefExprs) {} 29822f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt /// \brief Build an empty block expression. 29841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { } 29851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const BlockDecl *getBlockDecl() const { return TheBlock; } 29871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt BlockDecl *getBlockDecl() { return TheBlock; } 29881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt void setBlockDecl(BlockDecl *BD) { TheBlock = BD; } 2989ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt 29901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt // Convenience functions for probing the underlying BlockDecl. 29911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt SourceLocation getCaretLocation() const; 29921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const Stmt *getBody() const; 29931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt Stmt *getBody(); 29941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual SourceRange getSourceRange() const { 29962f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return SourceRange(getCaretLocation(), getBody()->getLocEnd()); 29972f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 29982f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 29992f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// getFunctionType - Return the underlying function type for this block. 30002f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt const FunctionType *getFunctionType() const; 30012f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30022f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// hasBlockDeclRefExprs - Return true iff the block has BlockDeclRefExpr 3003ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt /// inside of the block that reference values outside the block. 3004ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt bool hasBlockDeclRefExprs() const { return HasBlockDeclRefExprs; } 3005ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt void setHasBlockDeclRefExprs(bool BDRE) { HasBlockDeclRefExprs = BDRE; } 30062f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30072f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const Stmt *T) { 30082f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return T->getStmtClass() == BlockExprClass; 30092f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 30102f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const BlockExpr *) { return true; } 30112f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30122f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // Iterators 30132f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_begin(); 30142f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_end(); 30152f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt}; 30162f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30172f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt/// BlockDeclRefExpr - A reference to a declared variable, function, 30182f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt/// enum, etc. 30192f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidtclass BlockDeclRefExpr : public Expr { 30202f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt ValueDecl *D; 30212f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt SourceLocation Loc; 30222f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool IsByRef : 1; 30232f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool ConstQualAdded : 1; 30242f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidtpublic: 30252f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // FIXME: Fix type/value dependence! 30262f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt BlockDeclRefExpr(ValueDecl *d, QualType t, SourceLocation l, bool ByRef, 30272f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool constAdded = false) 30282f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt : Expr(BlockDeclRefExprClass, t, false, false), D(d), Loc(l), IsByRef(ByRef), 3029c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt ConstQualAdded(constAdded) {} 3030c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt 30312f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // \brief Build an empty reference to a declared variable in a 30322f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // block. 30332f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt explicit BlockDeclRefExpr(EmptyShell Empty) 30342f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt : Expr(BlockDeclRefExprClass, Empty) { } 30352f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30362f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt ValueDecl *getDecl() { return D; } 30372f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt const ValueDecl *getDecl() const { return D; } 30382f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt void setDecl(ValueDecl *VD) { D = VD; } 30392f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30402f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt SourceLocation getLocation() const { return Loc; } 30412f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt void setLocation(SourceLocation L) { Loc = L; } 30422f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30432f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 30442f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30452f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool isByRef() const { return IsByRef; } 30462f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt void setByRef(bool BR) { IsByRef = BR; } 30472f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30482f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt bool isConstQualAdded() const { return ConstQualAdded; } 30492f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt void setConstQualAdded(bool C) { ConstQualAdded = C; } 30502f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30512f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const Stmt *T) { 30522f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt return T->getStmtClass() == BlockDeclRefExprClass; 30532f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt } 30542f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt static bool classof(const BlockDeclRefExpr *) { return true; } 30552f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30562f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt // Iterators 30572f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_begin(); 30582f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt virtual child_iterator child_end(); 30592f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt}; 30602f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30612f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt#ifndef NDEBUG 30622f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// \brief The number of times we have dynamically checked for an 30632f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// Objective-C-specific expression node. 30642f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt extern llvm::Statistic objc_expr_checks; 30652f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30662f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// \brief The number of times we have dynamically checked for a 30672f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt /// C++-specific expression node. 30682f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt extern llvm::Statistic cxx_expr_checks; 30692f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt#endif 30702f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt} // end namespace clang 30712f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt 30722f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt#endif 30732f023193a0fd630eb82ce6381b80911ad5a3462fDmitry Shmidt