Expr.cpp revision 3e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===--- Expr.cpp - Expression AST Node Implementation --------------------===// 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// The LLVM Compiler Infrastructure 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file is distributed under the University of Illinois Open Source 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// License. See LICENSE.TXT for details. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===// 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file implements the Expr class and subclasses. 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===// 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/Expr.h" 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/ExprCXX.h" 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/APValue.h" 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/ASTContext.h" 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/DeclObjC.h" 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/DeclCXX.h" 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/DeclTemplate.h" 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/RecordLayout.h" 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/StmtVisitor.h" 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Lex/LiteralSupport.h" 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Lex/Lexer.h" 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Basic/Builtins.h" 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Basic/SourceManager.h" 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Basic/TargetInfo.h" 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "llvm/Support/ErrorHandling.h" 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "llvm/Support/raw_ostream.h" 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <algorithm> 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectusing namespace clang; 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// isKnownToHaveBooleanValue - Return true if this is an integer expression 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// that is known to return 0 or 1. This happens for _Bool/bool expressions 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// but also int expressions which are produced by things like comparisons in 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// C. 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isKnownToHaveBooleanValue() const { 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const Expr *E = IgnoreParens(); 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // If this value has _Bool type, it is obvious 0/1. 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (E->getType()->isBooleanType()) return true; 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // If this is a non-scalar-integer type, we don't care enough to try. 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!E->getType()->isIntegralOrEnumerationType()) return false; 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) { 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (UO->getOpcode()) { 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case UO_Plus: 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return UO->getSubExpr()->isKnownToHaveBooleanValue(); 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Only look through implicit casts. If the user writes 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // '(int) (a && b)' treat it as an arbitrary int. 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return CE->getSubExpr()->isKnownToHaveBooleanValue(); 58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { 60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (BO->getOpcode()) { 61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: return false; 62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_LT: // Relational operators. 63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_GT: 64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_LE: 65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_GE: 66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_EQ: // Equality operators. 67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_NE: 68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_LAnd: // AND operator. 69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_LOr: // Logical OR operator. 70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return true; 71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_And: // Bitwise AND operator. 73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_Xor: // Bitwise XOR operator. 74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_Or: // Bitwise OR operator. 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Handle things like (x==2)|(y==12). 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return BO->getLHS()->isKnownToHaveBooleanValue() && 77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BO->getRHS()->isKnownToHaveBooleanValue(); 78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_Comma: 80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BO_Assign: 81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return BO->getRHS()->isKnownToHaveBooleanValue(); 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) 86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CO->getTrueExpr()->isKnownToHaveBooleanValue() && 87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CO->getFalseExpr()->isKnownToHaveBooleanValue(); 88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// Amusing macro metaprogramming hack: check whether a class provides 93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// a more specific implementation of getExprLoc(). 94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromnamespace { 95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /// This implementation is used when a class provides a custom 96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /// implementation of getExprLoc. 97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom template <class E, class T> 98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SourceLocation getExprLocImpl(const Expr *expr, 99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SourceLocation (T::*v)() const) { 100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return static_cast<const E*>(expr)->getExprLoc(); 101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /// This implementation is used when a class doesn't provide 104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /// a custom implementation of getExprLoc. Overload resolution 105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /// should pick it over the implementation above because it's 106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /// more specialized according to function template partial ordering. 107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom template <class E> 108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SourceLocation getExprLocImpl(const Expr *expr, 109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SourceLocation (Expr::*v)() const) { 110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return static_cast<const E*>(expr)->getSourceRange().getBegin(); 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSourceLocation Expr::getExprLoc() const { 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (getStmtClass()) { 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case Stmt::NoStmtClass: llvm_unreachable("statement without class"); 117392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#define ABSTRACT_STMT(type) 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define STMT(type, base) \ 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case Stmt::type##Class: llvm_unreachable(#type " is not an Expr"); break; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define EXPR(type, base) \ 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc); 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/StmtNodes.inc" 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project llvm_unreachable("unknown statement kind"); 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return SourceLocation(); 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===// 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Primary Expressions. 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===// 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ExplicitTemplateArgumentList::initializeFrom( 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const TemplateArgumentListInfo &Info) { 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LAngleLoc = Info.getLAngleLoc(); 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project RAngleLoc = Info.getRAngleLoc(); 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NumTemplateArgs = Info.size(); 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project TemplateArgumentLoc *ArgBuffer = getTemplateArgs(); 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (unsigned i = 0; i != NumTemplateArgs; ++i) 140392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]); 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ExplicitTemplateArgumentList::initializeFrom( 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const TemplateArgumentListInfo &Info, 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool &Dependent, 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool &ContainsUnexpandedParameterPack) { 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LAngleLoc = Info.getLAngleLoc(); 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project RAngleLoc = Info.getRAngleLoc(); 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NumTemplateArgs = Info.size(); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project TemplateArgumentLoc *ArgBuffer = getTemplateArgs(); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (unsigned i = 0; i != NumTemplateArgs; ++i) { 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Dependent = Dependent || Info[i].getArgument().isDependent(); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ContainsUnexpandedParameterPack 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project = ContainsUnexpandedParameterPack || 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Info[i].getArgument().containsUnexpandedParameterPack(); 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]); 159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid ExplicitTemplateArgumentList::copyInto( 163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom TemplateArgumentListInfo &Info) const { 164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Info.setLAngleLoc(LAngleLoc); 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Info.setRAngleLoc(RAngleLoc); 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (unsigned I = 0; I != NumTemplateArgs; ++I) 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Info.addArgument(getTemplateArgs()[I]); 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstd::size_t ExplicitTemplateArgumentList::sizeFor(unsigned NumTemplateArgs) { 171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return sizeof(ExplicitTemplateArgumentList) + 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(TemplateArgumentLoc) * NumTemplateArgs; 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstd::size_t ExplicitTemplateArgumentList::sizeFor( 176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const TemplateArgumentListInfo &Info) { 177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return sizeFor(Info.size()); 178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// \brief Compute the type- and value-dependence of a declaration reference 181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// based on the declaration being referenced. 182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void computeDeclRefDependence(NamedDecl *D, QualType T, 183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool &TypeDependent, 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool &ValueDependent) { 185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom TypeDependent = false; 186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDependent = false; 187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (TD) C++ [temp.dep.expr]p3: 190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // An id-expression is type-dependent if it contains: 191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // and 193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (VD) C++ [temp.dep.constexpr]p2: 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // An identifier is value-dependent if it is: 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (TD) - an identifier that was declared with dependent type 198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (VD) - a name declared with a dependent type, 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (T->isDependentType()) { 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom TypeDependent = true; 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDependent = true; 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 204392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 205392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // (TD) - a conversion-function-id that specifies a dependent type 206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (D->getDeclName().getNameKind() 207392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom == DeclarationName::CXXConversionFunctionName && 208392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom D->getDeclName().getCXXNameType()->isDependentType()) { 209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom TypeDependent = true; 210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ValueDependent = true; 211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // (VD) - the name of a non-type template parameter, 214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isa<NonTypeTemplateParmDecl>(D)) { 215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ValueDependent = true; 216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // (VD) - a constant with integral or enumeration type and is 220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // initialized with an expression that is value-dependent. 221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (VarDecl *Var = dyn_cast<VarDecl>(D)) { 222392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Var->getType()->isIntegralOrEnumerationType() && 223392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Var->getType().getCVRQualifiers() == Qualifiers::Const) { 224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const Expr *Init = Var->getAnyInitializer()) 225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Init->isValueDependent()) 226392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ValueDependent = true; 227392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 228392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 229392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // (VD) - FIXME: Missing from the standard: 230392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // - a member function or a static data member of the current 231392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // instantiation 232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (Var->isStaticDataMember() && 233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Var->getDeclContext()->isDependentContext()) 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDependent = true; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (VD) - FIXME: Missing from the standard: 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // - a member function or a static data member of the current 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // instantiation 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) { 243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDependent = true; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid DeclRefExpr::computeDependence() { 249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool TypeDependent = false; 250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool ValueDependent = false; 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom computeDeclRefDependence(getDecl(), getType(), TypeDependent, ValueDependent); 252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (TD) C++ [temp.dep.expr]p3: 254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // An id-expression is type-dependent if it contains: 255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // 256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // and 257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // 258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // (VD) C++ [temp.dep.constexpr]p2: 259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // An identifier is value-dependent if it is: 260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!TypeDependent && !ValueDependent && 261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom hasExplicitTemplateArgs() && 262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom TemplateSpecializationType::anyDependentTemplateArguments( 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom getTemplateArgs(), 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom getNumTemplateArgs())) { 265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom TypeDependent = true; 266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDependent = true; 267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ExprBits.TypeDependent = TypeDependent; 270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ExprBits.ValueDependent = ValueDependent; 271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Is the declaration a parameter pack? 273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (getDecl()->isParameterPack()) 274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ExprBits.ContainsUnexpandedParameterPack = true; 275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDecl *D, SourceLocation NameLoc, 279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const TemplateArgumentListInfo *TemplateArgs, 280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom QualType T, ExprValueKind VK) 281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false), 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DecoratedD(D, 283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (QualifierLoc? HasQualifierFlag : 0) | 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)), 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Loc(NameLoc) { 286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (QualifierLoc) { 287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NameQualifier *NQ = getNameQualifier(); 288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NQ->QualifierLoc = QualifierLoc; 289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (TemplateArgs) 292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom getExplicitTemplateArgs().initializeFrom(*TemplateArgs); 293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom computeDependence(); 295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ValueDecl *D, const DeclarationNameInfo &NameInfo, 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const TemplateArgumentListInfo *TemplateArgs, 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom QualType T, ExprValueKind VK) 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false), 302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DecoratedD(D, 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (QualifierLoc? HasQualifierFlag : 0) | 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)), 305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) { 306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (QualifierLoc) { 307392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NameQualifier *NQ = getNameQualifier(); 308392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NQ->QualifierLoc = QualifierLoc; 309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 310392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (TemplateArgs) 312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom getExplicitTemplateArgs().initializeFrom(*TemplateArgs); 313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom computeDependence(); 315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromDeclRefExpr *DeclRefExpr::Create(ASTContext &Context, 318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NestedNameSpecifierLoc QualifierLoc, 319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ValueDecl *D, 320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation NameLoc, 321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom QualType T, 322392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 323392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const TemplateArgumentListInfo *TemplateArgs) { 324392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return Create(Context, QualifierLoc, D, 325392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom DeclarationNameInfo(D->getDeclName(), NameLoc), 326392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom T, VK, TemplateArgs); 327392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 328392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 329392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromDeclRefExpr *DeclRefExpr::Create(ASTContext &Context, 330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NestedNameSpecifierLoc QualifierLoc, 331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ValueDecl *D, 332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const DeclarationNameInfo &NameInfo, 333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom QualType T, 334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const TemplateArgumentListInfo *TemplateArgs) { 336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom std::size_t Size = sizeof(DeclRefExpr); 337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (QualifierLoc != 0) 338392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Size += sizeof(NameQualifier); 339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (TemplateArgs) 341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs); 342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>()); 344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return new (Mem) DeclRefExpr(QualifierLoc, D, NameInfo, TemplateArgs, T, VK); 345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 346392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromDeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context, 348392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool HasQualifier, 349392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool HasExplicitTemplateArgs, 350392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned NumTemplateArgs) { 351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom std::size_t Size = sizeof(DeclRefExpr); 352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (HasQualifier) 353392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Size += sizeof(NameQualifier); 354392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 355392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (HasExplicitTemplateArgs) 356392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 358392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>()); 359392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return new (Mem) DeclRefExpr(EmptyShell()); 360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceRange DeclRefExpr::getSourceRange() const { 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceRange R = getNameInfo().getSourceRange(); 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hasQualifier()) 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project R.setBegin(getQualifierLoc().getBeginLoc()); 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hasExplicitTemplateArgs()) 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project R.setEnd(getRAngleLoc()); 36898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return R; 36998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 37098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 37198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom// FIXME: Maybe this should use DeclPrinter with a special "print predefined 37298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom// expr" policy instead. 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstd::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) { 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASTContext &Context = CurrentDecl->getASTContext(); 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) { 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual) 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return FD->getNameAsString(); 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project llvm::SmallString<256> Name; 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project llvm::raw_svector_ostream Out(Name); 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (MD->isVirtual() && IT != PrettyFunctionNoVirtual) 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Out << "virtual "; 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (MD->isStatic()) 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Out << "static "; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PrintingPolicy Policy(Context.getLangOptions()); 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom std::string Proto = FD->getQualifiedNameAsString(Policy); 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const FunctionType *AFT = FD->getType()->getAs<FunctionType>(); 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const FunctionProtoType *FT = 0; 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (FD->hasWrittenPrototype()) 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FT = dyn_cast<FunctionProtoType>(AFT); 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Proto += "("; 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (FT) { 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project llvm::raw_string_ostream POut(Proto); 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) { 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i) POut << ", "; 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project std::string Param; 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy); 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project POut << Param; 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 40998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (FT->isVariadic()) { 410392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FD->getNumParams()) POut << ", "; 41198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom POut << "..."; 41298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 41398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 41498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Proto += ")"; 41598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 41698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 41798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers()); 41898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (ThisQuals.hasConst()) 41998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Proto += " const"; 42098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (ThisQuals.hasVolatile()) 42198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Proto += " volatile"; 42298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 42398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 42498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD)) 42598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom AFT->getResultType().getAsStringInternal(Proto, Policy); 42698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 42798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Out << Proto; 42898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 42998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Out.flush(); 43098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return Name.str().str(); 43198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 43298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) { 43398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom llvm::SmallString<256> Name; 434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom llvm::raw_svector_ostream Out(Name); 435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << (MD->isInstanceMethod() ? '-' : '+'); 436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << '['; 437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // For incorrect code, there might not be an ObjCInterfaceDecl. Do 439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // a null check to avoid a crash. 440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const ObjCInterfaceDecl *ID = MD->getClassInterface()) 441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << ID; 442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const ObjCCategoryImplDecl *CID = 444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) 445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << '(' << CID << ')'; 446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << ' '; 448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << MD->getSelector().getAsString(); 449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out << ']'; 450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Out.flush(); 452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return Name.str().str(); 453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) { 455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string. 456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "top level"; 457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ""; 459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) { 462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (hasAllocation()) 463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom C.Deallocate(pVal); 464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BitWidth = Val.getBitWidth(); 466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned NumWords = Val.getNumWords(); 467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const uint64_t* Words = Val.getRawData(); 468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (NumWords > 1) { 469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pVal = new (C) uint64_t[NumWords]; 470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom std::copy(Words, Words + NumWords, pVal); 471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } else if (NumWords == 1) 472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom VAL = Words[0]; 473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom VAL = 0; 475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral * 478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral::Create(ASTContext &C, const llvm::APInt &V, 479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom QualType type, SourceLocation l) { 480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return new (C) IntegerLiteral(C, V, type, l); 481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral * 484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral::Create(ASTContext &C, EmptyShell Empty) { 485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return new (C) IntegerLiteral(Empty); 486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral * 489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V, 490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool isexact, QualType Type, SourceLocation L) { 491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return new (C) FloatingLiteral(C, V, isexact, Type, L); 492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral * 495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral::Create(ASTContext &C, EmptyShell Empty) { 496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return new (C) FloatingLiteral(Empty); 497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// getValueAsApproximateDouble - This returns the value as an inaccurate 500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// double. Note that this may cause loss of precision, but is useful for 501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// debugging dumps, etc. 502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromdouble FloatingLiteral::getValueAsApproximateDouble() const { 503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom llvm::APFloat V = getValue(); 504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool ignored; 505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, 506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &ignored); 507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return V.convertToDouble(); 508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromStringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData, 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned ByteLength, bool Wide, 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool Pascal, QualType Ty, 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const SourceLocation *Loc, 51498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom unsigned NumStrs) { 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Allocate enough space for the StringLiteral plus an array of locations for 516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // any concatenated string tokens. 517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *Mem = C.Allocate(sizeof(StringLiteral)+ 518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(SourceLocation)*(NumStrs-1), 519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom llvm::alignOf<StringLiteral>()); 520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom StringLiteral *SL = new (Mem) StringLiteral(Ty); 521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // OPTIMIZE: could allocate this appended to the StringLiteral. 523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *AStrData = new (C, 1) char[ByteLength]; 524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(AStrData, StrData, ByteLength); 525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SL->StrData = AStrData; 526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SL->ByteLength = ByteLength; 527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SL->IsWide = Wide; 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SL->IsPascal = Pascal; 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SL->TokLocs[0] = Loc[0]; 530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SL->NumConcatenated = NumStrs; 531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (NumStrs != 1) 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1)); 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return SL; 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectStringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) { 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *Mem = C.Allocate(sizeof(StringLiteral)+ 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(SourceLocation)*(NumStrs-1), 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project llvm::alignOf<StringLiteral>()); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project StringLiteral *SL = new (Mem) StringLiteral(QualType()); 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SL->StrData = 0; 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SL->ByteLength = 0; 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SL->NumConcatenated = NumStrs; 545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return SL; 546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 547ed2ff7a80ea0924de67b50fde0f0b3272e2f89a8Brian Carlstrom 548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid StringLiteral::setString(ASTContext &C, llvm::StringRef Str) { 549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom char *AStrData = new (C, 1) char[Str.size()]; 550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom memcpy(AStrData, Str.data(), Str.size()); 551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom StrData = AStrData; 552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ByteLength = Str.size(); 553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// getLocationOfByte - Return a source location that points to the specified 556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// byte of this string literal. 557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// 558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// Strings are amazingly complex. They can be formed from multiple tokens and 559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// can have escape sequences in them in addition to the usual trigraph and 560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// escaped newline business. This routine handles this complexity. 561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// 562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSourceLocation StringLiteral:: 563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromgetLocationOfByte(unsigned ByteNo, const SourceManager &SM, 564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const LangOptions &Features, const TargetInfo &Target) const { 565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom assert(!isWide() && "This doesn't work for wide strings yet"); 566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Loop over all of the tokens in this string until we find the one that 568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // contains the byte we're looking for. 569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned TokNo = 0; 570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom while (1) { 571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom assert(TokNo < getNumConcatenated() && "Invalid byte number!"); 572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SourceLocation StrTokLoc = getStrTokenLoc(TokNo); 573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Get the spelling of the string so that we can get the data that makes up 575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // the string literal, not the identifier for the macro it is potentially 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // expanded through. 57798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc); 57898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Re-lex the token to get its length and original spelling. 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc); 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool Invalid = false; 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project llvm::StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid); 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (Invalid) 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return StrTokSpellingLoc; 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *StrData = Buffer.data()+LocInfo.second; 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Create a langops struct and enable trigraphs. This is sufficient for 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // relexing tokens. 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LangOptions LangOpts; 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LangOpts.Trigraphs = true; 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Create a lexer starting at the beginning of this token. 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Lexer TheLexer(StrTokSpellingLoc, Features, Buffer.begin(), StrData, 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Buffer.end()); 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Token TheTok; 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project TheLexer.LexFromRawLexer(TheTok); 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Use the StringLiteralParser to compute the length of the string in bytes. 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project StringLiteralParser SLP(&TheTok, 1, SM, Features, Target); 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned TokNumBytes = SLP.GetStringLength(); 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // If the byte is in this token, return the location of the byte. 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ByteNo < TokNumBytes || 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) { 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo); 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Now that we know the offset of the token in the spelling, use the 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // preprocessor to get the offset in the original source. 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features); 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Move to the next string token. 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ++TokNo; 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ByteNo -= TokNumBytes; 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// corresponds to, e.g. "sizeof" or "[pre]++". 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *UnaryOperator::getOpcodeStr(Opcode Op) { 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (Op) { 625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: assert(0 && "Unknown unary operator"); 626392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_PostInc: return "++"; 627392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_PostDec: return "--"; 628392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_PreInc: return "++"; 629392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_PreDec: return "--"; 630392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_AddrOf: return "&"; 631392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Deref: return "*"; 632392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Plus: return "+"; 633392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Minus: return "-"; 634392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Not: return "~"; 635392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_LNot: return "!"; 636392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Real: return "__real"; 637392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Imag: return "__imag"; 638392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Extension: return "__extension__"; 639392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 640bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen} 641bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 642bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian MonsenUnaryOperatorKind 643bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian MonsenUnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) { 644bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen switch (OO) { 645bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen default: assert(false && "No unary operator for overloaded function"); 646bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case OO_PlusPlus: return Postfix ? UO_PostInc : UO_PreInc; 647bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec; 648bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case OO_Amp: return UO_AddrOf; 649bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case OO_Star: return UO_Deref; 650bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case OO_Plus: return UO_Plus; 651bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case OO_Minus: return UO_Minus; 652392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case OO_Tilde: return UO_Not; 653392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case OO_Exclaim: return UO_LNot; 654392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 655392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 656392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 657392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) { 658392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom switch (Opc) { 659392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_PostInc: case UO_PreInc: return OO_PlusPlus; 660392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_PostDec: case UO_PreDec: return OO_MinusMinus; 661392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_AddrOf: return OO_Amp; 662392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Deref: return OO_Star; 663392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Plus: return OO_Plus; 664392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Minus: return OO_Minus; 665392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Not: return OO_Tilde; 666392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_LNot: return OO_Exclaim; 667392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom default: return OO_None; 668392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 669392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 670392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===// 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Postfix Operators. 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===// 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs, 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr **args, unsigned numargs, QualType t, ExprValueKind VK, 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceLocation rparenloc) 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project : Expr(SC, t, VK, OK_Ordinary, 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fn->isTypeDependent(), 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fn->isValueDependent(), 682bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen fn->containsUnexpandedParameterPack()), 683bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen NumArgs(numargs) { 684bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SubExprs = new (C) Stmt*[numargs+PREARGS_START+NumPreArgs]; 68698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom SubExprs[FN] = fn; 68798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom for (unsigned i = 0; i != numargs; ++i) { 68898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (args[i]->isTypeDependent()) 68998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ExprBits.TypeDependent = true; 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (args[i]->isValueDependent()) 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprBits.ValueDependent = true; 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (args[i]->containsUnexpandedParameterPack()) 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprBits.ContainsUnexpandedParameterPack = true; 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExprs[i+PREARGS_START+NumPreArgs] = args[i]; 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CallExprBits.NumPreArgs = NumPreArgs; 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project RParenLoc = rparenloc; 70098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 70198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 70298d58bb80c64b02a33662f0ea80351d4a1535267Brian CarlstromCallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, 70398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom QualType t, ExprValueKind VK, SourceLocation rparenloc) 70498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom : Expr(CallExprClass, t, VK, OK_Ordinary, 70598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom fn->isTypeDependent(), 70698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom fn->isValueDependent(), 70798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom fn->containsUnexpandedParameterPack()), 70898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom NumArgs(numargs) { 70998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 71098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom SubExprs = new (C) Stmt*[numargs+PREARGS_START]; 71198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom SubExprs[FN] = fn; 71298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom for (unsigned i = 0; i != numargs; ++i) { 71398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (args[i]->isTypeDependent()) 71498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ExprBits.TypeDependent = true; 71598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (args[i]->isValueDependent()) 71698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ExprBits.ValueDependent = true; 71798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (args[i]->containsUnexpandedParameterPack()) 71898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ExprBits.ContainsUnexpandedParameterPack = true; 71998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 72098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom SubExprs[i+PREARGS_START] = args[i]; 72198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 72298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 72398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom CallExprBits.NumPreArgs = 0; 724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RParenLoc = rparenloc; 725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty) 728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom : Expr(SC, Empty), SubExprs(0), NumArgs(0) { 729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // FIXME: Why do we allocate this? 730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExprs = new (C) Stmt*[PREARGS_START]; 731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CallExprBits.NumPreArgs = 0; 732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCallExpr::CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs, 735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EmptyShell Empty) 736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom : Expr(SC, Empty), SubExprs(0), NumArgs(0) { 737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // FIXME: Why do we allocate this? 738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExprs = new (C) Stmt*[PREARGS_START+NumPreArgs]; 739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CallExprBits.NumPreArgs = NumPreArgs; 740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDecl *CallExpr::getCalleeDecl() { 743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Expr *CEE = getCallee()->IgnoreParenCasts(); 744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If we're calling a dereference, look at the pointer instead. 745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) { 746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (BO->isPtrMemOp()) 747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CEE = BO->getRHS()->IgnoreParenCasts(); 748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) { 749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (UO->getOpcode() == UO_Deref) 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CEE = UO->getSubExpr()->IgnoreParenCasts(); 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) 753221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return DRE->getDecl(); 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE)) 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ME->getMemberDecl(); 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectFunctionDecl *CallExpr::getDirectCallee() { 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// setNumArgs - This changes the number of arguments present in this call. 765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// Any orphaned expressions are deleted by this, and any new operands are set 766221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// to null. 767221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) { 768221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // No change, just return. 769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (NumArgs == getNumArgs()) return; 770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If shrinking # arguments, just delete the extras and forgot them. 772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (NumArgs < getNumArgs()) { 773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom this->NumArgs = NumArgs; 774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Otherwise, we are growing the # arguments. New an bigger argument array. 778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned NumPreArgs = getNumPreArgs(); 779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Stmt **NewSubExprs = new (C) Stmt*[NumArgs+PREARGS_START+NumPreArgs]; 780221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Copy over args. 781221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (unsigned i = 0; i != getNumArgs()+PREARGS_START+NumPreArgs; ++i) 782221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NewSubExprs[i] = SubExprs[i]; 783392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Null out new args. 784392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned i = getNumArgs()+PREARGS_START+NumPreArgs; 785392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom i != NumArgs+PREARGS_START+NumPreArgs; ++i) 786392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NewSubExprs[i] = 0; 787392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 788392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (SubExprs) C.Deallocate(SubExprs); 789392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SubExprs = NewSubExprs; 790392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom this->NumArgs = NumArgs; 791392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 792392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 793392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 794392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// not, return 0. 795392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromunsigned CallExpr::isBuiltinCall(const ASTContext &Context) const { 796392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // All simple function calls (e.g. func()) are implicitly cast to pointer to 797392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // function. As a result, we try and obtain the DeclRefExpr from the 798392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // ImplicitCastExpr. 799392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee()); 800392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()). 801392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 802392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()); 804221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!DRE) 805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 808221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!FDecl) 809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 810221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!FDecl->getIdentifier()) 812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 813221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 814221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return FDecl->getBuiltinID(); 815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromQualType CallExpr::getCallReturnType() const { 818392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom QualType CalleeType = getCallee()->getType(); 819392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>()) 820392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom CalleeType = FnTypePtr->getPointeeType(); 821392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>()) 822392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom CalleeType = BPT->getPointeeType(); 823392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (const MemberPointerType *MPT 824392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom = CalleeType->getAs<MemberPointerType>()) 825392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom CalleeType = MPT->getPointeeType(); 826392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 827392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const FunctionType *FnType = CalleeType->getAs<FunctionType>(); 828392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return FnType->getResultType(); 829392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 830392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 831392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceRange CallExpr::getSourceRange() const { 832392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isa<CXXOperatorCallExpr>(this)) 833392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cast<CXXOperatorCallExpr>(this)->getSourceRange(); 834392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 835392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation begin = getCallee()->getLocStart(); 836bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (begin.isInvalid() && getNumArgs() > 0) 837bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen begin = getArg(0)->getLocStart(); 838bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen SourceLocation end = getRParenLoc(); 839bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (end.isInvalid() && getNumArgs() > 0) 840bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen end = getArg(getNumArgs() - 1)->getLocEnd(); 841bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return SourceRange(begin, end); 842bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen} 843bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 844bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian MonsenOffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type, 845bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen SourceLocation OperatorLoc, 846bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen TypeSourceInfo *tsi, 847bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen OffsetOfNode* compsPtr, unsigned numComps, 848bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen Expr** exprsPtr, unsigned numExprs, 849bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen SourceLocation RParenLoc) { 850bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen void *Mem = C.Allocate(sizeof(OffsetOfExpr) + 851bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen sizeof(OffsetOfNode) * numComps + 852bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen sizeof(Expr*) * numExprs); 853bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 854bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps, 855bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen exprsPtr, numExprs, RParenLoc); 856bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen} 857bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C, 859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned numComps, unsigned numExprs) { 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *Mem = C.Allocate(sizeof(OffsetOfExpr) + 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(OffsetOfNode) * numComps + 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(Expr*) * numExprs); 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return new (Mem) OffsetOfExpr(numComps, numExprs); 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type, 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceLocation OperatorLoc, TypeSourceInfo *tsi, 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OffsetOfNode* compsPtr, unsigned numComps, 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr** exprsPtr, unsigned numExprs, 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceLocation RParenLoc) 87198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary, 872392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /*TypeDependent=*/false, 87398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom /*ValueDependent=*/tsi->getType()->isDependentType(), 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tsi->getType()->containsUnexpandedParameterPack()), 875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi), 876392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NumComps(numComps), NumExprs(numExprs) 877392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{ 878392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(unsigned i = 0; i < numComps; ++i) { 879392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom setComponent(i, compsPtr[i]); 880392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 881392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 882392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for(unsigned i = 0; i < numExprs; ++i) { 883392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent()) 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprBits.ValueDependent = true; 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (exprsPtr[i]->containsUnexpandedParameterPack()) 88698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom ExprBits.ContainsUnexpandedParameterPack = true; 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setIndexExpr(i, exprsPtr[i]); 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 89098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const { 893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert(getKind() == Field || getKind() == Identifier); 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (getKind() == Field) 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return getField()->getIdentifier(); 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask); 89898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 899221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromMemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow, 901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NestedNameSpecifierLoc QualifierLoc, 902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ValueDecl *memberdecl, 903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DeclAccessPair founddecl, 904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DeclarationNameInfo nameinfo, 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const TemplateArgumentListInfo *targs, 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project QualType ty, 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprValueKind vk, 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprObjectKind ok) { 909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project std::size_t Size = sizeof(MemberExpr); 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool hasQualOrFound = (QualifierLoc || 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project founddecl.getDecl() != memberdecl || 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project founddecl.getAccess() != memberdecl->getAccess()); 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hasQualOrFound) 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Size += sizeof(MemberNameQualifier); 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (targs) 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Size += ExplicitTemplateArgumentList::sizeFor(*targs); 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>()); 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo, 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ty, vk, ok); 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hasQualOrFound) { 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // FIXME: Wrong. We should be looking at the member declaration we found. 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) { 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E->setValueDependent(true); 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E->setTypeDependent(true); 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E->HasQualifierOrFoundDecl = true; 931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemberNameQualifier *NQ = E->getMemberQualifier(); 933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NQ->QualifierLoc = QualifierLoc; 934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NQ->FoundDecl = founddecl; 935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (targs) { 938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E->HasExplicitTemplateArgumentList = true; 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E->getExplicitTemplateArgs().initializeFrom(*targs); 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return E; 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSourceRange MemberExpr::getSourceRange() const { 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceLocation StartLoc; 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (isImplicitAccess()) { 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hasQualifier()) 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project StartLoc = getQualifierLoc().getBeginLoc(); 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project StartLoc = MemberLoc; 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else { 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // FIXME: We don't want this to happen. Rather, we should be able to 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // detect all kinds of implicit accesses more cleanly. 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project StartLoc = getBase()->getLocStart(); 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (StartLoc.isInvalid()) 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project StartLoc = MemberLoc; 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceLocation EndLoc = 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HasExplicitTemplateArgumentList? getRAngleLoc() 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project : getMemberNameInfo().getEndLoc(); 96343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return SourceRange(StartLoc, EndLoc); 96543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom} 96643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom 96743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromconst char *CastExpr::getCastKindName() const { 96843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom switch (getCastKind()) { 96943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_Dependent: 97043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return "Dependent"; 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_BitCast: 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "BitCast"; 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_LValueBitCast: 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "LValueBitCast"; 97543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_LValueToRValue: 97643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return "LValueToRValue"; 97743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_GetObjCProperty: 97843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return "GetObjCProperty"; 97943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_NoOp: 980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "NoOp"; 981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_BaseToDerived: 982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "BaseToDerived"; 983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_DerivedToBase: 984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "DerivedToBase"; 985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_UncheckedDerivedToBase: 986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "UncheckedDerivedToBase"; 987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_Dynamic: 988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "Dynamic"; 989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_ToUnion: 990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "ToUnion"; 991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_ArrayToPointerDecay: 99243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return "ArrayToPointerDecay"; 99343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_FunctionToPointerDecay: 994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "FunctionToPointerDecay"; 995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_NullToMemberPointer: 996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "NullToMemberPointer"; 997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_NullToPointer: 998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "NullToPointer"; 999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_BaseToDerivedMemberPointer: 1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "BaseToDerivedMemberPointer"; 1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_DerivedToBaseMemberPointer: 1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "DerivedToBaseMemberPointer"; 1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_UserDefinedConversion: 1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "UserDefinedConversion"; 1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_ConstructorConversion: 1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "ConstructorConversion"; 1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_IntegralToPointer: 1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "IntegralToPointer"; 1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_PointerToIntegral: 1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return "PointerToIntegral"; 1011392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_PointerToBoolean: 1012392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "PointerToBoolean"; 1013392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_ToVoid: 1014392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "ToVoid"; 1015392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_VectorSplat: 1016392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "VectorSplat"; 1017392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_IntegralCast: 1018392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "IntegralCast"; 1019392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_IntegralToBoolean: 1020392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "IntegralToBoolean"; 1021392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_IntegralToFloating: 1022392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "IntegralToFloating"; 1023392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_FloatingToIntegral: 1024392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "FloatingToIntegral"; 1025392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_FloatingCast: 1026392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "FloatingCast"; 1027392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_FloatingToBoolean: 1028392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "FloatingToBoolean"; 1029392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_MemberPointerToBoolean: 1030392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "MemberPointerToBoolean"; 1031392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_AnyPointerToObjCPointerCast: 1032392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "AnyPointerToObjCPointerCast"; 1033392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_AnyPointerToBlockPointerCast: 1034392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return "AnyPointerToBlockPointerCast"; 1035392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CK_ObjCObjectLValueCast: 1036221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "ObjCObjectLValueCast"; 1037221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CK_FloatingRealToComplex: 1038221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "FloatingRealToComplex"; 1039221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CK_FloatingComplexToReal: 1040221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "FloatingComplexToReal"; 1041221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CK_FloatingComplexToBoolean: 1042221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "FloatingComplexToBoolean"; 1043221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CK_FloatingComplexCast: 1044221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "FloatingComplexCast"; 1045221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CK_FloatingComplexToIntegralComplex: 1046221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "FloatingComplexToIntegralComplex"; 1047221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CK_IntegralRealToComplex: 1048221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "IntegralRealToComplex"; 104943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_IntegralComplexToReal: 1050221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return "IntegralComplexToReal"; 105143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_IntegralComplexToBoolean: 105243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return "IntegralComplexToBoolean"; 1053976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom case CK_IntegralComplexCast: 1054976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom return "IntegralComplexCast"; 105543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case CK_IntegralComplexToFloatingComplex: 105643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return "IntegralComplexToFloatingComplex"; 105743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom } 105843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom 105943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom llvm_unreachable("Unhandled cast kind!"); 106043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return 0; 106143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom} 106243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom 106343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromExpr *CastExpr::getSubExprAsWritten() { 1064221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Expr *SubExpr = 0; 1065221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CastExpr *E = this; 1066221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom do { 1067221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExpr = E->getSubExpr(); 1068221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1069221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Skip any temporary bindings; they're implicit. 1070221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr)) 1071221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExpr = Binder->getSubExpr(); 1072221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1073221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Conversions by constructor and conversion functions have a 1074221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // subexpression describing the call; strip it off. 1075221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (E->getCastKind() == CK_ConstructorConversion) 1076221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0); 1077221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (E->getCastKind() == CK_UserDefinedConversion) 1078221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument(); 1079221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1080221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If the subexpression we're left with is an implicit cast, look 1081221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // through that, too. 1082221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr))); 1083221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1084221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return SubExpr; 108543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom} 1086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 108743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromCXXBaseSpecifier **CastExpr::path_buffer() { 108843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom switch (getStmtClass()) { 108943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#define ABSTRACT_STMT(x) 109043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#define CASTEXPR(Type, Base) \ 109143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case Stmt::Type##Class: \ 109243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1); 109343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#define STMT(Type, Base) 109443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#include "clang/AST/StmtNodes.inc" 109543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom default: 109643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom llvm_unreachable("non-cast expressions not possible here"); 109743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return 0; 109843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom } 109943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom} 1100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid CastExpr::setCastPath(const CXXCastPath &Path) { 1102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom assert(Path.size() == path_size()); 1103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*)); 1104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T, 1107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CastKind Kind, Expr *Operand, 1108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const CXXCastPath *BasePath, 1109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ExprValueKind VK) { 1110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned PathSize = (BasePath ? BasePath->size() : 0); 1111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *Buffer = 1112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ImplicitCastExpr *E = 1114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK); 1115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (PathSize) E->setCastPath(*BasePath); 1116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return E; 1117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C, 1120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned PathSize) { 1121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *Buffer = 1122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize); 1124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T, 1128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ExprValueKind VK, CastKind K, Expr *Op, 1129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const CXXCastPath *BasePath, 1130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom TypeSourceInfo *WrittenTy, 1131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SourceLocation L, SourceLocation R) { 1132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned PathSize = (BasePath ? BasePath->size() : 0); 1133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *Buffer = 1134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CStyleCastExpr *E = 1136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R); 1137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (PathSize) E->setCastPath(*BasePath); 1138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return E; 1139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 1142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *Buffer = 1143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize); 1145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 1148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// corresponds to, e.g. "<<=". 1149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst char *BinaryOperator::getOpcodeStr(Opcode Op) { 115098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom switch (Op) { 115198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_PtrMemD: return ".*"; 115298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_PtrMemI: return "->*"; 115398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_Mul: return "*"; 115498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_Div: return "/"; 115598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_Rem: return "%"; 1156392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Add: return "+"; 1157392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Sub: return "-"; 1158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Shl: return "<<"; 1159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Shr: return ">>"; 1160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_LT: return "<"; 1161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_GT: return ">"; 1162392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_LE: return "<="; 1163392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_GE: return ">="; 1164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_EQ: return "=="; 1165392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_NE: return "!="; 1166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_And: return "&"; 1167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Xor: return "^"; 1168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Or: return "|"; 1169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_LAnd: return "&&"; 1170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_LOr: return "||"; 1171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_Assign: return "="; 1172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_MulAssign: return "*="; 1173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_DivAssign: return "/="; 1174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_RemAssign: return "%="; 1175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_AddAssign: return "+="; 1176392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_SubAssign: return "-="; 1177392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BO_ShlAssign: return "<<="; 117898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_ShrAssign: return ">>="; 117998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case BO_AndAssign: return "&="; 1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BO_XorAssign: return "^="; 1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BO_OrAssign: return "|="; 1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BO_Comma: return ","; 1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ""; 1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBinaryOperatorKind 1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) { 1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (OO) { 1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: assert(false && "Not an overloadable binary operator"); 1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Plus: return BO_Add; 1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Minus: return BO_Sub; 1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Star: return BO_Mul; 1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Slash: return BO_Div; 1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Percent: return BO_Rem; 1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Caret: return BO_Xor; 1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Amp: return BO_And; 1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Pipe: return BO_Or; 1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Equal: return BO_Assign; 1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Less: return BO_LT; 1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Greater: return BO_GT; 1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_PlusEqual: return BO_AddAssign; 1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_MinusEqual: return BO_SubAssign; 1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_StarEqual: return BO_MulAssign; 1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_SlashEqual: return BO_DivAssign; 1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_PercentEqual: return BO_RemAssign; 1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_CaretEqual: return BO_XorAssign; 1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_AmpEqual: return BO_AndAssign; 1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_PipeEqual: return BO_OrAssign; 1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_LessLess: return BO_Shl; 1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_GreaterGreater: return BO_Shr; 121381c4de7869b646592127e952cda763abf8305069Brian Carlstrom case OO_LessLessEqual: return BO_ShlAssign; 1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_GreaterGreaterEqual: return BO_ShrAssign; 1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_EqualEqual: return BO_EQ; 1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_ExclaimEqual: return BO_NE; 1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_LessEqual: return BO_LE; 1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_GreaterEqual: return BO_GE; 1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_AmpAmp: return BO_LAnd; 1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_PipePipe: return BO_LOr; 1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_Comma: return BO_Comma; 1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case OO_ArrowStar: return BO_PtrMemI; 1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) { 1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static const OverloadedOperatorKind OverOps[] = { 1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* .* Cannot be overloaded */OO_None, OO_ArrowStar, 1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Star, OO_Slash, OO_Percent, 1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Plus, OO_Minus, 1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_LessLess, OO_GreaterGreater, 1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual, 1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_EqualEqual, OO_ExclaimEqual, 1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Amp, 1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Caret, 1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Pipe, 1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_AmpAmp, 1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_PipePipe, 1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Equal, OO_StarEqual, 1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_SlashEqual, OO_PercentEqual, 1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_PlusEqual, OO_MinusEqual, 1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_LessLessEqual, OO_GreaterGreaterEqual, 1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_AmpEqual, OO_CaretEqual, 1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_PipeEqual, 1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OO_Comma 1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project }; 1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return OverOps[Opc]; 1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectInitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc, 1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr **initExprs, unsigned numInits, 125281c4de7869b646592127e952cda763abf8305069Brian Carlstrom SourceLocation rbraceloc) 125381c4de7869b646592127e952cda763abf8305069Brian Carlstrom : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false, 125481c4de7869b646592127e952cda763abf8305069Brian Carlstrom false), 125581c4de7869b646592127e952cda763abf8305069Brian Carlstrom InitExprs(C, numInits), 125681c4de7869b646592127e952cda763abf8305069Brian Carlstrom LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0), 1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HadArrayRangeDesignator(false) 1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 125981c4de7869b646592127e952cda763abf8305069Brian Carlstrom for (unsigned I = 0; I != numInits; ++I) { 1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (initExprs[I]->isTypeDependent()) 1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprBits.TypeDependent = true; 1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (initExprs[I]->isValueDependent()) 1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprBits.ValueDependent = true; 1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (initExprs[I]->containsUnexpandedParameterPack()) 1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ExprBits.ContainsUnexpandedParameterPack = true; 1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 12677b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom 12687b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits); 12697b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom} 12707b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom 12717b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstromvoid InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) { 12727b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom if (NumInits > InitExprs.size()) 1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project InitExprs.reserve(C, NumInits); 1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) { 1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project InitExprs.resize(C, NumInits, 0); 1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectExpr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) { 1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (Init >= InitExprs.size()) { 1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0); 1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project InitExprs.back() = expr; 1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr *Result = cast_or_null<Expr>(InitExprs[Init]); 1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project InitExprs[Init] = expr; 1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return Result; 1290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 1291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid InitListExpr::setArrayFiller(Expr *filler) { 1293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ArrayFillerOrUnionFieldInit = filler; 1294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Fill out any "holes" in the array due to designated initializers. 1295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **inits = getInits(); 1296392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned i = 0, e = getNumInits(); i != e; ++i) 1297392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (inits[i] == 0) 1298392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom inits[i] = filler; 1299392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 1300392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1301392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceRange InitListExpr::getSourceRange() const { 1302392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (SyntacticForm) 1303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return SyntacticForm->getSourceRange(); 1304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation Beg = LBraceLoc, End = RBraceLoc; 1305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Beg.isInvalid()) { 1306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Find the first non-null initializer. 1307bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen for (InitExprsTy::const_iterator I = InitExprs.begin(), 1308bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen E = InitExprs.end(); 1309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom I != E; ++I) { 1310bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (Stmt *S = *I) { 1311bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen Beg = S->getLocStart(); 1312bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen break; 1313bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1314bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1315bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1316bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (End.isInvalid()) { 1317bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen // Find the first non-null initializer from the end. 1318bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(), 1319bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen E = InitExprs.rend(); 1320bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen I != E; ++I) { 1321bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (Stmt *S = *I) { 1322bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen End = S->getSourceRange().getEnd(); 1323bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen break; 1324bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1325bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1326bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1327bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return SourceRange(Beg, End); 1328bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen} 132998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// getFunctionType - Return the underlying function type for this block. 1331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// 1332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromconst FunctionType *BlockExpr::getFunctionType() const { 1333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return getType()->getAs<BlockPointerType>()-> 1334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom getPointeeType()->getAs<FunctionType>(); 1335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 1336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceLocation BlockExpr::getCaretLocation() const { 1338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return TheBlock->getCaretLocation(); 1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst Stmt *BlockExpr::getBody() const { 1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return TheBlock->getBody(); 134298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 134398d58bb80c64b02a33662f0ea80351d4a1535267Brian CarlstromStmt *BlockExpr::getBody() { 134498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return TheBlock->getBody(); 134598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 134698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 1347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 134898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom//===----------------------------------------------------------------------===// 134998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom// Generic Expression Routines 135098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom//===----------------------------------------------------------------------===// 135198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 135298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// isUnusedResultAWarning - Return true if this immediate expression should 135398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// be warned about if the result is unused. If so, fill in Loc and Ranges 135498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// with location to warn on and the source range[s] to report with the 135598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// warning. 1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1, 1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SourceRange &R2, ASTContext &Ctx) const { 1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Don't warn if the expr is type dependent. The type could end up 1359bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen // instantiating to void. 1360bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (isTypeDependent()) 1361bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return false; 1362bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 1363392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom switch (getStmtClass()) { 1364bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen default: 1365bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (getType()->isVoidType()) 1366bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return false; 1367bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen Loc = getExprLoc(); 1368bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen R1 = getSourceRange(); 1369bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return true; 1370bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case ParenExprClass: 1371bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return cast<ParenExpr>(this)->getSubExpr()-> 1372bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen isUnusedResultAWarning(Loc, R1, R2, Ctx); 1373bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case GenericSelectionExprClass: 1374bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return cast<GenericSelectionExpr>(this)->getResultExpr()-> 1375bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen isUnusedResultAWarning(Loc, R1, R2, Ctx); 1376bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case UnaryOperatorClass: { 1377bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen const UnaryOperator *UO = cast<UnaryOperator>(this); 1378bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (UO->getOpcode()) { 1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: break; 138143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case UO_PostInc: 1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case UO_PostDec: 1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case UO_PreInc: 1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case UO_PreDec: // ++/-- 1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; // Not a warning. 138698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case UO_Deref: 1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Dereferencing a volatile pointer is a side-effect. 1388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Ctx.getCanonicalType(getType()).isVolatileQualified()) 1389392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 1390392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 1391392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Real: 1392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case UO_Imag: 1393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // accessing a piece of a volatile complex is a side-effect. 1394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Ctx.getCanonicalType(UO->getSubExpr()->getType()) 1395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .isVolatileQualified()) 1396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 139898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case UO_Extension: 1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx); 140043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom } 140143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom Loc = UO->getOperatorLoc(); 140243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom R1 = UO->getSubExpr()->getSourceRange(); 140343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom return true; 140443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom } 140543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom case BinaryOperatorClass: { 1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const BinaryOperator *BO = cast<BinaryOperator>(this); 1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (BO->getOpcode()) { 1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Consider the RHS of comma for side effects. LHS was checked by 1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Sema::CheckCommaOperands. 1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BO_Comma: 141398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // ((foo = <blah>), 0) is an idiom for hiding the result (and 1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // lvalue-ness) of an assignment written in a macro. 1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (IntegerLiteral *IE = 1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens())) 1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (IE->getValue() == 0) 1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Consider '||', '&&' to have side effects if the LHS or RHS does. 1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BO_LAnd: 1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BO_LOr: 1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) || 1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx)) 1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (BO->isAssignmentOp()) 1429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Loc = BO->getOperatorLoc(); 1431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R1 = BO->getLHS()->getSourceRange(); 1432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R2 = BO->getRHS()->getSourceRange(); 1433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return true; 1434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CompoundAssignOperatorClass: 1436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case VAArgExprClass: 1437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ConditionalOperatorClass: { 1440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If only one of the LHS or RHS is a warning, the operator might 1441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // be being used for control flow. Only warn if both the LHS and 1442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // RHS are warnings. 1443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const ConditionalOperator *Exp = cast<ConditionalOperator>(this); 1444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx)) 1445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!Exp->getLHS()) 1447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return true; 1448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case MemberExprClass: 1452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If the base pointer or element is to a volatile pointer/field, accessing 1453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // it is a side effect. 1454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (Ctx.getCanonicalType(getType()).isVolatileQualified()) 1455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Loc = cast<MemberExpr>(this)->getMemberLoc(); 1457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R1 = SourceRange(Loc, Loc); 1458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R2 = cast<MemberExpr>(this)->getBase()->getSourceRange(); 1459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return true; 1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ArraySubscriptExprClass: 1462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If the base pointer or element is to a volatile pointer/field, accessing 1463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // it is a side effect. 1464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (Ctx.getCanonicalType(getType()).isVolatileQualified()) 1465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc(); 1467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange(); 1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange(); 1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CallExprClass: 1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXOperatorCallExprClass: 1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXMemberCallExprClass: { 1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // If this is a direct call, get the callee. 1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const CallExpr *CE = cast<CallExpr>(this); 1476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (const Decl *FD = CE->getCalleeDecl()) { 1477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // If the callee has attribute pure, const, or warn_unused_result, warn 1478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // about it. void foo() { strlen("bar"); } should warn. 1479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // 1480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Note: If new cases are added here, DiagnoseUnusedExprResult should be 1481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // updated to match for QoI. 1482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (FD->getAttr<WarnUnusedResultAttr>() || 1483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) { 1484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Loc = CE->getCallee()->getLocStart(); 1485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R1 = CE->getCallee()->getSourceRange(); 1486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (unsigned NumArgs = CE->getNumArgs()) 1488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom R2 = SourceRange(CE->getArg(0)->getLocStart(), 1489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CE->getArg(NumArgs-1)->getLocEnd()); 1490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return true; 1491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXTemporaryObjectExprClass: 1497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXConstructExprClass: 1498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 1499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ObjCMessageExprClass: { 1501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this); 1502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const ObjCMethodDecl *MD = ME->getMethodDecl(); 1503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (MD && MD->getAttr<WarnUnusedResultAttr>()) { 1504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Loc = getExprLoc(); 1505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return true; 1506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return false; 150898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 150998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCPropertyRefExprClass: 1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Loc = getExprLoc(); 1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project R1 = getSourceRange(); 1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case StmtExprClass: { 1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Statement exprs don't logically have side effects themselves, but are 1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // sometimes used in macros in ways that give them a type that is unused. 1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // For example ({ blah; foo(); }) will end up with a type if foo has a type. 1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // however, if the result of the stmt expr is dead, we don't want to emit a 1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // warning. 1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt(); 1522bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (!CS->body_empty()) { 1523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const Expr *E = dyn_cast<Expr>(CS->body_back())) 1524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return E->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1525bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back())) 1526bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt())) 1527bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return E->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1528bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1529bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 1530bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (getType()->isVoidType()) 1531bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return false; 1532bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen Loc = cast<StmtExpr>(this)->getLParenLoc(); 1533bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen R1 = getSourceRange(); 1534bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return true; 1535bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen } 1536bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case CStyleCastExprClass: 1537bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen // If this is an explicit cast to void, allow it. People do this when they 1538bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen // think they know what they're doing :). 1539bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (getType()->isVoidType()) 1540bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return false; 1541bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen Loc = cast<CStyleCastExpr>(this)->getLParenLoc(); 1542bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange(); 1543bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return true; 1544bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen case CXXFunctionalCastExprClass: { 1545bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (getType()->isVoidType()) 1546bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return false; 1547bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen const CastExpr *CE = cast<CastExpr>(this); 1548bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen 1549bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen // If this is a cast to void or a constructor conversion, check the operand. 1550bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen // Otherwise, the result of the cast is unused. 1551bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen if (CE->getCastKind() == CK_ToVoid || 1552bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen CE->getCastKind() == CK_ConstructorConversion) 1553bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen return (cast<CastExpr>(this)->getSubExpr() 1554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 1555bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc(); 1556bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange(); 155798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return true; 155898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 155998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 156098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom case ImplicitCastExprClass: 156198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // Check the operand, since implicit casts are inserted by Sema 156298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return (cast<ImplicitCastExpr>(this) 1563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 1564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXDefaultArgExprClass: 1566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (cast<CXXDefaultArgExpr>(this) 1567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 1568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXNewExprClass: 1570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // FIXME: In theory, there might be new expressions that don't have side 1571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // effects (e.g. a placement new with an uninitialized POD). 1572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXDeleteExprClass: 1573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 1574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXBindTemporaryExprClass: 1575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (cast<CXXBindTemporaryExpr>(this) 1576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 1577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case ExprWithCleanupsClass: 1578392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (cast<ExprWithCleanups>(this) 1579392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 1580392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 1581392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 1582392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1583392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isOBJCGCCandidate - Check if an expression is objc gc'able. 1584392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// returns true, if it is; false otherwise. 1585392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { 1586392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const Expr *E = IgnoreParens(); 1587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (E->getStmtClass()) { 1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCIvarRefExprClass: 1591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case Expr::UnaryOperatorClass: 1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx); 1594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ImplicitCastExprClass: 1595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx); 1596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CStyleCastExprClass: 1597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx); 1598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case DeclRefExprClass: { 1599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const Decl *D = cast<DeclRefExpr>(E)->getDecl(); 1600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 1601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (VD->hasGlobalStorage()) 1602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 1603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project QualType T = VD->getType(); 1604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // dereferencing to a pointer is always a gc'able candidate, 1605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // unless it is __weak. 1606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return T->isPointerType() && 1607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak); 1608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 1610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case MemberExprClass: { 1612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const MemberExpr *M = cast<MemberExpr>(E); 1613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return M->getBase()->isOBJCGCCandidate(Ctx); 1614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ArraySubscriptExprClass: 1616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cast<ArraySubscriptExpr>(E)->getBase()->isOBJCGCCandidate(Ctx); 1617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 161898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 161998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 162098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrombool Expr::isBoundMemberFunction(ASTContext &Ctx) const { 162198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (isTypeDependent()) 162298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return false; 162398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return ClassifyLValue(Ctx) == Expr::LV_MemberFunction; 162498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 162598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 162698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromstatic Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1, 162798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Expr::CanThrowResult CT2) { 162898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // CanThrowResult constants are ordered so that the maximum is the correct 162998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // merge result. 163098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return CT1 > CT2 ? CT1 : CT2; 163198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom} 163298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 163398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromstatic Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) { 163498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Expr *E = const_cast<Expr*>(CE); 163598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom Expr::CanThrowResult R = Expr::CT_Cannot; 163698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom for (Expr::child_range I = E->children(); I && R != Expr::CT_Can; ++I) { 163798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C)); 1638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return R; 1640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic Expr::CanThrowResult CanCalleeThrow(ASTContext &Ctx, const Decl *D, 1643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bool NullThrows = true) { 1644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!D) 1645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NullThrows ? Expr::CT_Can : Expr::CT_Cannot; 1646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // See if we can get a function type from the decl somehow. 1648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const ValueDecl *VD = dyn_cast<ValueDecl>(D); 1649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!VD) // If we have no clue what we're calling, assume the worst. 1650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Can; 1651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // As an extension, we assume that __attribute__((nothrow)) functions don't 1653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // throw. 1654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>()) 1655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Cannot; 1656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom QualType T = VD->getType(); 1658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const FunctionProtoType *FT; 1659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((FT = T->getAs<FunctionProtoType>())) { 1660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } else if (const PointerType *PT = T->getAs<PointerType>()) 1661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom FT = PT->getPointeeType()->getAs<FunctionProtoType>(); 1662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 1663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom FT = RT->getPointeeType()->getAs<FunctionProtoType>(); 1664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (const MemberPointerType *MT = T->getAs<MemberPointerType>()) 1665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom FT = MT->getPointeeType()->getAs<FunctionProtoType>(); 1666392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) 1667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom FT = BT->getPointeeType()->getAs<FunctionProtoType>(); 1668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!FT) 1670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Can; 1671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return FT->isNothrow(Ctx) ? Expr::CT_Cannot : Expr::CT_Can; 1673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) { 1676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (DC->isTypeDependent()) 1677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Dependent; 1678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!DC->getTypeAsWritten()->isReferenceType()) 1680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Cannot; 1681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1682392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot; 1683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic Expr::CanThrowResult CanTypeidThrow(ASTContext &C, 1686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const CXXTypeidExpr *DC) { 1687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (DC->isTypeOperand()) 1688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Cannot; 1689392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1690392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr *Op = DC->getExprOperand(); 1691392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Op->isTypeDependent()) 1692392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return Expr::CT_Dependent; 1693392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1694392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const RecordType *RT = Op->getType()->getAs<RecordType>(); 1695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!RT) 1696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Cannot; 1697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic()) 1699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Cannot; 1700221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (Op->Classify(C).isPRValue()) 1702221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Cannot; 1703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Expr::CT_Can; 1705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr::CanThrowResult Expr::CanThrow(ASTContext &C) const { 1708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // C++ [expr.unary.noexcept]p3: 1709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // [Can throw] if in a potentially-evaluated context the expression would 1710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // contain: 1711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (getStmtClass()) { 1712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXThrowExprClass: 1713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // - a potentially evaluated throw-expression 1714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT_Can; 1715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1716221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXDynamicCastExprClass: { 1717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v), 1718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // where T is a reference type, that requires a run-time check 1719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT = CanDynamicCastThrow(cast<CXXDynamicCastExpr>(this)); 1720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CT == CT_Can) 1721221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT; 1722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXTypeidExprClass: 1726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // - a potentially evaluated typeid expression applied to a glvalue 1727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // expression whose type is a polymorphic class type 1728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CanTypeidThrow(C, cast<CXXTypeidExpr>(this)); 1729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // - a potentially evaluated call to a function, member function, function 1731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // pointer, or member function pointer that does not have a non-throwing 1732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // exception-specification 1733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CallExprClass: 1734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXOperatorCallExprClass: 1735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXMemberCallExprClass: { 1736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT = CanCalleeThrow(C,cast<CallExpr>(this)->getCalleeDecl()); 1737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CT == CT_Can) 1738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT; 1739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXConstructExprClass: 1743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXTemporaryObjectExprClass: { 1744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT = CanCalleeThrow(C, 1745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cast<CXXConstructExpr>(this)->getConstructor()); 1746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CT == CT_Can) 1747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT; 1748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1751221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXNewExprClass: { 1752221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT = MergeCanThrow( 1753221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanCalleeThrow(C, cast<CXXNewExpr>(this)->getOperatorNew()), 1754221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanCalleeThrow(C, cast<CXXNewExpr>(this)->getConstructor(), 1755221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /*NullThrows*/false)); 1756221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CT == CT_Can) 1757221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT; 1758221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1759221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1760221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1761221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXDeleteExprClass: { 1762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT = CanCalleeThrow(C, 1763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cast<CXXDeleteExpr>(this)->getOperatorDelete()); 1764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CT == CT_Can) 1765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT; 1766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const Expr *Arg = cast<CXXDeleteExpr>(this)->getArgument(); 1767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Unwrap exactly one implicit cast, which converts all pointers to void*. 1768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(Arg)) 1769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Arg = Cast->getSubExpr(); 1770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const PointerType *PT = Arg->getType()->getAs<PointerType>()) { 1771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>()) { 1772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT2 = CanCalleeThrow(C, 1773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cast<CXXRecordDecl>(RT->getDecl())->getDestructor()); 1774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (CT2 == CT_Can) 1775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT2; 1776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CT = MergeCanThrow(CT, CT2); 1777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXBindTemporaryExprClass: { 1783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // The bound temporary has to be destroyed again, which might throw. 1784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CanThrowResult CT = CanCalleeThrow(C, 1785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cast<CXXBindTemporaryExpr>(this)->getTemporary()->getDestructor()); 1786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CT == CT_Can) 1787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return CT; 1788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1789221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // ObjC message sends are like function calls, but never have exception 1792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // specs. 1793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCMessageExprClass: 1794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCPropertyRefExprClass: 1795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return CT_Can; 1796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Many other things have subexpressions, so we have to test those. 1798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Some are simple: 1799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ParenExprClass: 1800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case MemberExprClass: 1801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXReinterpretCastExprClass: 1802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXConstCastExprClass: 1803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ConditionalOperatorClass: 1804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CompoundLiteralExprClass: 1805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ExtVectorElementExprClass: 1806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case InitListExprClass: 1807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case DesignatedInitExprClass: 1808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ParenListExprClass: 1809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case VAArgExprClass: 1810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXDefaultArgExprClass: 1811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ExprWithCleanupsClass: 1812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCIvarRefExprClass: 1813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCIsaExprClass: 1814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ShuffleVectorExprClass: 1815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CanSubExprsThrow(C, this); 1816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Some might be dependent for other reasons. 1818221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case UnaryOperatorClass: 1819221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ArraySubscriptExprClass: 1820221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ImplicitCastExprClass: 1821221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CStyleCastExprClass: 1822221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXStaticCastExprClass: 1823221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXFunctionalCastExprClass: 1824221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case BinaryOperatorClass: 1825221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CompoundAssignOperatorClass: { 1826221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot; 1827221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1828221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1829221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1830221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms. 1831221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case StmtExprClass: 1832221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT_Can; 1833221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1834221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ChooseExprClass: 1835221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (isTypeDependent() || isValueDependent()) 1836221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT_Dependent; 1837221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return cast<ChooseExpr>(this)->getChosenSubExpr(C)->CanThrow(C); 1838221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1839221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case GenericSelectionExprClass: 1840221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (cast<GenericSelectionExpr>(this)->isResultDependent()) 1841221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT_Dependent; 1842221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return cast<GenericSelectionExpr>(this)->getResultExpr()->CanThrow(C); 1843221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1844221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // Some expressions are always dependent. 1845221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case DependentScopeDeclRefExprClass: 1846221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXUnresolvedConstructExprClass: 1847221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case CXXDependentScopeMemberExprClass: 1848221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT_Dependent; 1849221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1850221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 1851221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // All other expressions don't have subexpressions, or else they are 1852221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // unevaluated. 1853221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CT_Cannot; 1854221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1855221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1857221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr* Expr::IgnoreParens() { 1858221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Expr* E = this; 1859221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom while (true) { 1860221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ParenExpr* P = dyn_cast<ParenExpr>(E)) { 1861221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1863221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1864221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1865221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (P->getOpcode() == UO_Extension) { 1866221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1867221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1868221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1869221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1870221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 1871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!P->isResultDependent()) { 1872221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getResultExpr(); 1873221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return E; 1877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 1881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// or CastExprs or ImplicitCastExprs, returning their operand. 1882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectExpr *Expr::IgnoreParenCasts() { 1883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr *E = this; 1884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (true) { 1885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ParenExpr* P = dyn_cast<ParenExpr>(E)) { 1886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getSubExpr(); 1887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getSubExpr(); 1891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (P->getOpcode() == UO_Extension) { 1895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getSubExpr(); 1896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1897976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom } 1898976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom } 1899976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 1900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!P->isResultDependent()) { 1901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getResultExpr(); 1902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1904976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom } 1905221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return E; 1906221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1907221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1908221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1909221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue 1910221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// casts. This is intended purely as a temporary workaround for code 1911221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// that hasn't yet been rewritten to do the right thing about those 1912221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// casts, and may disappear along with the last internal use. 1913221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr *Expr::IgnoreParenLValueCasts() { 1914221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Expr *E = this; 1915221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom while (true) { 1916221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1917221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1918221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1919221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } else if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1920221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (P->getCastKind() == CK_LValueToRValue) { 1921221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1922221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1923221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1924221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1925221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (P->getOpcode() == UO_Extension) { 1926221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1927221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1928221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 1930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!P->isResultDependent()) { 1931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getResultExpr(); 1932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1934221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1935221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 1936221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1937221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return E; 1938221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1939221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1940221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr *Expr::IgnoreParenImpCasts() { 1941221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom Expr *E = this; 1942221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom while (true) { 1943221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1944221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1945221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1946221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1947221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) { 1948221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1949221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1950221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1951221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1952221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (P->getOpcode() == UO_Extension) { 1953221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom E = P->getSubExpr(); 1954221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 1955221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1956221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 1958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!P->isResultDependent()) { 1959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getResultExpr(); 1960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1961221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return E; 1964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 1968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// value (including ptr->int casts of the same size). Strip off any 1969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// ParenExpr or CastExprs, returning their operand. 1970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectExpr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) { 1971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr *E = this; 1972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (true) { 1973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getSubExpr(); 1975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // We ignore integer <-> casts that are of the same width, ptr<->ptr and 1980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // ptr<->int casts of the same width. We also ignore all identity casts. 1981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Expr *SE = P->getSubExpr(); 1982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) { 1984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = SE; 1985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((E->getType()->isPointerType() || 1989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E->getType()->isIntegralType(Ctx)) && 1990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (SE->getType()->isPointerType() || 1991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SE->getType()->isIntegralType(Ctx)) && 1992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) { 1993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = SE; 1994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 1995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (P->getOpcode() == UO_Extension) { 2000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = P->getSubExpr(); 2001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 2002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 2003392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2004392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2005392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 2006392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!P->isResultDependent()) { 2007392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = P->getResultExpr(); 2008392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom continue; 2009392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2010392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2011392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2012392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return E; 2013392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2014392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2015392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2016392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::isDefaultArgument() const { 2017392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const Expr *E = this; 2018392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) 2019392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = ICE->getSubExprAsWritten(); 2020392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2021392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return isa<CXXDefaultArgExpr>(E); 2022392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2023392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2024392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// \brief Skip over any no-op casts and any temporary-binding 2025392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// expressions. 2026392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) { 2027392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2028392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (ICE->getCastKind() == CK_NoOp) 2029392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = ICE->getSubExpr(); 2030392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 2031392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2032392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2033392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2034392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E)) 2035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = BE->getSubExpr(); 2036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2037392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ICE->getCastKind() == CK_NoOp) 2039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = ICE->getSubExpr(); 2040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 2041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 2042e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 2043392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2044392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return E->IgnoreParens(); 2045392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2046e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu 2047392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isTemporaryObject - Determines if this expression produces a 2048392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// temporary of the given class type. 2049e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugubool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const { 2050392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy))) 2051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2052392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this); 2054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 205598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // Temporaries are by definition pr-values of class type. 205698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!E->Classify(C).isPRValue()) { 205798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // In this context, property reference is a message call and is pr-value. 205898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!isa<ObjCPropertyRefExpr>(E)) 205998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return false; 206098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 206198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 206298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // Black-list a few cases which yield pr-values of class type that don't 2063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // refer to temporaries of that type: 2064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // - implicit derived-to-base conversions 2066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (isa<ImplicitCastExpr>(E)) { 2067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (cast<ImplicitCastExpr>(E)->getCastKind()) { 2068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_DerivedToBase: 2069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CK_UncheckedDerivedToBase: 2070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 2072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 2073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 2074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 2075392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // - member expressions (all) 2077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (isa<MemberExpr>(E)) 2078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // - opaque values (all) 2081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (isa<OpaqueValueExpr>(E)) 2082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2083392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 2085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 2086392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isImplicitCXXThis() const { 2088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const Expr *E = this; 2089392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2090392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Strip away parentheses and casts we don't care about. 2091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (true) { 2092392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) { 2093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project E = Paren->getSubExpr(); 2094221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom continue; 2095221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 2096392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2097392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2098392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (ICE->getCastKind() == CK_NoOp || 2099392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ICE->getCastKind() == CK_LValueToRValue || 2100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ICE->getCastKind() == CK_DerivedToBase || 2101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ICE->getCastKind() == CK_UncheckedDerivedToBase) { 2102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = ICE->getSubExpr(); 2103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom continue; 2104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) { 2108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (UnOp->getOpcode() == UO_Extension) { 2109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = UnOp->getSubExpr(); 2110392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom continue; 2111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2115392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E)) 2118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return This->isImplicit(); 2119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 2121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 2122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// hasAnyTypeDependentArguments - Determines if any of the expressions 2124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// in Exprs is type-dependent. 2125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) { 2126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned I = 0; I < NumExprs; ++I) 2127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Exprs[I]->isTypeDependent()) 2128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return true; 2129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 2131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// hasAnyValueDependentArguments - Determines if any of the expressions 2134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// in Exprs is value-dependent. 2135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) { 2136392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned I = 0; I < NumExprs; ++I) 2137392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Exprs[I]->isValueDependent()) 2138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 2139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 2142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const { 2144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // This function is attempting whether an expression is an initializer 2145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // which can be evaluated at compile-time. isEvaluatable handles most 2146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // of the cases, but it can't deal with some initializer-specific 2147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // expressions, and it can't deal with aggregates; we deal with those here, 2148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // and fall back to isEvaluatable for the other cases. 214998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 2150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // If we ever capture reference-binding directly in the AST, we can 2151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // kill the second parameter. 2152392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (IsForRef) { 2154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EvalResult Result; 2155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects; 215698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 2157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (getStmtClass()) { 215998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom default: break; 2160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case StringLiteralClass: 2161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCStringLiteralClass: 2162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ObjCEncodeExprClass: 2163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 2164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXTemporaryObjectExprClass: 2165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case CXXConstructExprClass: { 2166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const CXXConstructExpr *CE = cast<CXXConstructExpr>(this); 2167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // Only if it's 2169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // 1) an application of the trivial default constructor or 2170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CE->getConstructor()->isTrivial()) return false; 217198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!CE->getNumArgs()) return true; 2172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 217398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom // 2) an elidable trivial copy construction of an operand which is 2174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // itself a constant initializer. Note that we consider the 2175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // operand on its own, *not* as a reference binding. 217698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom return CE->isElidable() && 2177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CE->getArg(0)->isConstantInitializer(Ctx, false); 2178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 2179392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CompoundLiteralExprClass: { 2180392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // This handles gcc's extension that allows global initializers like 2181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // "struct x {int x;} x = (struct x) {};". 2182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom // FIXME: This accepts other cases it shouldn't! 2183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer(); 2184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return Exp->isConstantInitializer(Ctx, false); 2185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 2186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case InitListExprClass: { 2187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // FIXME: This doesn't deal with fields with reference types correctly. 2188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // FIXME: This incorrectly allows pointers cast to integers to be assigned 2189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // to bitfields. 2190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const InitListExpr *Exp = cast<InitListExpr>(this); 2191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned numInits = Exp->getNumInits(); 2192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (unsigned i = 0; i < numInits; i++) { 2193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!Exp->getInit(i)->isConstantInitializer(Ctx, false)) 2194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 2196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 2197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 2198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ImplicitValueInitExprClass: 2199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 2200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ParenExprClass: 2201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cast<ParenExpr>(this)->getSubExpr() 2202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ->isConstantInitializer(Ctx, IsForRef); 2203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case GenericSelectionExprClass: 2204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cast<GenericSelectionExpr>(this)->isResultDependent()) 2205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return false; 2206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cast<GenericSelectionExpr>(this)->getResultExpr() 2207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ->isConstantInitializer(Ctx, IsForRef); 2208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ChooseExprClass: 2209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx) 2210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->isConstantInitializer(Ctx, IsForRef); 2211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case UnaryOperatorClass: { 2212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const UnaryOperator* Exp = cast<UnaryOperator>(this); 2213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (Exp->getOpcode() == UO_Extension) 2214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return Exp->getSubExpr()->isConstantInitializer(Ctx, false); 2215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case BinaryOperatorClass: { 2218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Special case &&foo - &&bar. It would be nice to generalize this somehow 2219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // but this handles the common case. 2220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const BinaryOperator *Exp = cast<BinaryOperator>(this); 2221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (Exp->getOpcode() == BO_Sub && 2222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) && 2223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx))) 2224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return true; 2225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2226392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2227392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXFunctionalCastExprClass: 2228392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CXXStaticCastExprClass: 2229392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case ImplicitCastExprClass: 2230392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case CStyleCastExprClass: 2231392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Handle casts with a destination that's a struct or union; this 2232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // deals with both the gcc no-op struct cast extension and the 2233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // cast-to-union extension. 2234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (getType()->isRecordType()) 2235392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cast<CastExpr>(this)->getSubExpr() 2236392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->isConstantInitializer(Ctx, false); 2237392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2238392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Integer->integer casts can be handled here, which is important for 2239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // things like (int)(&&x-&&y). Scary but true. 2240392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (getType()->isIntegerType() && 2241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType()) 2242392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cast<CastExpr>(this)->getSubExpr() 2243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ->isConstantInitializer(Ctx, false); 2244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2245392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2246392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2247392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return isEvaluatable(Ctx); 2248392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2249392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2250392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isNullPointerConstant - C99 6.3.2.3p3 - Return whether this is a null 2251392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// pointer constant or not, as well as the specific kind of constant detected. 2252392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// Null pointer constants can be integer constant expressions with the 2253392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// value zero, casts of zero to void*, nullptr (C++0X), or __null 2254392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// (a GNU extension). 2255392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromExpr::NullPointerConstantKind 2256392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromExpr::isNullPointerConstant(ASTContext &Ctx, 2257392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NullPointerConstantValueDependence NPC) const { 2258392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isValueDependent()) { 2259392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom switch (NPC) { 2260392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case NPC_NeverValueDependent: 2261392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom assert(false && "Unexpected value dependent expression!"); 2262392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // If the unthinkable happens, fall through to the safest alternative. 2263392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2264392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case NPC_ValueDependentIsNull: 2265392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isTypeDependent() || getType()->isIntegralType(Ctx)) 2266392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NPCK_ZeroInteger; 2267392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 2268392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NPCK_NotNull; 2269392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2270392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom case NPC_ValueDependentIsNotNull: 2271392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NPCK_NotNull; 2272392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2273392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2274392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2275392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Strip off a cast to void*, if it exists. Except in C++. 2276392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) { 2277392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!Ctx.getLangOptions().CPlusPlus) { 2278392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Check that it is a cast to void*. 2279392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const PointerType *PT = CE->getType()->getAs<PointerType>()) { 2280392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom QualType Pointee = PT->getPointeeType(); 2281392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!Pointee.hasQualifiers() && 2282392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Pointee->isVoidType() && // to void* 2283392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom CE->getSubExpr()->getType()->isIntegerType()) // from int. 2284392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2285392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2286392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2287392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) { 2288392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Ignore the ImplicitCastExpr type entirely. 2289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) { 2291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Accept ((void*)0) as a null pointer constant, as many other 2292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // implementations do. 2293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } else if (const GenericSelectionExpr *GE = 2295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom dyn_cast<GenericSelectionExpr>(this)) { 2296392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC); 2297392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } else if (const CXXDefaultArgExpr *DefaultArg 2298392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom = dyn_cast<CXXDefaultArgExpr>(this)) { 2299392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // See through default argument expressions 2300392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC); 2301392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } else if (isa<GNUNullExpr>(this)) { 2302392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // The GNU __null extension is always a null pointer constant. 2303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NPCK_GNUNull; 2304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // C++0x nullptr_t is always a null pointer constant. 2307392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (getType()->isNullPtrType()) 2308392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NPCK_CXX0X_nullptr; 2309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2310392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const RecordType *UT = getType()->getAsUnionType()) 2311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) 2312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){ 2313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const Expr *InitExpr = CLE->getInitializer(); 2314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr)) 2315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC); 2316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // This expression must be an integer type. 2318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!getType()->isIntegerType() || 2319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType())) 2320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return NPCK_NotNull; 2321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2322392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // If we have an integer constant expression, we need to *evaluate* it and 2323392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // test for the value 0. 2324392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom llvm::APSInt Result; 2325392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool IsNull = isIntegerConstantExpr(Result, Ctx) && Result == 0; 2326392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2327392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return (IsNull ? NPCK_ZeroInteger : NPCK_NotNull); 2328392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2329392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// \brief If this expression is an l-value for an Objective C 2331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// property, find the underlying property reference expression. 2332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromconst ObjCPropertyRefExpr *Expr::getObjCProperty() const { 2333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const Expr *E = this; 2334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (true) { 2335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom assert((E->getValueKind() == VK_LValue && 2336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E->getObjectKind() == OK_ObjCProperty) && 2337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom "expression is not a property reference"); 2338392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = E->IgnoreParenCasts(); 2339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { 2340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (BO->getOpcode() == BO_Comma) { 2341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = BO->getRHS(); 2342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom continue; 2343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2346392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2348392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2349392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return cast<ObjCPropertyRefExpr>(E); 2350392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromFieldDecl *Expr::getBitField() { 2353392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr *E = this->IgnoreParens(); 2354392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2355392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2356392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (ICE->getCastKind() == CK_LValueToRValue || 2357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp)) 2358392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = ICE->getSubExpr()->IgnoreParens(); 2359392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 2360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E)) 2364392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl())) 2365392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Field->isBitField()) 2366392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return Field; 2367392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2368392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) 2369392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl())) 2370392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Field->isBitField()) 2371392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return Field; 2372392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2373392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) 2374392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (BinOp->isAssignmentOp() && BinOp->getLHS()) 2375392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return BinOp->getLHS()->getBitField(); 2376392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2377392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 2378392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2379392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2380392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::refersToVectorElement() const { 2381392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const Expr *E = this->IgnoreParens(); 2382392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2383392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2384392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (ICE->getValueKind() != VK_RValue && 2385392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ICE->getCastKind() == CK_NoOp) 2386392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom E = ICE->getSubExpr()->IgnoreParens(); 2387392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 2388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom break; 2389392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2390392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2391392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) 2392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return ASE->getBase()->getType()->isVectorType(); 2393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isa<ExtVectorElementExpr>(E)) 2395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return true; 2396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2397392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 2398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2399392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2400392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isArrow - Return true if the base expression is a pointer to vector, 2401392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// return false if the base expression is a vector. 2402392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool ExtVectorElementExpr::isArrow() const { 2403392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return getBase()->getType()->isPointerType(); 2404392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2405392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2406392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromunsigned ExtVectorElementExpr::getNumElements() const { 2407392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (const VectorType *VT = getType()->getAs<VectorType>()) 2408392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return VT->getNumElements(); 2409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 2410392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2411392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2412392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// containsDuplicateElements - Return true if any element access is repeated. 2413392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool ExtVectorElementExpr::containsDuplicateElements() const { 2414392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // FIXME: Refactor this code to an accessor on the AST node which returns the 2415392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // "type" of component access, and share with code below and in Sema. 2416392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom llvm::StringRef Comp = Accessor->getName(); 2417392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2418392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Halving swizzles do not contain duplicate elements. 2419392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd") 2420392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 2421392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2422392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom // Advance past s-char prefix on hex swizzles. 2423392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Comp[0] == 's' || Comp[0] == 'S') 2424392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Comp = Comp.substr(1); 2425392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2426392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned i = 0, e = Comp.size(); i != e; ++i) 2427392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos) 2428392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return true; 2429392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2430392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return false; 2431392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2432392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2433392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. 2434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid ExtVectorElementExpr::getEncodedElementAccess( 2435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom llvm::SmallVectorImpl<unsigned> &Elts) const { 2436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom llvm::StringRef Comp = Accessor->getName(); 2437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Comp[0] == 's' || Comp[0] == 'S') 2438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Comp = Comp.substr(1); 2439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool isHi = Comp == "hi"; 2441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool isLo = Comp == "lo"; 2442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool isEven = Comp == "even"; 2443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool isOdd = Comp == "odd"; 2444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned i = 0, e = getNumElements(); i != e; ++i) { 2446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom uint64_t Index; 2447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (isHi) 2449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Index = e + i; 2450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (isLo) 2451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Index = i; 2452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (isEven) 2453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Index = 2 * i; 2454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (isOdd) 2455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Index = 2 * i + 1; 2456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 2457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Index = ExtVectorType::getAccessorIdx(Comp[i]); 2458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Elts.push_back(Index); 2460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2462392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2463392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr::ObjCMessageExpr(QualType T, 2464392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 2465392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation LBracLoc, 2466392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SuperLoc, 2467392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool IsInstanceSuper, 2468392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom QualType SuperType, 2469392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Selector Sel, 2470392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SelLoc, 2471392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ObjCMethodDecl *Method, 2472392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **Args, unsigned NumArgs, 2473392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation RBracLoc) 2474392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, 2475392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /*TypeDependent=*/false, /*ValueDependent=*/false, 2476392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /*ContainsUnexpandedParameterPack=*/false), 2477392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass), 2478392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom HasMethod(Method != 0), SuperLoc(SuperLoc), 2479392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 2480392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom : Sel.getAsOpaquePtr())), 2481392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2482392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{ 2483392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom setReceiverPointer(SuperType.getAsOpaquePtr()); 2484392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (NumArgs) 2485392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom memcpy(getArgs(), Args, NumArgs * sizeof(Expr *)); 2486392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2487392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2488392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr::ObjCMessageExpr(QualType T, 2489392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 2490392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation LBracLoc, 2491392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom TypeSourceInfo *Receiver, 2492392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Selector Sel, 2493392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SelLoc, 2494392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ObjCMethodDecl *Method, 2495392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **Args, unsigned NumArgs, 2496392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation RBracLoc) 2497392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(), 2498392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom T->isDependentType(), T->containsUnexpandedParameterPack()), 2499392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0), 2500392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 2501392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom : Sel.getAsOpaquePtr())), 2502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 2504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setReceiverPointer(Receiver); 2505392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **MyArgs = getArgs(); 2506392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned I = 0; I != NumArgs; ++I) { 2507392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Args[I]->isTypeDependent()) 2508392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprBits.TypeDependent = true; 2509392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Args[I]->isValueDependent()) 2510392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprBits.ValueDependent = true; 2511392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Args[I]->containsUnexpandedParameterPack()) 2512392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprBits.ContainsUnexpandedParameterPack = true; 2513392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2514392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom MyArgs[I] = Args[I]; 2515392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2516392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2517392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2518392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr::ObjCMessageExpr(QualType T, 2519392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 2520392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation LBracLoc, 2521392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr *Receiver, 2522392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Selector Sel, 2523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SelLoc, 2524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ObjCMethodDecl *Method, 2525392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **Args, unsigned NumArgs, 2526392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation RBracLoc) 2527392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(), 2528392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Receiver->isTypeDependent(), 2529392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Receiver->containsUnexpandedParameterPack()), 2530392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0), 2531392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 2532392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom : Sel.getAsOpaquePtr())), 2533392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2534392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{ 2535392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom setReceiverPointer(Receiver); 2536392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **MyArgs = getArgs(); 2537392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom for (unsigned I = 0; I != NumArgs; ++I) { 2538392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Args[I]->isTypeDependent()) 2539392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprBits.TypeDependent = true; 2540392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Args[I]->isValueDependent()) 2541392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprBits.ValueDependent = true; 2542392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (Args[I]->containsUnexpandedParameterPack()) 2543392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprBits.ContainsUnexpandedParameterPack = true; 2544392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2545392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom MyArgs[I] = Args[I]; 2546392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 2547392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 2551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation LBracLoc, 2552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SuperLoc, 2553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom bool IsInstanceSuper, 2554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom QualType SuperType, 2555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Selector Sel, 2556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SelLoc, 2557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ObjCMethodDecl *Method, 2558392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **Args, unsigned NumArgs, 2559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation RBracLoc) { 2560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 2561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom NumArgs * sizeof(Expr *); 2562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper, 2564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SuperType, Sel, SelLoc, Method, Args,NumArgs, 2565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom RBracLoc); 2566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom} 2567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 2568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ExprValueKind VK, 2570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation LBracLoc, 2571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom TypeSourceInfo *Receiver, 2572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Selector Sel, 2573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation SelLoc, 2574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ObjCMethodDecl *Method, 2575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom Expr **Args, unsigned NumArgs, 2576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom SourceLocation RBracLoc) { 2577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 2578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NumArgs * sizeof(Expr *); 2579 void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2580 return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc, 2581 Method, Args, NumArgs, RBracLoc); 2582} 2583 2584ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2585 ExprValueKind VK, 2586 SourceLocation LBracLoc, 2587 Expr *Receiver, 2588 Selector Sel, 2589 SourceLocation SelLoc, 2590 ObjCMethodDecl *Method, 2591 Expr **Args, unsigned NumArgs, 2592 SourceLocation RBracLoc) { 2593 unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 2594 NumArgs * sizeof(Expr *); 2595 void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2596 return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc, 2597 Method, Args, NumArgs, RBracLoc); 2598} 2599 2600ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context, 2601 unsigned NumArgs) { 2602 unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 2603 NumArgs * sizeof(Expr *); 2604 void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2605 return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs); 2606} 2607 2608SourceRange ObjCMessageExpr::getReceiverRange() const { 2609 switch (getReceiverKind()) { 2610 case Instance: 2611 return getInstanceReceiver()->getSourceRange(); 2612 2613 case Class: 2614 return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange(); 2615 2616 case SuperInstance: 2617 case SuperClass: 2618 return getSuperLoc(); 2619 } 2620 2621 return SourceLocation(); 2622} 2623 2624Selector ObjCMessageExpr::getSelector() const { 2625 if (HasMethod) 2626 return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod) 2627 ->getSelector(); 2628 return Selector(SelectorOrMethod); 2629} 2630 2631ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const { 2632 switch (getReceiverKind()) { 2633 case Instance: 2634 if (const ObjCObjectPointerType *Ptr 2635 = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>()) 2636 return Ptr->getInterfaceDecl(); 2637 break; 2638 2639 case Class: 2640 if (const ObjCObjectType *Ty 2641 = getClassReceiver()->getAs<ObjCObjectType>()) 2642 return Ty->getInterface(); 2643 break; 2644 2645 case SuperInstance: 2646 if (const ObjCObjectPointerType *Ptr 2647 = getSuperType()->getAs<ObjCObjectPointerType>()) 2648 return Ptr->getInterfaceDecl(); 2649 break; 2650 2651 case SuperClass: 2652 if (const ObjCObjectType *Iface 2653 = getSuperType()->getAs<ObjCObjectType>()) 2654 return Iface->getInterface(); 2655 break; 2656 } 2657 2658 return 0; 2659} 2660 2661bool ChooseExpr::isConditionTrue(const ASTContext &C) const { 2662 return getCond()->EvaluateAsInt(C) != 0; 2663} 2664 2665ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr, 2666 QualType Type, SourceLocation BLoc, 2667 SourceLocation RP) 2668 : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary, 2669 Type->isDependentType(), Type->isDependentType(), 2670 Type->containsUnexpandedParameterPack()), 2671 BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr) 2672{ 2673 SubExprs = new (C) Stmt*[nexpr]; 2674 for (unsigned i = 0; i < nexpr; i++) { 2675 if (args[i]->isTypeDependent()) 2676 ExprBits.TypeDependent = true; 2677 if (args[i]->isValueDependent()) 2678 ExprBits.ValueDependent = true; 2679 if (args[i]->containsUnexpandedParameterPack()) 2680 ExprBits.ContainsUnexpandedParameterPack = true; 2681 2682 SubExprs[i] = args[i]; 2683 } 2684} 2685 2686void ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs, 2687 unsigned NumExprs) { 2688 if (SubExprs) C.Deallocate(SubExprs); 2689 2690 SubExprs = new (C) Stmt* [NumExprs]; 2691 this->NumExprs = NumExprs; 2692 memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs); 2693} 2694 2695GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context, 2696 SourceLocation GenericLoc, Expr *ControllingExpr, 2697 TypeSourceInfo **AssocTypes, Expr **AssocExprs, 2698 unsigned NumAssocs, SourceLocation DefaultLoc, 2699 SourceLocation RParenLoc, 2700 bool ContainsUnexpandedParameterPack, 2701 unsigned ResultIndex) 2702 : Expr(GenericSelectionExprClass, 2703 AssocExprs[ResultIndex]->getType(), 2704 AssocExprs[ResultIndex]->getValueKind(), 2705 AssocExprs[ResultIndex]->getObjectKind(), 2706 AssocExprs[ResultIndex]->isTypeDependent(), 2707 AssocExprs[ResultIndex]->isValueDependent(), 2708 ContainsUnexpandedParameterPack), 2709 AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]), 2710 SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs), 2711 ResultIndex(ResultIndex), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc), 2712 RParenLoc(RParenLoc) { 2713 SubExprs[CONTROLLING] = ControllingExpr; 2714 std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes); 2715 std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR); 2716} 2717 2718GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context, 2719 SourceLocation GenericLoc, Expr *ControllingExpr, 2720 TypeSourceInfo **AssocTypes, Expr **AssocExprs, 2721 unsigned NumAssocs, SourceLocation DefaultLoc, 2722 SourceLocation RParenLoc, 2723 bool ContainsUnexpandedParameterPack) 2724 : Expr(GenericSelectionExprClass, 2725 Context.DependentTy, 2726 VK_RValue, 2727 OK_Ordinary, 2728 /*isTypeDependent=*/ true, 2729 /*isValueDependent=*/ true, 2730 ContainsUnexpandedParameterPack), 2731 AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]), 2732 SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs), 2733 ResultIndex(-1U), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc), 2734 RParenLoc(RParenLoc) { 2735 SubExprs[CONTROLLING] = ControllingExpr; 2736 std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes); 2737 std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR); 2738} 2739 2740//===----------------------------------------------------------------------===// 2741// DesignatedInitExpr 2742//===----------------------------------------------------------------------===// 2743 2744IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() { 2745 assert(Kind == FieldDesignator && "Only valid on a field designator"); 2746 if (Field.NameOrField & 0x01) 2747 return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01); 2748 else 2749 return getField()->getIdentifier(); 2750} 2751 2752DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty, 2753 unsigned NumDesignators, 2754 const Designator *Designators, 2755 SourceLocation EqualOrColonLoc, 2756 bool GNUSyntax, 2757 Expr **IndexExprs, 2758 unsigned NumIndexExprs, 2759 Expr *Init) 2760 : Expr(DesignatedInitExprClass, Ty, 2761 Init->getValueKind(), Init->getObjectKind(), 2762 Init->isTypeDependent(), Init->isValueDependent(), 2763 Init->containsUnexpandedParameterPack()), 2764 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax), 2765 NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) { 2766 this->Designators = new (C) Designator[NumDesignators]; 2767 2768 // Record the initializer itself. 2769 child_range Child = children(); 2770 *Child++ = Init; 2771 2772 // Copy the designators and their subexpressions, computing 2773 // value-dependence along the way. 2774 unsigned IndexIdx = 0; 2775 for (unsigned I = 0; I != NumDesignators; ++I) { 2776 this->Designators[I] = Designators[I]; 2777 2778 if (this->Designators[I].isArrayDesignator()) { 2779 // Compute type- and value-dependence. 2780 Expr *Index = IndexExprs[IndexIdx]; 2781 if (Index->isTypeDependent() || Index->isValueDependent()) 2782 ExprBits.ValueDependent = true; 2783 2784 // Propagate unexpanded parameter packs. 2785 if (Index->containsUnexpandedParameterPack()) 2786 ExprBits.ContainsUnexpandedParameterPack = true; 2787 2788 // Copy the index expressions into permanent storage. 2789 *Child++ = IndexExprs[IndexIdx++]; 2790 } else if (this->Designators[I].isArrayRangeDesignator()) { 2791 // Compute type- and value-dependence. 2792 Expr *Start = IndexExprs[IndexIdx]; 2793 Expr *End = IndexExprs[IndexIdx + 1]; 2794 if (Start->isTypeDependent() || Start->isValueDependent() || 2795 End->isTypeDependent() || End->isValueDependent()) 2796 ExprBits.ValueDependent = true; 2797 2798 // Propagate unexpanded parameter packs. 2799 if (Start->containsUnexpandedParameterPack() || 2800 End->containsUnexpandedParameterPack()) 2801 ExprBits.ContainsUnexpandedParameterPack = true; 2802 2803 // Copy the start/end expressions into permanent storage. 2804 *Child++ = IndexExprs[IndexIdx++]; 2805 *Child++ = IndexExprs[IndexIdx++]; 2806 } 2807 } 2808 2809 assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions"); 2810} 2811 2812DesignatedInitExpr * 2813DesignatedInitExpr::Create(ASTContext &C, Designator *Designators, 2814 unsigned NumDesignators, 2815 Expr **IndexExprs, unsigned NumIndexExprs, 2816 SourceLocation ColonOrEqualLoc, 2817 bool UsesColonSyntax, Expr *Init) { 2818 void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 2819 sizeof(Stmt *) * (NumIndexExprs + 1), 8); 2820 return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators, 2821 ColonOrEqualLoc, UsesColonSyntax, 2822 IndexExprs, NumIndexExprs, Init); 2823} 2824 2825DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C, 2826 unsigned NumIndexExprs) { 2827 void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 2828 sizeof(Stmt *) * (NumIndexExprs + 1), 8); 2829 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1); 2830} 2831 2832void DesignatedInitExpr::setDesignators(ASTContext &C, 2833 const Designator *Desigs, 2834 unsigned NumDesigs) { 2835 Designators = new (C) Designator[NumDesigs]; 2836 NumDesignators = NumDesigs; 2837 for (unsigned I = 0; I != NumDesigs; ++I) 2838 Designators[I] = Desigs[I]; 2839} 2840 2841SourceRange DesignatedInitExpr::getDesignatorsSourceRange() const { 2842 DesignatedInitExpr *DIE = const_cast<DesignatedInitExpr*>(this); 2843 if (size() == 1) 2844 return DIE->getDesignator(0)->getSourceRange(); 2845 return SourceRange(DIE->getDesignator(0)->getStartLocation(), 2846 DIE->getDesignator(size()-1)->getEndLocation()); 2847} 2848 2849SourceRange DesignatedInitExpr::getSourceRange() const { 2850 SourceLocation StartLoc; 2851 Designator &First = 2852 *const_cast<DesignatedInitExpr*>(this)->designators_begin(); 2853 if (First.isFieldDesignator()) { 2854 if (GNUSyntax) 2855 StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc); 2856 else 2857 StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc); 2858 } else 2859 StartLoc = 2860 SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc); 2861 return SourceRange(StartLoc, getInit()->getSourceRange().getEnd()); 2862} 2863 2864Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) { 2865 assert(D.Kind == Designator::ArrayDesignator && "Requires array designator"); 2866 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 2867 Ptr += sizeof(DesignatedInitExpr); 2868 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 2869 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 2870} 2871 2872Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) { 2873 assert(D.Kind == Designator::ArrayRangeDesignator && 2874 "Requires array range designator"); 2875 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 2876 Ptr += sizeof(DesignatedInitExpr); 2877 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 2878 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 2879} 2880 2881Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) { 2882 assert(D.Kind == Designator::ArrayRangeDesignator && 2883 "Requires array range designator"); 2884 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 2885 Ptr += sizeof(DesignatedInitExpr); 2886 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 2887 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2)); 2888} 2889 2890/// \brief Replaces the designator at index @p Idx with the series 2891/// of designators in [First, Last). 2892void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx, 2893 const Designator *First, 2894 const Designator *Last) { 2895 unsigned NumNewDesignators = Last - First; 2896 if (NumNewDesignators == 0) { 2897 std::copy_backward(Designators + Idx + 1, 2898 Designators + NumDesignators, 2899 Designators + Idx); 2900 --NumNewDesignators; 2901 return; 2902 } else if (NumNewDesignators == 1) { 2903 Designators[Idx] = *First; 2904 return; 2905 } 2906 2907 Designator *NewDesignators 2908 = new (C) Designator[NumDesignators - 1 + NumNewDesignators]; 2909 std::copy(Designators, Designators + Idx, NewDesignators); 2910 std::copy(First, Last, NewDesignators + Idx); 2911 std::copy(Designators + Idx + 1, Designators + NumDesignators, 2912 NewDesignators + Idx + NumNewDesignators); 2913 Designators = NewDesignators; 2914 NumDesignators = NumDesignators - 1 + NumNewDesignators; 2915} 2916 2917ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc, 2918 Expr **exprs, unsigned nexprs, 2919 SourceLocation rparenloc) 2920 : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary, 2921 false, false, false), 2922 NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) { 2923 2924 Exprs = new (C) Stmt*[nexprs]; 2925 for (unsigned i = 0; i != nexprs; ++i) { 2926 if (exprs[i]->isTypeDependent()) 2927 ExprBits.TypeDependent = true; 2928 if (exprs[i]->isValueDependent()) 2929 ExprBits.ValueDependent = true; 2930 if (exprs[i]->containsUnexpandedParameterPack()) 2931 ExprBits.ContainsUnexpandedParameterPack = true; 2932 2933 Exprs[i] = exprs[i]; 2934 } 2935} 2936 2937const OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) { 2938 if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e)) 2939 e = ewc->getSubExpr(); 2940 e = cast<CXXConstructExpr>(e)->getArg(0); 2941 while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e)) 2942 e = ice->getSubExpr(); 2943 return cast<OpaqueValueExpr>(e); 2944} 2945 2946//===----------------------------------------------------------------------===// 2947// ExprIterator. 2948//===----------------------------------------------------------------------===// 2949 2950Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); } 2951Expr* ExprIterator::operator*() const { return cast<Expr>(*I); } 2952Expr* ExprIterator::operator->() const { return cast<Expr>(*I); } 2953const Expr* ConstExprIterator::operator[](size_t idx) const { 2954 return cast<Expr>(I[idx]); 2955} 2956const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); } 2957const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); } 2958 2959//===----------------------------------------------------------------------===// 2960// Child Iterators for iterating over subexpressions/substatements 2961//===----------------------------------------------------------------------===// 2962 2963// UnaryExprOrTypeTraitExpr 2964Stmt::child_range UnaryExprOrTypeTraitExpr::children() { 2965 // If this is of a type and the type is a VLA type (and not a typedef), the 2966 // size expression of the VLA needs to be treated as an executable expression. 2967 // Why isn't this weirdness documented better in StmtIterator? 2968 if (isArgumentType()) { 2969 if (const VariableArrayType* T = dyn_cast<VariableArrayType>( 2970 getArgumentType().getTypePtr())) 2971 return child_range(child_iterator(T), child_iterator()); 2972 return child_range(); 2973 } 2974 return child_range(&Argument.Ex, &Argument.Ex + 1); 2975} 2976 2977// ObjCMessageExpr 2978Stmt::child_range ObjCMessageExpr::children() { 2979 Stmt **begin; 2980 if (getReceiverKind() == Instance) 2981 begin = reinterpret_cast<Stmt **>(this + 1); 2982 else 2983 begin = reinterpret_cast<Stmt **>(getArgs()); 2984 return child_range(begin, 2985 reinterpret_cast<Stmt **>(getArgs() + getNumArgs())); 2986} 2987 2988// Blocks 2989BlockDeclRefExpr::BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK, 2990 SourceLocation l, bool ByRef, 2991 bool constAdded) 2992 : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary, false, false, 2993 d->isParameterPack()), 2994 D(d), Loc(l), IsByRef(ByRef), ConstQualAdded(constAdded) 2995{ 2996 bool TypeDependent = false; 2997 bool ValueDependent = false; 2998 computeDeclRefDependence(D, getType(), TypeDependent, ValueDependent); 2999 ExprBits.TypeDependent = TypeDependent; 3000 ExprBits.ValueDependent = ValueDependent; 3001} 3002 3003