Expr.cpp revision a779d9ca2fdf1247f65de0e6acf2870d8be53ccd
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Expr.cpp - Expression AST Node Implementation --------------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the Expr class and subclasses. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 14c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Expr.h" 150979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor#include "clang/AST/ExprCXX.h" 16a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner#include "clang/AST/APValue.h" 172eadfb638eb1bb6ccfd6fd0453e764d47e27eed9Chris Lattner#include "clang/AST/ASTContext.h" 18a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner#include "clang/AST/DeclObjC.h" 1998cd599ee8a9b259ed7388ee2921a20d97658864Douglas Gregor#include "clang/AST/DeclCXX.h" 20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 2119cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtVisitor.h" 2308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Lex/LiteralSupport.h" 2408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Lex/Lexer.h" 251b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 2608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Basic/SourceManager.h" 27da5a6b6d9fd52899499d5b7b46273ec844dcaa6eChris Lattner#include "clang/Basic/TargetInfo.h" 28cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor#include "llvm/Support/ErrorHandling.h" 293a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson#include "llvm/Support/raw_ostream.h" 30ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor#include <algorithm> 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 33bef0efd11bc4430a3ee437a3213cec5c18af855aChris Lattnervoid Expr::ANCHOR() {} // key function for Expr class. 34bef0efd11bc4430a3ee437a3213cec5c18af855aChris Lattner 352b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// isKnownToHaveBooleanValue - Return true if this is an integer expression 362b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// that is known to return 0 or 1. This happens for _Bool/bool expressions 372b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// but also int expressions which are produced by things like comparisons in 382b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// C. 392b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattnerbool Expr::isKnownToHaveBooleanValue() const { 402b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner // If this value has _Bool type, it is obvious 0/1. 412b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner if (getType()->isBooleanType()) return true; 42c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // If this is a non-scalar-integer type, we don't care enough to try. 432ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (!getType()->isIntegralOrEnumerationType()) return false; 44c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 452b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) 462b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return PE->getSubExpr()->isKnownToHaveBooleanValue(); 47c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 482b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(this)) { 492b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner switch (UO->getOpcode()) { 502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 522b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return UO->getSubExpr()->isKnownToHaveBooleanValue(); 532b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner default: 542b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return false; 552b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner } 562b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner } 57c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 586907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall // Only look through implicit casts. If the user writes 596907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall // '(int) (a && b)' treat it as an arbitrary int. 606907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(this)) 612b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return CE->getSubExpr()->isKnownToHaveBooleanValue(); 62c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 632b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(this)) { 642b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner switch (BO->getOpcode()) { 652b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner default: return false; 662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: // Relational operators. 672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: 682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: 692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: 702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: // Equality operators. 712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: 722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LAnd: // AND operator. 732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LOr: // Logical OR operator. 742b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return true; 75c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_And: // Bitwise AND operator. 772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Xor: // Bitwise XOR operator. 782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Or: // Bitwise OR operator. 792b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner // Handle things like (x==2)|(y==12). 802b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return BO->getLHS()->isKnownToHaveBooleanValue() && 812b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner BO->getRHS()->isKnownToHaveBooleanValue(); 82c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Comma: 842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Assign: 852b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return BO->getRHS()->isKnownToHaveBooleanValue(); 862b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner } 872b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner } 88c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 892b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(this)) 902b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return CO->getTrueExpr()->isKnownToHaveBooleanValue() && 912b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner CO->getFalseExpr()->isKnownToHaveBooleanValue(); 92c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 932b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner return false; 942b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner} 952b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions. 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 100d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallvoid ExplicitTemplateArgumentList::initializeFrom( 101d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Info) { 102d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall LAngleLoc = Info.getLAngleLoc(); 103d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall RAngleLoc = Info.getRAngleLoc(); 104d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall NumTemplateArgs = Info.size(); 105d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 106d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentLoc *ArgBuffer = getTemplateArgs(); 107d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned i = 0; i != NumTemplateArgs; ++i) 108d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]); 109d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall} 110d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 111bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorvoid ExplicitTemplateArgumentList::initializeFrom( 112bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo &Info, 113bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool &Dependent, 114bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool &ContainsUnexpandedParameterPack) { 115bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor LAngleLoc = Info.getLAngleLoc(); 116bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor RAngleLoc = Info.getRAngleLoc(); 117bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NumTemplateArgs = Info.size(); 118bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 119bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor TemplateArgumentLoc *ArgBuffer = getTemplateArgs(); 120bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned i = 0; i != NumTemplateArgs; ++i) { 121bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Dependent = Dependent || Info[i].getArgument().isDependent(); 122bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ContainsUnexpandedParameterPack 123bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor = ContainsUnexpandedParameterPack || 124bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Info[i].getArgument().containsUnexpandedParameterPack(); 125bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 126bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]); 127bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 128bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor} 129bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 130d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallvoid ExplicitTemplateArgumentList::copyInto( 131d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo &Info) const { 132d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Info.setLAngleLoc(LAngleLoc); 133d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Info.setRAngleLoc(RAngleLoc); 134d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall for (unsigned I = 0; I != NumTemplateArgs; ++I) 135d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Info.addArgument(getTemplateArgs()[I]); 136d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall} 137d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 1388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstd::size_t ExplicitTemplateArgumentList::sizeFor(unsigned NumTemplateArgs) { 1398dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis return sizeof(ExplicitTemplateArgumentList) + 1408dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis sizeof(TemplateArgumentLoc) * NumTemplateArgs; 1418dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis} 1428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 143d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallstd::size_t ExplicitTemplateArgumentList::sizeFor( 144d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &Info) { 1458dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis return sizeFor(Info.size()); 146d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall} 147d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 1480da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregorvoid DeclRefExpr::computeDependence() { 1498e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.TypeDependent = false; 1508e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = false; 151c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1520da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor NamedDecl *D = getDecl(); 1530da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor 1540da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (TD) C++ [temp.dep.expr]p3: 1550da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // An id-expression is type-dependent if it contains: 1560da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // 157c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // and 1580da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // 1590da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (VD) C++ [temp.dep.constexpr]p2: 1600da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // An identifier is value-dependent if it is: 1610da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor 1620da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (TD) - an identifier that was declared with dependent type 1630da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (VD) - a name declared with a dependent type, 1640da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor if (getType()->isDependentType()) { 1658e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.TypeDependent = true; 1668e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 1670da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor } 1680da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (TD) - a conversion-function-id that specifies a dependent type 169c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt else if (D->getDeclName().getNameKind() 1700da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor == DeclarationName::CXXConversionFunctionName && 1710da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor D->getDeclName().getCXXNameType()->isDependentType()) { 1728e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.TypeDependent = true; 1738e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 1740da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor } 1750da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (TD) - a template-id that is dependent, 176096832c5ed5b9106fa177ebc148489760c3bc496John McCall else if (hasExplicitTemplateArgs() && 1770da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor TemplateSpecializationType::anyDependentTemplateArguments( 178c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt getTemplateArgs(), 1790da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor getNumTemplateArgs())) { 1808e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.TypeDependent = true; 1818e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 1820da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor } 1830da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (VD) - the name of a non-type template parameter, 1840da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor else if (isa<NonTypeTemplateParmDecl>(D)) 1858e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 1860da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (VD) - a constant with integral or enumeration type and is 1870da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // initialized with an expression that is value-dependent. 1880da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor else if (VarDecl *Var = dyn_cast<VarDecl>(D)) { 1892ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (Var->getType()->isIntegralOrEnumerationType() && 190501edb6a54524555ad27fbf41a7920dc756b08c6Douglas Gregor Var->getType().getCVRQualifiers() == Qualifiers::Const) { 19131310a21fb2a9f13950f864f681c86080b05d5b2Sebastian Redl if (const Expr *Init = Var->getAnyInitializer()) 192501edb6a54524555ad27fbf41a7920dc756b08c6Douglas Gregor if (Init->isValueDependent()) 1938e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 194bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor } 195bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor // (VD) - FIXME: Missing from the standard: 196bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor // - a member function or a static data member of the current 197bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor // instantiation 198bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor else if (Var->isStaticDataMember() && 1997ed5bd3e27a6f2b37ee0449aa818116cbd03306eDouglas Gregor Var->getDeclContext()->isDependentContext()) 2008e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 201bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor } 202bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor // (VD) - FIXME: Missing from the standard: 203bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor // - a member function or a static data member of the current 204bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor // instantiation 205bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor else if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) 2068e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 2070da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (TD) - a nested-name-specifier or a qualified-id that names a 2080da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // member of an unknown specialization. 2090da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor // (handled by DependentScopeDeclRefExpr) 210bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 21110738d36b150aa65206890c1c845cdba076e4200Douglas Gregor // Determine whether this expression contains any unexpanded parameter 21210738d36b150aa65206890c1c845cdba076e4200Douglas Gregor // packs. 21310738d36b150aa65206890c1c845cdba076e4200Douglas Gregor // Is the declaration a parameter pack? 2141fe85ea697fb5c85acded3ac0ddbc19f89c2e181Douglas Gregor if (D->isParameterPack()) 2151fe85ea697fb5c85acded3ac0ddbc19f89c2e181Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 2160da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor} 2170da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor 218c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntDeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier, 219a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 220dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *D, SourceLocation NameLoc, 221d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *TemplateArgs, 222f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK) 223bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false), 224a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor DecoratedD(D, 225a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor (Qualifier? HasQualifierFlag : 0) | 226d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)), 227a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Loc(NameLoc) { 228a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (Qualifier) { 229a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NameQualifier *NQ = getNameQualifier(); 230a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NQ->NNS = Qualifier; 231a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NQ->Range = QualifierRange; 232a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 233c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 234d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (TemplateArgs) 235096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().initializeFrom(*TemplateArgs); 236a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 2370da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor computeDependence(); 238a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor} 239a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 2402577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier, 2412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange QualifierRange, 2422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ValueDecl *D, const DeclarationNameInfo &NameInfo, 2432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const TemplateArgumentListInfo *TemplateArgs, 244f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK) 245bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false), 2462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DecoratedD(D, 2472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara (Qualifier? HasQualifierFlag : 0) | 2482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)), 2492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) { 2502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (Qualifier) { 2512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NameQualifier *NQ = getNameQualifier(); 2522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NQ->NNS = Qualifier; 2532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NQ->Range = QualifierRange; 2542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 2552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (TemplateArgs) 257096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().initializeFrom(*TemplateArgs); 2582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara computeDependence(); 2602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 2612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 262a2813cec2605ce7878d1b13471d685f689b251afDouglas GregorDeclRefExpr *DeclRefExpr::Create(ASTContext &Context, 263a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier, 264a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 265dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *D, 266a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation NameLoc, 2670da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor QualType T, 268f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 2690da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor const TemplateArgumentListInfo *TemplateArgs) { 2702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return Create(Context, Qualifier, QualifierRange, D, 2712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo(D->getDeclName(), NameLoc), 272f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall T, VK, TemplateArgs); 2732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 2742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 2752577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclRefExpr *DeclRefExpr::Create(ASTContext &Context, 2762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NestedNameSpecifier *Qualifier, 2772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange QualifierRange, 2782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ValueDecl *D, 2792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara QualType T, 281f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 2822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const TemplateArgumentListInfo *TemplateArgs) { 283a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor std::size_t Size = sizeof(DeclRefExpr); 284a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (Qualifier != 0) 285a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Size += sizeof(NameQualifier); 286c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 287d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (TemplateArgs) 288d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs); 289c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2903248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>()); 2912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return new (Mem) DeclRefExpr(Qualifier, QualifierRange, D, NameInfo, 292f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TemplateArgs, T, VK); 293a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor} 294a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 295663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios KyrtzidisDeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context, bool HasQualifier, 296663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis unsigned NumTemplateArgs) { 297663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis std::size_t Size = sizeof(DeclRefExpr); 298663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis if (HasQualifier) 299663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis Size += sizeof(NameQualifier); 300663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 301663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis if (NumTemplateArgs) 302663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis Size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs); 303663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 3043248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>()); 305663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis return new (Mem) DeclRefExpr(EmptyShell()); 306663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis} 307663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 308a2813cec2605ce7878d1b13471d685f689b251afDouglas GregorSourceRange DeclRefExpr::getSourceRange() const { 3092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange R = getNameInfo().getSourceRange(); 310a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (hasQualifier()) 311a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor R.setBegin(getQualifierRange().getBegin()); 312096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (hasExplicitTemplateArgs()) 313a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor R.setEnd(getRAngleLoc()); 314a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return R; 315a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor} 316a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3173a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// FIXME: Maybe this should use DeclPrinter with a special "print predefined 3183a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// expr" policy instead. 319848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlssonstd::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) { 320848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson ASTContext &Context = CurrentDecl->getASTContext(); 321848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson 3223a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) { 323848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual) 3243a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return FD->getNameAsString(); 3253a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3263a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::SmallString<256> Name; 3273a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::raw_svector_ostream Out(Name); 3283a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3293a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 330848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson if (MD->isVirtual() && IT != PrettyFunctionNoVirtual) 3313a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << "virtual "; 3324eadcc569223135e13353c9381b448986e3f7053Sam Weinig if (MD->isStatic()) 3334eadcc569223135e13353c9381b448986e3f7053Sam Weinig Out << "static "; 3343a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 3353a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3363a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson PrintingPolicy Policy(Context.getLangOptions()); 3373a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3383a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson std::string Proto = FD->getQualifiedNameAsString(Policy); 3393a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 340183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *AFT = FD->getType()->getAs<FunctionType>(); 3413a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson const FunctionProtoType *FT = 0; 3423a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FD->hasWrittenPrototype()) 3433a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson FT = dyn_cast<FunctionProtoType>(AFT); 3443a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3453a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Proto += "("; 3463a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FT) { 3473a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::raw_string_ostream POut(Proto); 3483a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) { 3493a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (i) POut << ", "; 3503a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson std::string Param; 3513a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy); 3523a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson POut << Param; 3533a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 3543a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3553a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FT->isVariadic()) { 3563a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FD->getNumParams()) POut << ", "; 3573a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson POut << "..."; 3583a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 3593a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 3603a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Proto += ")"; 3613a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3624eadcc569223135e13353c9381b448986e3f7053Sam Weinig if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 3634eadcc569223135e13353c9381b448986e3f7053Sam Weinig Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers()); 3644eadcc569223135e13353c9381b448986e3f7053Sam Weinig if (ThisQuals.hasConst()) 3654eadcc569223135e13353c9381b448986e3f7053Sam Weinig Proto += " const"; 3664eadcc569223135e13353c9381b448986e3f7053Sam Weinig if (ThisQuals.hasVolatile()) 3674eadcc569223135e13353c9381b448986e3f7053Sam Weinig Proto += " volatile"; 3684eadcc569223135e13353c9381b448986e3f7053Sam Weinig } 3694eadcc569223135e13353c9381b448986e3f7053Sam Weinig 3703a1ce1ed0f5686384e712837bad28c576622e442Sam Weinig if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD)) 3713a1ce1ed0f5686384e712837bad28c576622e442Sam Weinig AFT->getResultType().getAsStringInternal(Proto, Policy); 3723a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3733a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << Proto; 3743a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3753a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out.flush(); 3763a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return Name.str().str(); 3773a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 3783a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) { 3793a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::SmallString<256> Name; 3803a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::raw_svector_ostream Out(Name); 3813a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << (MD->isInstanceMethod() ? '-' : '+'); 3823a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << '['; 383b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek 384b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek // For incorrect code, there might not be an ObjCInterfaceDecl. Do 385b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek // a null check to avoid a crash. 386b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek if (const ObjCInterfaceDecl *ID = MD->getClassInterface()) 387900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer Out << ID; 388b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek 3893a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const ObjCCategoryImplDecl *CID = 390900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) 391900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer Out << '(' << CID << ')'; 392900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer 3933a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << ' '; 3943a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << MD->getSelector().getAsString(); 3953a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << ']'; 3963a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 3973a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out.flush(); 3983a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return Name.str().str(); 3993a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 4003a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) { 4013a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string. 4023a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return "top level"; 4033a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 4043a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return ""; 4053a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson} 4063a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 4079996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisvoid APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) { 4089996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis if (hasAllocation()) 4099996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis C.Deallocate(pVal); 4109996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 4119996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis BitWidth = Val.getBitWidth(); 4129996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis unsigned NumWords = Val.getNumWords(); 4139996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis const uint64_t* Words = Val.getRawData(); 4149996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis if (NumWords > 1) { 4159996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis pVal = new (C) uint64_t[NumWords]; 4169996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis std::copy(Words, Words + NumWords, pVal); 4179996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } else if (NumWords == 1) 4189996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis VAL = Words[0]; 4199996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis else 4209996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis VAL = 0; 4219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis} 4229996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 4239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral * 4249996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral::Create(ASTContext &C, const llvm::APInt &V, 4259996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis QualType type, SourceLocation l) { 4269996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return new (C) IntegerLiteral(C, V, type, l); 4279996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis} 4289996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 4299996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral * 4309996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral::Create(ASTContext &C, EmptyShell Empty) { 4319996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return new (C) IntegerLiteral(Empty); 4329996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis} 4339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 4349996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral * 4359996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V, 4369996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis bool isexact, QualType Type, SourceLocation L) { 4379996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return new (C) FloatingLiteral(C, V, isexact, Type, L); 4389996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis} 4399996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 4409996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral * 4419996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral::Create(ASTContext &C, EmptyShell Empty) { 4429996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return new (C) FloatingLiteral(Empty); 4439996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis} 4449996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 445da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// getValueAsApproximateDouble - This returns the value as an inaccurate 446da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// double. Note that this may cause loss of precision, but is useful for 447da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// debugging dumps, etc. 448da8249e57f3badecf925571881fe57243935c6c1Chris Lattnerdouble FloatingLiteral::getValueAsApproximateDouble() const { 449da8249e57f3badecf925571881fe57243935c6c1Chris Lattner llvm::APFloat V = getValue(); 450ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen bool ignored; 451ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, 452ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen &ignored); 453da8249e57f3badecf925571881fe57243935c6c1Chris Lattner return V.convertToDouble(); 454da8249e57f3badecf925571881fe57243935c6c1Chris Lattner} 455da8249e57f3badecf925571881fe57243935c6c1Chris Lattner 4562085fd6cd22ec5c268175251db10d7c60caf7aaaChris LattnerStringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData, 4572085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner unsigned ByteLength, bool Wide, 4582085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner QualType Ty, 4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const SourceLocation *Loc, 460a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson unsigned NumStrs) { 4612085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner // Allocate enough space for the StringLiteral plus an array of locations for 4622085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner // any concatenated string tokens. 4632085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner void *Mem = C.Allocate(sizeof(StringLiteral)+ 4642085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner sizeof(SourceLocation)*(NumStrs-1), 4653248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner llvm::alignOf<StringLiteral>()); 4662085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner StringLiteral *SL = new (Mem) StringLiteral(Ty); 4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // OPTIMIZE: could allocate this appended to the StringLiteral. 4692085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner char *AStrData = new (C, 1) char[ByteLength]; 4702085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner memcpy(AStrData, StrData, ByteLength); 4712085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->StrData = AStrData; 4722085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->ByteLength = ByteLength; 4732085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->IsWide = Wide; 4742085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->TokLocs[0] = Loc[0]; 4752085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->NumConcatenated = NumStrs; 4765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 477726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner if (NumStrs != 1) 4782085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1)); 4792085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner return SL; 480726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner} 481726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner 482673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas GregorStringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) { 483673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor void *Mem = C.Allocate(sizeof(StringLiteral)+ 484673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor sizeof(SourceLocation)*(NumStrs-1), 4853248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner llvm::alignOf<StringLiteral>()); 486673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor StringLiteral *SL = new (Mem) StringLiteral(QualType()); 487673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor SL->StrData = 0; 488673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor SL->ByteLength = 0; 489673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor SL->NumConcatenated = NumStrs; 490673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor return SL; 491673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor} 492673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 493b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbarvoid StringLiteral::setString(ASTContext &C, llvm::StringRef Str) { 494b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar char *AStrData = new (C, 1) char[Str.size()]; 495b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar memcpy(AStrData, Str.data(), Str.size()); 496673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor StrData = AStrData; 497b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar ByteLength = Str.size(); 498673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor} 499673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 50008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// getLocationOfByte - Return a source location that points to the specified 50108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// byte of this string literal. 50208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// 50308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// Strings are amazingly complex. They can be formed from multiple tokens and 50408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// can have escape sequences in them in addition to the usual trigraph and 50508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// escaped newline business. This routine handles this complexity. 50608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// 50708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris LattnerSourceLocation StringLiteral:: 50808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris LattnergetLocationOfByte(unsigned ByteNo, const SourceManager &SM, 50908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner const LangOptions &Features, const TargetInfo &Target) const { 51008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner assert(!isWide() && "This doesn't work for wide strings yet"); 51108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 51208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Loop over all of the tokens in this string until we find the one that 51308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // contains the byte we're looking for. 51408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner unsigned TokNo = 0; 51508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner while (1) { 51608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner assert(TokNo < getNumConcatenated() && "Invalid byte number!"); 51708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner SourceLocation StrTokLoc = getStrTokenLoc(TokNo); 51808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 51908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Get the spelling of the string so that we can get the data that makes up 52008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // the string literal, not the identifier for the macro it is potentially 52108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // expanded through. 52208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc); 52308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 52408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Re-lex the token to get its length and original spelling. 52508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc); 52608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner bool Invalid = false; 52708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner llvm::StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid); 52808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner if (Invalid) 52908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner return StrTokSpellingLoc; 53008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 53108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner const char *StrData = Buffer.data()+LocInfo.second; 53208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 53308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Create a langops struct and enable trigraphs. This is sufficient for 53408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // relexing tokens. 53508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner LangOptions LangOpts; 53608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner LangOpts.Trigraphs = true; 53708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 53808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Create a lexer starting at the beginning of this token. 53908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner Lexer TheLexer(StrTokSpellingLoc, Features, Buffer.begin(), StrData, 54008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner Buffer.end()); 54108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner Token TheTok; 54208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner TheLexer.LexFromRawLexer(TheTok); 54308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 54408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Use the StringLiteralParser to compute the length of the string in bytes. 54508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner StringLiteralParser SLP(&TheTok, 1, SM, Features, Target); 54608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner unsigned TokNumBytes = SLP.GetStringLength(); 54708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 54808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // If the byte is in this token, return the location of the byte. 54908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner if (ByteNo < TokNumBytes || 55008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) { 55108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo); 55208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 55308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Now that we know the offset of the token in the spelling, use the 55408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // preprocessor to get the offset in the original source. 55508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features); 55608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner } 55708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 55808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner // Move to the next string token. 55908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner ++TokNo; 56008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner ByteNo -= TokNumBytes; 56108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner } 56208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner} 56308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 56408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 56508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "sizeof" or "[pre]++". 5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *UnaryOperator::getOpcodeStr(Opcode Op) { 5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Op) { 5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown unary operator"); 5712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostInc: return "++"; 5722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostDec: return "--"; 5732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreInc: return "++"; 5742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreDec: return "--"; 5752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_AddrOf: return "&"; 5762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Deref: return "*"; 5772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: return "+"; 5782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: return "-"; 5792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Not: return "~"; 5802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_LNot: return "!"; 5812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: return "__real"; 5822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: return "__imag"; 5832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: return "__extension__"; 5845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCallUnaryOperatorKind 588bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorUnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) { 589bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor switch (OO) { 590bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor default: assert(false && "No unary operator for overloaded function"); 5912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_PlusPlus: return Postfix ? UO_PostInc : UO_PreInc; 5922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec; 5932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Amp: return UO_AddrOf; 5942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Star: return UO_Deref; 5952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Plus: return UO_Plus; 5962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Minus: return UO_Minus; 5972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Tilde: return UO_Not; 5982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Exclaim: return UO_LNot; 599bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor } 600bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor} 601bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 602bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorOverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) { 603bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor switch (Opc) { 6042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostInc: case UO_PreInc: return OO_PlusPlus; 6052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostDec: case UO_PreDec: return OO_MinusMinus; 6062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_AddrOf: return OO_Amp; 6072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Deref: return OO_Star; 6082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: return OO_Plus; 6092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: return OO_Minus; 6102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Not: return OO_Tilde; 6112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_LNot: return OO_Exclaim; 612bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor default: return OO_None; 613bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor } 614bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor} 615bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 616bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 6185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators. 6195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 621668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args, 622f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall unsigned numargs, QualType t, ExprValueKind VK, 623f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall SourceLocation rparenloc) 624f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(SC, t, VK, OK_Ordinary, 625bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor fn->isTypeDependent(), 626bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor fn->isValueDependent(), 627bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor fn->containsUnexpandedParameterPack()), 628898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor NumArgs(numargs) { 6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 630668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek SubExprs = new (C) Stmt*[numargs+1]; 631b4609806e9232593ece09ce08b630836e825865cDouglas Gregor SubExprs[FN] = fn; 632bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned i = 0; i != numargs; ++i) { 633bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isTypeDependent()) 634bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 635bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isValueDependent()) 636bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 637bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->containsUnexpandedParameterPack()) 638bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 639bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 640b4609806e9232593ece09ce08b630836e825865cDouglas Gregor SubExprs[i+ARGS_START] = args[i]; 641bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 642668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 643b4609806e9232593ece09ce08b630836e825865cDouglas Gregor RParenLoc = rparenloc; 644b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 645e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman 646668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, 647f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType t, ExprValueKind VK, SourceLocation rparenloc) 648f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CallExprClass, t, VK, OK_Ordinary, 649bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor fn->isTypeDependent(), 650bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor fn->isValueDependent(), 651bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor fn->containsUnexpandedParameterPack()), 652898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor NumArgs(numargs) { 653668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 654668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek SubExprs = new (C) Stmt*[numargs+1]; 65577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek SubExprs[FN] = fn; 656bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned i = 0; i != numargs; ++i) { 657bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isTypeDependent()) 658bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 659bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isValueDependent()) 660bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 661bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->containsUnexpandedParameterPack()) 662bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 663bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 66477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek SubExprs[i+ARGS_START] = args[i]; 665bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 666668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer RParenLoc = rparenloc; 6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty) 6711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(SC, Empty), SubExprs(0), NumArgs(0) { 672bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // FIXME: Why do we allocate this? 6731f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor SubExprs = new (C) Stmt*[1]; 6741f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor} 6751f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 676d20254f2875d0004c57ee766f258dbcee29f4841Nuno LopesDecl *CallExpr::getCalleeDecl() { 677a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu Expr *CEE = getCallee()->IgnoreParenCasts(); 678200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl // If we're calling a dereference, look at the pointer instead. 679200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) { 680200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl if (BO->isPtrMemOp()) 681200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl CEE = BO->getRHS()->IgnoreParenCasts(); 682200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) { 683200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl if (UO->getOpcode() == UO_Deref) 684200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl CEE = UO->getSubExpr()->IgnoreParenCasts(); 685200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl } 6866346f963145ed18b6edf50a78753b47db505e912Chris Lattner if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) 687d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes return DRE->getDecl(); 688cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE)) 689cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes return ME->getMemberDecl(); 690a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 691a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu return 0; 692a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu} 693a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 694d20254f2875d0004c57ee766f258dbcee29f4841Nuno LopesFunctionDecl *CallExpr::getDirectCallee() { 695caabf9bf331156e96dacb072385901fdfa057ec1Chris Lattner return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); 696d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes} 697d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes 698d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// setNumArgs - This changes the number of arguments present in this call. 699d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// Any orphaned expressions are deleted by this, and any new operands are set 700d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// to null. 7018189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenekvoid CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) { 702d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // No change, just return. 703d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner if (NumArgs == getNumArgs()) return; 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 705d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // If shrinking # arguments, just delete the extras and forgot them. 706d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner if (NumArgs < getNumArgs()) { 707d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner this->NumArgs = NumArgs; 708d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner return; 709d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner } 710d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner 711d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // Otherwise, we are growing the # arguments. New an bigger argument array. 71268a049cab6015a7437bec5661601b7d37d23c70cDaniel Dunbar Stmt **NewSubExprs = new (C) Stmt*[NumArgs+1]; 713d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // Copy over args. 714d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i) 715d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner NewSubExprs[i] = SubExprs[i]; 716d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // Null out new args. 717d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i) 718d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner NewSubExprs[i] = 0; 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72088c9a46f0b84f1ee83e01917825346551ee540d0Douglas Gregor if (SubExprs) C.Deallocate(SubExprs); 721d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner SubExprs = NewSubExprs; 722d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner this->NumArgs = NumArgs; 723d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner} 724d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner 725cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 726cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// not, return 0. 7274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned CallExpr::isBuiltinCall(const ASTContext &Context) const { 728c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff // All simple function calls (e.g. func()) are implicitly cast to pointer to 7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // function. As a result, we try and obtain the DeclRefExpr from the 730c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff // ImplicitCastExpr. 731c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee()); 732c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()). 733cb888967400a03504c88acedd5248d6778a82f46Chris Lattner return 0; 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 735c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()); 736c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff if (!DRE) 737cb888967400a03504c88acedd5248d6778a82f46Chris Lattner return 0; 7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 739bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 740bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson if (!FDecl) 741cb888967400a03504c88acedd5248d6778a82f46Chris Lattner return 0; 7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7434fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor if (!FDecl->getIdentifier()) 7444fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor return 0; 7454fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor 7467814e6d6645d587891293d59ecf6576defcfac92Douglas Gregor return FDecl->getBuiltinID(); 747cb888967400a03504c88acedd5248d6778a82f46Chris Lattner} 748bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson 7496dde78f744382a5627a04f984a97049e0c4b5e73Anders CarlssonQualType CallExpr::getCallReturnType() const { 7506dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson QualType CalleeType = getCallee()->getType(); 7516217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>()) 7526dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson CalleeType = FnTypePtr->getPointeeType(); 7536217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>()) 7546dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson CalleeType = BPT->getPointeeType(); 7555291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor else if (const MemberPointerType *MPT 7565291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor = CalleeType->getAs<MemberPointerType>()) 7575291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor CalleeType = MPT->getPointeeType(); 7585291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 759183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *FnType = CalleeType->getAs<FunctionType>(); 7606dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson return FnType->getResultType(); 7616dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson} 762cb888967400a03504c88acedd5248d6778a82f46Chris Lattner 763c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntOffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type, 7648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation OperatorLoc, 765c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt TypeSourceInfo *tsi, 766c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode* compsPtr, unsigned numComps, 7678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr** exprsPtr, unsigned numExprs, 7688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc) { 7698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void *Mem = C.Allocate(sizeof(OffsetOfExpr) + 770c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt sizeof(OffsetOfNode) * numComps + 7718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor sizeof(Expr*) * numExprs); 7728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 7738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps, 7748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor exprsPtr, numExprs, RParenLoc); 7758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 7768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 7778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorOffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C, 7788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned numComps, unsigned numExprs) { 7798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void *Mem = C.Allocate(sizeof(OffsetOfExpr) + 7808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor sizeof(OffsetOfNode) * numComps + 7818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor sizeof(Expr*) * numExprs); 7828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return new (Mem) OffsetOfExpr(numComps, numExprs); 7838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 7848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 785c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntOffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type, 7868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation OperatorLoc, TypeSourceInfo *tsi, 787c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode* compsPtr, unsigned numComps, 7888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr** exprsPtr, unsigned numExprs, 7898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc) 790f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary, 791f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /*TypeDependent=*/false, 792bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ValueDependent=*/tsi->getType()->isDependentType(), 793bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor tsi->getType()->containsUnexpandedParameterPack()), 794c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi), 795c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt NumComps(numComps), NumExprs(numExprs) 7968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor{ 7978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for(unsigned i = 0; i < numComps; ++i) { 7988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor setComponent(i, compsPtr[i]); 7998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 800c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for(unsigned i = 0; i < numExprs; ++i) { 802bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent()) 803bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 804bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (exprsPtr[i]->containsUnexpandedParameterPack()) 805bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 806bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 8078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor setIndexExpr(i, exprsPtr[i]); 8088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 8098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 8108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 8118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorIdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const { 8128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(getKind() == Field || getKind() == Identifier); 8138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (getKind() == Field) 8148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return getField()->getIdentifier(); 815c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask); 8178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 8188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 8191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpMemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow, 8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *qual, 82183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange qualrange, 822f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *memberdecl, 823161755a09898c95d21bfff33707da9ca41cd53c5John McCall DeclAccessPair founddecl, 8242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo nameinfo, 825d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *targs, 826f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType ty, 827f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind vk, 828f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprObjectKind ok) { 82983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor std::size_t Size = sizeof(MemberExpr); 8306bb8017bb9e828d118e15e59d71c66bba323c364John McCall 831161755a09898c95d21bfff33707da9ca41cd53c5John McCall bool hasQualOrFound = (qual != 0 || 832161755a09898c95d21bfff33707da9ca41cd53c5John McCall founddecl.getDecl() != memberdecl || 833161755a09898c95d21bfff33707da9ca41cd53c5John McCall founddecl.getAccess() != memberdecl->getAccess()); 8346bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (hasQualOrFound) 8356bb8017bb9e828d118e15e59d71c66bba323c364John McCall Size += sizeof(MemberNameQualifier); 8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 837d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall if (targs) 838d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall Size += ExplicitTemplateArgumentList::sizeFor(*targs); 8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8403248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>()); 841f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo, 842f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ty, vk, ok); 8436bb8017bb9e828d118e15e59d71c66bba323c364John McCall 8446bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (hasQualOrFound) { 8456bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (qual && qual->isDependent()) { 8466bb8017bb9e828d118e15e59d71c66bba323c364John McCall E->setValueDependent(true); 8476bb8017bb9e828d118e15e59d71c66bba323c364John McCall E->setTypeDependent(true); 8486bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 8496bb8017bb9e828d118e15e59d71c66bba323c364John McCall E->HasQualifierOrFoundDecl = true; 8506bb8017bb9e828d118e15e59d71c66bba323c364John McCall 8516bb8017bb9e828d118e15e59d71c66bba323c364John McCall MemberNameQualifier *NQ = E->getMemberQualifier(); 8526bb8017bb9e828d118e15e59d71c66bba323c364John McCall NQ->NNS = qual; 8536bb8017bb9e828d118e15e59d71c66bba323c364John McCall NQ->Range = qualrange; 8546bb8017bb9e828d118e15e59d71c66bba323c364John McCall NQ->FoundDecl = founddecl; 8556bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 8566bb8017bb9e828d118e15e59d71c66bba323c364John McCall 8576bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (targs) { 8586bb8017bb9e828d118e15e59d71c66bba323c364John McCall E->HasExplicitTemplateArgumentList = true; 859096832c5ed5b9106fa177ebc148489760c3bc496John McCall E->getExplicitTemplateArgs().initializeFrom(*targs); 8606bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 8616bb8017bb9e828d118e15e59d71c66bba323c364John McCall 8626bb8017bb9e828d118e15e59d71c66bba323c364John McCall return E; 86383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor} 86483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 865f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlssonconst char *CastExpr::getCastKindName() const { 866f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson switch (getCastKind()) { 867daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_Dependent: 868daa8e4e888758d55a7a759dd4a91b83921cef222John McCall return "Dependent"; 8692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_BitCast: 870f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "BitCast"; 8712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_LValueBitCast: 872e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor return "LValueBitCast"; 8730ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall case CK_LValueToRValue: 8740ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall return "LValueToRValue"; 875f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall case CK_GetObjCProperty: 876f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall return "GetObjCProperty"; 8772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_NoOp: 878f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "NoOp"; 8792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_BaseToDerived: 88011de6de25a0110cd7be97eef761ef3b189781da6Anders Carlsson return "BaseToDerived"; 8812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_DerivedToBase: 882f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "DerivedToBase"; 8832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_UncheckedDerivedToBase: 88423cba801e11b03929c44f8cf54578305963a3476John McCall return "UncheckedDerivedToBase"; 8852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_Dynamic: 886f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "Dynamic"; 8872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ToUnion: 888f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "ToUnion"; 8892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ArrayToPointerDecay: 890f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "ArrayToPointerDecay"; 8912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_FunctionToPointerDecay: 892f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "FunctionToPointerDecay"; 8932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_NullToMemberPointer: 894f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "NullToMemberPointer"; 895404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall case CK_NullToPointer: 896404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall return "NullToPointer"; 8972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_BaseToDerivedMemberPointer: 898f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "BaseToDerivedMemberPointer"; 8992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_DerivedToBaseMemberPointer: 9001a31a18db9d657751f38c724adc0d62e86852bd7Anders Carlsson return "DerivedToBaseMemberPointer"; 9012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_UserDefinedConversion: 902f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "UserDefinedConversion"; 9032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ConstructorConversion: 904f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "ConstructorConversion"; 9052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_IntegralToPointer: 9067f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson return "IntegralToPointer"; 9072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_PointerToIntegral: 9087f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson return "PointerToIntegral"; 909daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_PointerToBoolean: 910daa8e4e888758d55a7a759dd4a91b83921cef222John McCall return "PointerToBoolean"; 9112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ToVoid: 912ebeaf2031c968143c531bfe232d7507f20c57347Anders Carlsson return "ToVoid"; 9132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_VectorSplat: 91416a8904f3f5ed19158657e1da95e5902fbee66f7Anders Carlsson return "VectorSplat"; 9152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_IntegralCast: 91682debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson return "IntegralCast"; 917daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_IntegralToBoolean: 918daa8e4e888758d55a7a759dd4a91b83921cef222John McCall return "IntegralToBoolean"; 9192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_IntegralToFloating: 92082debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson return "IntegralToFloating"; 9212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_FloatingToIntegral: 92282debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson return "FloatingToIntegral"; 9232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_FloatingCast: 924c6b29163557d02da5d2a4a06f986f0480291f51fBenjamin Kramer return "FloatingCast"; 925daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_FloatingToBoolean: 926daa8e4e888758d55a7a759dd4a91b83921cef222John McCall return "FloatingToBoolean"; 9272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_MemberPointerToBoolean: 928bc0e0781da778bd5eb41a810419912893ae20448Anders Carlsson return "MemberPointerToBoolean"; 9292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_AnyPointerToObjCPointerCast: 9304cbf9d43cc47bb7a070c5c5026521d7d6a8f73c7Fariborz Jahanian return "AnyPointerToObjCPointerCast"; 9312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_AnyPointerToBlockPointerCast: 9323b27f1a80e4e433b503efd344c909eeafaa9033cFariborz Jahanian return "AnyPointerToBlockPointerCast"; 9332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case CK_ObjCObjectLValueCast: 934569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor return "ObjCObjectLValueCast"; 9352bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_FloatingRealToComplex: 9362bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall return "FloatingRealToComplex"; 937f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToReal: 938f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return "FloatingComplexToReal"; 939f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToBoolean: 940f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return "FloatingComplexToBoolean"; 9412bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_FloatingComplexCast: 9422bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall return "FloatingComplexCast"; 943f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToIntegralComplex: 944f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return "FloatingComplexToIntegralComplex"; 9452bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_IntegralRealToComplex: 9462bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall return "IntegralRealToComplex"; 947f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToReal: 948f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return "IntegralComplexToReal"; 949f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToBoolean: 950f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return "IntegralComplexToBoolean"; 9512bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_IntegralComplexCast: 9522bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall return "IntegralComplexCast"; 953f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToFloatingComplex: 954f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall return "IntegralComplexToFloatingComplex"; 955f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson } 9561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9572bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall llvm_unreachable("Unhandled cast kind!"); 958f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return 0; 959f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson} 960f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson 9616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas GregorExpr *CastExpr::getSubExprAsWritten() { 9626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor Expr *SubExpr = 0; 9636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor CastExpr *E = this; 9646eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor do { 9656eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor SubExpr = E->getSubExpr(); 966c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 9676eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor // Skip any temporary bindings; they're implicit. 9686eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr)) 9696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor SubExpr = Binder->getSubExpr(); 970c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 9716eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor // Conversions by constructor and conversion functions have a 9726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor // subexpression describing the call; strip it off. 9732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (E->getCastKind() == CK_ConstructorConversion) 9746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0); 9752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall else if (E->getCastKind() == CK_UserDefinedConversion) 9766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument(); 977c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 9786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor // If the subexpression we're left with is an implicit cast, look 9796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor // through that, too. 980c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr))); 981c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 9826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return SubExpr; 9836eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor} 9846eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 985f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXBaseSpecifier **CastExpr::path_buffer() { 986f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall switch (getStmtClass()) { 987f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define ABSTRACT_STMT(x) 988f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define CASTEXPR(Type, Base) \ 989f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall case Stmt::Type##Class: \ 990f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1); 991f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define STMT(Type, Base) 992f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#include "clang/AST/StmtNodes.inc" 993f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall default: 994f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall llvm_unreachable("non-cast expressions not possible here"); 995f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return 0; 996f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall } 997f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 998f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 999f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallvoid CastExpr::setCastPath(const CXXCastPath &Path) { 1000f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall assert(Path.size() == path_size()); 1001f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*)); 1002f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 1003f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1004f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T, 1005f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind Kind, Expr *Operand, 1006f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 10075baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) { 1008f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize = (BasePath ? BasePath->size() : 0); 1009f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 1010f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1011f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ImplicitCastExpr *E = 10125baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK); 1013f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (PathSize) E->setCastPath(*BasePath); 1014f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return E; 1015f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 1016f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1017f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C, 1018f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize) { 1019f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 1020f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1021f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize); 1022f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 1023f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1024f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1025f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T, 1026f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind K, Expr *Op, 1027f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 1028f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *WrittenTy, 1029f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SourceLocation L, SourceLocation R) { 1030f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize = (BasePath ? BasePath->size() : 0); 1031f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 1032f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1033f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CStyleCastExpr *E = 1034f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R); 1035f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall if (PathSize) E->setCastPath(*BasePath); 1036f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return E; 1037f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 1038f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1039f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 1040f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void *Buffer = 1041f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1042f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize); 1043f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall} 1044f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 10455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 10465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "<<=". 10475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *BinaryOperator::getOpcodeStr(Opcode Op) { 10485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Op) { 10492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemD: return ".*"; 10502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_PtrMemI: return "->*"; 10512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Mul: return "*"; 10522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Div: return "/"; 10532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Rem: return "%"; 10542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Add: return "+"; 10552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Sub: return "-"; 10562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shl: return "<<"; 10572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Shr: return ">>"; 10582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LT: return "<"; 10592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GT: return ">"; 10602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LE: return "<="; 10612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_GE: return ">="; 10622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_EQ: return "=="; 10632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_NE: return "!="; 10642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_And: return "&"; 10652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Xor: return "^"; 10662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Or: return "|"; 10672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LAnd: return "&&"; 10682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LOr: return "||"; 10692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Assign: return "="; 10702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_MulAssign: return "*="; 10712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_DivAssign: return "/="; 10722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_RemAssign: return "%="; 10732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AddAssign: return "+="; 10742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_SubAssign: return "-="; 10752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShlAssign: return "<<="; 10762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_ShrAssign: return ">>="; 10772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_AndAssign: return "&="; 10782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_XorAssign: return "^="; 10792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_OrAssign: return "|="; 10802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Comma: return ","; 10815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1082baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor 1083baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor return ""; 10845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCallBinaryOperatorKind 1087063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorBinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) { 1088063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor switch (OO) { 1089b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner default: assert(false && "Not an overloadable binary operator"); 10902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Plus: return BO_Add; 10912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Minus: return BO_Sub; 10922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Star: return BO_Mul; 10932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Slash: return BO_Div; 10942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Percent: return BO_Rem; 10952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Caret: return BO_Xor; 10962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Amp: return BO_And; 10972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Pipe: return BO_Or; 10982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Equal: return BO_Assign; 10992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Less: return BO_LT; 11002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Greater: return BO_GT; 11012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_PlusEqual: return BO_AddAssign; 11022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_MinusEqual: return BO_SubAssign; 11032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_StarEqual: return BO_MulAssign; 11042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_SlashEqual: return BO_DivAssign; 11052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_PercentEqual: return BO_RemAssign; 11062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_CaretEqual: return BO_XorAssign; 11072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_AmpEqual: return BO_AndAssign; 11082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_PipeEqual: return BO_OrAssign; 11092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_LessLess: return BO_Shl; 11102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_GreaterGreater: return BO_Shr; 11112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_LessLessEqual: return BO_ShlAssign; 11122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_GreaterGreaterEqual: return BO_ShrAssign; 11132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_EqualEqual: return BO_EQ; 11142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_ExclaimEqual: return BO_NE; 11152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_LessEqual: return BO_LE; 11162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_GreaterEqual: return BO_GE; 11172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_AmpAmp: return BO_LAnd; 11182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_PipePipe: return BO_LOr; 11192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_Comma: return BO_Comma; 11202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case OO_ArrowStar: return BO_PtrMemI; 1121063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor } 1122063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor} 1123063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 1124063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorOverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) { 1125063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor static const OverloadedOperatorKind OverOps[] = { 1126063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /* .* Cannot be overloaded */OO_None, OO_ArrowStar, 1127063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Star, OO_Slash, OO_Percent, 1128063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Plus, OO_Minus, 1129063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_LessLess, OO_GreaterGreater, 1130063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual, 1131063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_EqualEqual, OO_ExclaimEqual, 1132063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Amp, 1133063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Caret, 1134063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Pipe, 1135063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_AmpAmp, 1136063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_PipePipe, 1137063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Equal, OO_StarEqual, 1138063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_SlashEqual, OO_PercentEqual, 1139063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_PlusEqual, OO_MinusEqual, 1140063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_LessLessEqual, OO_GreaterGreaterEqual, 1141063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_AmpEqual, OO_CaretEqual, 1142063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_PipeEqual, 1143063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Comma 1144063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor }; 1145063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor return OverOps[Opc]; 1146063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor} 1147063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 1148709210feee317b8d6690dd1d15c2b74cfe55e261Ted KremenekInitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc, 1149418f6c7d142e5ff4607f70cd8431d008442bafe9Chris Lattner Expr **initExprs, unsigned numInits, 11504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceLocation rbraceloc) 1151bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false, 1152bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 1153709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprs(C, numInits), 11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0), 1155c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt UnionFieldInit(0), HadArrayRangeDesignator(false) 1156c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt{ 1157ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek for (unsigned I = 0; I != numInits; ++I) { 1158ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek if (initExprs[I]->isTypeDependent()) 11598e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.TypeDependent = true; 1160ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek if (initExprs[I]->isValueDependent()) 11618e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = true; 1162bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (initExprs[I]->containsUnexpandedParameterPack()) 1163bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 116473460a32bc5299a5927d23d2e464d72af796eabfDouglas Gregor } 1165c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1166709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits); 116766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 11685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1169709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenekvoid InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) { 1170ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek if (NumInits > InitExprs.size()) 1171709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprs.reserve(C, NumInits); 1172fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor} 1173fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 1174709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenekvoid InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) { 1175709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprs.resize(C, NumInits, 0); 11764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 11774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1178709210feee317b8d6690dd1d15c2b74cfe55e261Ted KremenekExpr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) { 1179ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek if (Init >= InitExprs.size()) { 1180709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0); 1181ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek InitExprs.back() = expr; 1182ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek return 0; 11834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *Result = cast_or_null<Expr>(InitExprs[Init]); 11864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitExprs[Init] = expr; 11874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 11884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 11894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 1190c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted KremenekSourceRange InitListExpr::getSourceRange() const { 1191c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek if (SyntacticForm) 1192c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek return SyntacticForm->getSourceRange(); 1193c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek SourceLocation Beg = LBraceLoc, End = RBraceLoc; 1194c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek if (Beg.isInvalid()) { 1195c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek // Find the first non-null initializer. 1196c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek for (InitExprsTy::const_iterator I = InitExprs.begin(), 1197c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek E = InitExprs.end(); 1198c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek I != E; ++I) { 1199c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek if (Stmt *S = *I) { 1200c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek Beg = S->getLocStart(); 1201c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek break; 1202c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek } 1203c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek } 1204c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek } 1205c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek if (End.isInvalid()) { 1206c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek // Find the first non-null initializer from the end. 1207c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(), 1208c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek E = InitExprs.rend(); 1209c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek I != E; ++I) { 1210c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek if (Stmt *S = *I) { 1211c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek End = S->getSourceRange().getEnd(); 1212c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek break; 1213c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek } 1214c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek } 1215c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek } 1216c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek return SourceRange(Beg, End); 1217c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek} 1218c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek 1219bfdcae678d44906293e21c0cddc6537f3ee8b5a4Steve Naroff/// getFunctionType - Return the underlying function type for this block. 12204eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff/// 12214eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffconst FunctionType *BlockExpr::getFunctionType() const { 12226217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek return getType()->getAs<BlockPointerType>()-> 1223183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall getPointeeType()->getAs<FunctionType>(); 12244eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 12254eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 12261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSourceLocation BlockExpr::getCaretLocation() const { 12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return TheBlock->getCaretLocation(); 122856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst Stmt *BlockExpr::getBody() const { 12307297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor return TheBlock->getBody(); 12317297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor} 12321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt *BlockExpr::getBody() { 12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return TheBlock->getBody(); 12347297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor} 123556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 123656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 12375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 12385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Generic Expression Routines 12395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 12405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1241026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// isUnusedResultAWarning - Return true if this immediate expression should 1242026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// be warned about if the result is unused. If so, fill in Loc and Ranges 1243026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// with location to warn on and the source range[s] to report with the 1244026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// warning. 1245026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerbool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1, 1246df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump SourceRange &R2, ASTContext &Ctx) const { 1247ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson // Don't warn if the expr is type dependent. The type could end up 1248ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson // instantiating to void. 1249ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson if (isTypeDependent()) 1250ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson return false; 12511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (getStmtClass()) { 12535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: 12540faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall if (getType()->isVoidType()) 12550faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall return false; 1256026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = getExprLoc(); 1257026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = getSourceRange(); 1258026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 12595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ParenExprClass: 1260026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return cast<ParenExpr>(this)->getSubExpr()-> 1261df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump isUnusedResultAWarning(Loc, R1, R2, Ctx); 12625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperatorClass: { 12635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const UnaryOperator *UO = cast<UnaryOperator>(this); 12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (UO->getOpcode()) { 1266026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner default: break; 12672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostInc: 12682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PostDec: 12692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreInc: 12702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_PreDec: // ++/-- 1271026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; // Not a warning. 12722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Deref: 12735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Dereferencing a volatile pointer is a side-effect. 1274df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Ctx.getCanonicalType(getType()).isVolatileQualified()) 1275026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1276026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner break; 12772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: 12782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: 12795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // accessing a piece of a volatile complex is a side-effect. 1280df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Ctx.getCanonicalType(UO->getSubExpr()->getType()) 1281df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump .isVolatileQualified()) 1282026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1283026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner break; 12842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 1285df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx); 12865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1287026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = UO->getOperatorLoc(); 1288026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = UO->getSubExpr()->getSourceRange(); 1289026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 12905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1291e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner case BinaryOperatorClass: { 1292026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner const BinaryOperator *BO = cast<BinaryOperator>(this); 1293c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek switch (BO->getOpcode()) { 1294c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek default: 1295c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek break; 129625973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis // Consider the RHS of comma for side effects. LHS was checked by 129725973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis // Sema::CheckCommaOperands. 12982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_Comma: 1299c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek // ((foo = <blah>), 0) is an idiom for hiding the result (and 1300c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek // lvalue-ness) of an assignment written in a macro. 1301c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek if (IntegerLiteral *IE = 1302c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens())) 1303c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek if (IE->getValue() == 0) 1304c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek return false; 130525973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx); 130625973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis // Consider '||', '&&' to have side effects if the LHS or RHS does. 13072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LAnd: 13082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case BO_LOr: 130925973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis if (!BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) || 131025973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis !BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx)) 131125973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis return false; 131225973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis break; 1313bf0ee354163f87623a4b60412544243911332343John McCall } 1314026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (BO->isAssignmentOp()) 1315026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1316026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = BO->getOperatorLoc(); 1317026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = BO->getLHS()->getSourceRange(); 1318026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = BO->getRHS()->getSourceRange(); 1319026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 1320e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner } 1321eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner case CompoundAssignOperatorClass: 1322c6dfe194f623b02c123759f235b504d4850fc178Douglas Gregor case VAArgExprClass: 1323026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 13245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1325ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian case ConditionalOperatorClass: { 1326026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // The condition must be evaluated, but if either the LHS or RHS is a 1327026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // warning, warn about them. 1328ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian const ConditionalOperator *Exp = cast<ConditionalOperator>(this); 13291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Exp->getLHS() && 1330df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx)) 1331026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 1332df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1333ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian } 1334ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian 13355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case MemberExprClass: 1336026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // If the base pointer or element is to a volatile pointer/field, accessing 1337026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // it is a side effect. 1338df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Ctx.getCanonicalType(getType()).isVolatileQualified()) 1339026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1340026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<MemberExpr>(this)->getMemberLoc(); 1341026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = SourceRange(Loc, Loc); 1342026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = cast<MemberExpr>(this)->getBase()->getSourceRange(); 1343026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ArraySubscriptExprClass: 13465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the base pointer or element is to a volatile pointer/field, accessing 1347026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // it is a side effect. 1348df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Ctx.getCanonicalType(getType()).isVolatileQualified()) 1349026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1350026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc(); 1351026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange(); 1352026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange(); 1353026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 1354211f6adf1301a1461015fb6cb08a05f0a35b65f3Eli Friedman 13555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case CallExprClass: 1356852871abbff45f1c1d3787755a27fce08365b166Eli Friedman case CXXOperatorCallExprClass: 1357852871abbff45f1c1d3787755a27fce08365b166Eli Friedman case CXXMemberCallExprClass: { 1358026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // If this is a direct call, get the callee. 1359026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner const CallExpr *CE = cast<CallExpr>(this); 1360d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes if (const Decl *FD = CE->getCalleeDecl()) { 1361026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // If the callee has attribute pure, const, or warn_unused_result, warn 1362026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // about it. void foo() { strlen("bar"); } should warn. 1363bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner // 1364bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner // Note: If new cases are added here, DiagnoseUnusedExprResult should be 1365bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner // updated to match for QoI. 1366bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner if (FD->getAttr<WarnUnusedResultAttr>() || 1367bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) { 1368bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner Loc = CE->getCallee()->getLocStart(); 1369bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner R1 = CE->getCallee()->getSourceRange(); 1370bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner 1371bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner if (unsigned NumArgs = CE->getNumArgs()) 1372bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner R2 = SourceRange(CE->getArg(0)->getLocStart(), 1373bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner CE->getArg(NumArgs-1)->getLocEnd()); 1374bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner return true; 1375bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner } 1376026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner } 1377026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1378026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner } 137958beed91d468863b8c85bce43425422703838d27Anders Carlsson 138058beed91d468863b8c85bce43425422703838d27Anders Carlsson case CXXTemporaryObjectExprClass: 138158beed91d468863b8c85bce43425422703838d27Anders Carlsson case CXXConstructExprClass: 138258beed91d468863b8c85bce43425422703838d27Anders Carlsson return false; 138358beed91d468863b8c85bce43425422703838d27Anders Carlsson 1384f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian case ObjCMessageExprClass: { 1385f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this); 1386f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian const ObjCMethodDecl *MD = ME->getMethodDecl(); 1387f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian if (MD && MD->getAttr<WarnUnusedResultAttr>()) { 1388f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian Loc = getExprLoc(); 1389f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian return true; 1390f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian } 1391026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 1392f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian } 13931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 139412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall case ObjCPropertyRefExprClass: 13955e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner Loc = getExprLoc(); 13965e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner R1 = getSourceRange(); 1397a50089ec68a583d13718107c1b0c898f0903709eChris Lattner return true; 139812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall 1399611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner case StmtExprClass: { 1400611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // Statement exprs don't logically have side effects themselves, but are 1401611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // sometimes used in macros in ways that give them a type that is unused. 1402611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // For example ({ blah; foo(); }) will end up with a type if foo has a type. 1403611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // however, if the result of the stmt expr is dead, we don't want to emit a 1404611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // warning. 1405611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt(); 1406d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis if (!CS->body_empty()) { 1407611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner if (const Expr *E = dyn_cast<Expr>(CS->body_back())) 1408df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return E->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1409d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back())) 1410d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt())) 1411d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis return E->isUnusedResultAWarning(Loc, R1, R2, Ctx); 1412d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis } 14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14140faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall if (getType()->isVoidType()) 14150faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall return false; 1416026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<StmtExpr>(this)->getLParenLoc(); 1417026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = getSourceRange(); 1418026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 1419611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner } 14206eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor case CStyleCastExprClass: 1421fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner // If this is an explicit cast to void, allow it. People do this when they 1422fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner // think they know what they're doing :). 1423026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (getType()->isVoidType()) 1424fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner return false; 1425026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<CStyleCastExpr>(this)->getLParenLoc(); 1426026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange(); 1427026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 142858beed91d468863b8c85bce43425422703838d27Anders Carlsson case CXXFunctionalCastExprClass: { 14290faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall if (getType()->isVoidType()) 14300faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall return false; 143158beed91d468863b8c85bce43425422703838d27Anders Carlsson const CastExpr *CE = cast<CastExpr>(this); 1432c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 143358beed91d468863b8c85bce43425422703838d27Anders Carlsson // If this is a cast to void or a constructor conversion, check the operand. 143458beed91d468863b8c85bce43425422703838d27Anders Carlsson // Otherwise, the result of the cast is unused. 14352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (CE->getCastKind() == CK_ToVoid || 14362de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CE->getCastKind() == CK_ConstructorConversion) 1437df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return (cast<CastExpr>(this)->getSubExpr() 1438df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump ->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 1439026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc(); 1440026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange(); 1441026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 144258beed91d468863b8c85bce43425422703838d27Anders Carlsson } 14431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14444be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman case ImplicitCastExprClass: 14454be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman // Check the operand, since implicit casts are inserted by Sema 1446df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return (cast<ImplicitCastExpr>(this) 1447df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 14484be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman 144904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner case CXXDefaultArgExprClass: 1450df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return (cast<CXXDefaultArgExpr>(this) 1451df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 14524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 14534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl case CXXNewExprClass: 14544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // FIXME: In theory, there might be new expressions that don't have side 14554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // effects (e.g. a placement new with an uninitialized POD). 14564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl case CXXDeleteExprClass: 1457026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 14582d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson case CXXBindTemporaryExprClass: 1459df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump return (cast<CXXBindTemporaryExpr>(this) 1460df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 14614765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall case ExprWithCleanupsClass: 14624765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall return (cast<ExprWithCleanups>(this) 1463df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx)); 14644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 14655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 14665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 146744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian/// isOBJCGCCandidate - Check if an expression is objc gc'able. 14687f4f86a2167abc116275e49c81350fc3225485e5Fariborz Jahanian/// returns true, if it is; false otherwise. 1469102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanianbool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { 147044baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian switch (getStmtClass()) { 147144baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian default: 147244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian return false; 147344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ObjCIvarRefExprClass: 147444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian return true; 1475207c5210eb0ac7b632609f0c006eb97ef2738948Fariborz Jahanian case Expr::UnaryOperatorClass: 1476102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<UnaryOperator>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 147744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ParenExprClass: 1478102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 147944baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ImplicitCastExprClass: 1480102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 148106b89124a9a5971a0528cc9da6817740bac43164Fariborz Jahanian case CStyleCastExprClass: 1482102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 1483a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor case DeclRefExprClass: { 148444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian const Decl *D = cast<DeclRefExpr>(this)->getDecl(); 1485102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 1486102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian if (VD->hasGlobalStorage()) 1487102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return true; 1488102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian QualType T = VD->getType(); 148959a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian // dereferencing to a pointer is always a gc'able candidate, 149059a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian // unless it is __weak. 14917e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar return T->isPointerType() && 14920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak); 1493102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian } 149444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian return false; 149544baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian } 149683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor case MemberExprClass: { 149744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian const MemberExpr *M = cast<MemberExpr>(this); 1498102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return M->getBase()->isOBJCGCCandidate(Ctx); 149944baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian } 150044baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ArraySubscriptExprClass: 1501102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(Ctx); 150244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian } 150344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian} 1504369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 150511ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidisbool Expr::isBoundMemberFunction(ASTContext &Ctx) const { 150611ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis if (isTypeDependent()) 150711ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis return false; 15087eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall return ClassifyLValue(Ctx) == Expr::LV_MemberFunction; 150911ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis} 151011ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis 1511369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1, 1512369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl Expr::CanThrowResult CT2) { 1513369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // CanThrowResult constants are ordered so that the maximum is the correct 1514369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // merge result. 1515369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT1 > CT2 ? CT1 : CT2; 1516369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl} 1517369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1518369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) { 1519369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl Expr *E = const_cast<Expr*>(CE); 1520369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl Expr::CanThrowResult R = Expr::CT_Cannot; 1521369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl for (Expr::child_iterator I = E->child_begin(), IE = E->child_end(); 1522369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl I != IE && R != Expr::CT_Can; ++I) { 1523369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C)); 1524369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1525369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return R; 1526369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl} 1527369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1528369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanCalleeThrow(const Decl *D, 1529369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl bool NullThrows = true) { 1530369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (!D) 1531369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return NullThrows ? Expr::CT_Can : Expr::CT_Cannot; 1532369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1533369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // See if we can get a function type from the decl somehow. 1534369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl const ValueDecl *VD = dyn_cast<ValueDecl>(D); 1535369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (!VD) // If we have no clue what we're calling, assume the worst. 1536369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Can; 1537369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 15385221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl // As an extension, we assume that __attribute__((nothrow)) functions don't 15395221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl // throw. 15405221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>()) 15415221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl return Expr::CT_Cannot; 15425221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl 1543369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl QualType T = VD->getType(); 1544369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl const FunctionProtoType *FT; 1545369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if ((FT = T->getAs<FunctionProtoType>())) { 1546369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } else if (const PointerType *PT = T->getAs<PointerType>()) 1547369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl FT = PT->getPointeeType()->getAs<FunctionProtoType>(); 1548369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 1549369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl FT = RT->getPointeeType()->getAs<FunctionProtoType>(); 1550369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl else if (const MemberPointerType *MT = T->getAs<MemberPointerType>()) 1551369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl FT = MT->getPointeeType()->getAs<FunctionProtoType>(); 1552369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl else if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) 1553369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl FT = BT->getPointeeType()->getAs<FunctionProtoType>(); 1554369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1555369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (!FT) 1556369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Can; 1557369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1558369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return FT->hasEmptyExceptionSpec() ? Expr::CT_Cannot : Expr::CT_Can; 1559369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl} 1560369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1561369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) { 1562369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (DC->isTypeDependent()) 1563369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Dependent; 1564369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1565295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl if (!DC->getTypeAsWritten()->isReferenceType()) 1566295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl return Expr::CT_Cannot; 1567295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl 1568369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot; 1569369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl} 1570369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1571369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanTypeidThrow(ASTContext &C, 1572369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl const CXXTypeidExpr *DC) { 1573369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (DC->isTypeOperand()) 1574369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Cannot; 1575369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1576369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl Expr *Op = DC->getExprOperand(); 1577369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (Op->isTypeDependent()) 1578369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Dependent; 1579369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1580369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl const RecordType *RT = Op->getType()->getAs<RecordType>(); 1581369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (!RT) 1582369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Cannot; 1583369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1584369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic()) 1585369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Cannot; 1586369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1587369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (Op->Classify(C).isPRValue()) 1588369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Cannot; 1589369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1590369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return Expr::CT_Can; 1591369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl} 1592369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1593369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian RedlExpr::CanThrowResult Expr::CanThrow(ASTContext &C) const { 1594369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // C++ [expr.unary.noexcept]p3: 1595369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // [Can throw] if in a potentially-evaluated context the expression would 1596369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // contain: 1597369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl switch (getStmtClass()) { 1598369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXThrowExprClass: 1599369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // - a potentially evaluated throw-expression 1600369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT_Can; 1601369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1602369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXDynamicCastExprClass: { 1603369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v), 1604369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // where T is a reference type, that requires a run-time check 1605369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CT = CanDynamicCastThrow(cast<CXXDynamicCastExpr>(this)); 1606369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (CT == CT_Can) 1607369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT; 1608369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1609369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1610369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1611369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXTypeidExprClass: 1612369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // - a potentially evaluated typeid expression applied to a glvalue 1613369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // expression whose type is a polymorphic class type 1614369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CanTypeidThrow(C, cast<CXXTypeidExpr>(this)); 1615369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1616369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // - a potentially evaluated call to a function, member function, function 1617369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // pointer, or member function pointer that does not have a non-throwing 1618369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // exception-specification 1619369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CallExprClass: 1620369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXOperatorCallExprClass: 1621369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXMemberCallExprClass: { 1622369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CT = CanCalleeThrow(cast<CallExpr>(this)->getCalleeDecl()); 1623369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (CT == CT_Can) 1624369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT; 1625369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1626369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1627369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1628295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl case CXXConstructExprClass: 1629295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl case CXXTemporaryObjectExprClass: { 1630369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CT = CanCalleeThrow( 1631369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl cast<CXXConstructExpr>(this)->getConstructor()); 1632369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (CT == CT_Can) 1633369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT; 1634369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1635369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1636369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1637369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXNewExprClass: { 1638369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CT = MergeCanThrow( 1639369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanCalleeThrow(cast<CXXNewExpr>(this)->getOperatorNew()), 1640369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanCalleeThrow(cast<CXXNewExpr>(this)->getConstructor(), 1641369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /*NullThrows*/false)); 1642369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (CT == CT_Can) 1643369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT; 1644369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1645369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1646369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1647369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXDeleteExprClass: { 1648369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CT = CanCalleeThrow( 1649369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl cast<CXXDeleteExpr>(this)->getOperatorDelete()); 1650369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (CT == CT_Can) 1651369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT; 16520b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl const Expr *Arg = cast<CXXDeleteExpr>(this)->getArgument(); 16530b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl // Unwrap exactly one implicit cast, which converts all pointers to void*. 16540b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl if (const ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(Arg)) 16550b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl Arg = Cast->getSubExpr(); 16560b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl if (const PointerType *PT = Arg->getType()->getAs<PointerType>()) { 16570b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>()) { 16580b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl CanThrowResult CT2 = CanCalleeThrow( 16590b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl cast<CXXRecordDecl>(RT->getDecl())->getDestructor()); 16600b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl if (CT2 == CT_Can) 16610b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl return CT2; 16620b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl CT = MergeCanThrow(CT, CT2); 16630b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl } 16640b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl } 16650b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 16660b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl } 16670b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl 16680b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl case CXXBindTemporaryExprClass: { 16690b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl // The bound temporary has to be destroyed again, which might throw. 16700b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl CanThrowResult CT = CanCalleeThrow( 16710b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl cast<CXXBindTemporaryExpr>(this)->getTemporary()->getDestructor()); 16720b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl if (CT == CT_Can) 16730b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl return CT; 1674369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1675369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1676369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1677369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // ObjC message sends are like function calls, but never have exception 1678369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // specs. 1679369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ObjCMessageExprClass: 1680369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ObjCPropertyRefExprClass: 1681369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT_Can; 1682369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1683369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // Many other things have subexpressions, so we have to test those. 1684369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // Some are simple: 1685369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ParenExprClass: 1686369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case MemberExprClass: 1687369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXReinterpretCastExprClass: 1688369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXConstCastExprClass: 1689369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ConditionalOperatorClass: 1690369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CompoundLiteralExprClass: 1691369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ExtVectorElementExprClass: 1692369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case InitListExprClass: 1693369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case DesignatedInitExprClass: 1694369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ParenListExprClass: 1695369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case VAArgExprClass: 1696369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXDefaultArgExprClass: 16974765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall case ExprWithCleanupsClass: 1698369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ObjCIvarRefExprClass: 1699369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ObjCIsaExprClass: 1700369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ShuffleVectorExprClass: 1701369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CanSubExprsThrow(C, this); 1702369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1703369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // Some might be dependent for other reasons. 1704369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case UnaryOperatorClass: 1705369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ArraySubscriptExprClass: 1706369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ImplicitCastExprClass: 1707369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CStyleCastExprClass: 1708369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXStaticCastExprClass: 1709369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXFunctionalCastExprClass: 1710369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case BinaryOperatorClass: 1711369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CompoundAssignOperatorClass: { 1712369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot; 1713369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return MergeCanThrow(CT, CanSubExprsThrow(C, this)); 1714369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1715369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1716369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms. 1717369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case StmtExprClass: 1718369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT_Can; 1719369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1720369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case ChooseExprClass: 1721369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl if (isTypeDependent() || isValueDependent()) 1722369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT_Dependent; 1723369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return cast<ChooseExpr>(this)->getChosenSubExpr(C)->CanThrow(C); 1724369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1725369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // Some expressions are always dependent. 1726369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case DependentScopeDeclRefExprClass: 1727369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXUnresolvedConstructExprClass: 1728369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl case CXXDependentScopeMemberExprClass: 1729369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT_Dependent; 1730369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 1731369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl default: 1732369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // All other expressions don't have subexpressions, or else they are 1733369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl // unevaluated. 1734369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl return CT_Cannot; 1735369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl } 1736369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl} 1737369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 17384e99a5fc3b203397a91136c6e695e405fb8fc606Ted KremenekExpr* Expr::IgnoreParens() { 17394e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek Expr* E = this; 1740b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara while (true) { 1741b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (ParenExpr* P = dyn_cast<ParenExpr>(E)) { 1742b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara E = P->getSubExpr(); 1743b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1744b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1745b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1746b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (P->getOpcode() == UO_Extension) { 1747b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara E = P->getSubExpr(); 1748b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1749b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1750b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1751b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara return E; 1752b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 17534e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek} 17544e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek 175556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 175656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// or CastExprs or ImplicitCastExprs, returning their operand. 175756f349400c5932a196509c0480ff6f99a9a0b48fChris LattnerExpr *Expr::IgnoreParenCasts() { 175856f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner Expr *E = this; 175956f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner while (true) { 1760b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (ParenExpr* P = dyn_cast<ParenExpr>(E)) { 176156f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner E = P->getSubExpr(); 1762b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1763b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1764b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (CastExpr *P = dyn_cast<CastExpr>(E)) { 176556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner E = P->getSubExpr(); 1766b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1767b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1768b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1769b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (P->getOpcode() == UO_Extension) { 1770b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara E = P->getSubExpr(); 1771b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1772b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1773b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1774b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara return E; 177556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner } 177656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner} 177756f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner 17789c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue 17799c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// casts. This is intended purely as a temporary workaround for code 17809c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// that hasn't yet been rewritten to do the right thing about those 17819c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// casts, and may disappear along with the last internal use. 1782f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallExpr *Expr::IgnoreParenLValueCasts() { 1783f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall Expr *E = this; 17849c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall while (true) { 1785f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1786f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall E = P->getSubExpr(); 1787f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall continue; 17889c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall } else if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1789f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (P->getCastKind() == CK_LValueToRValue) { 1790f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall E = P->getSubExpr(); 1791f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall continue; 1792f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 17939c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 17949c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall if (P->getOpcode() == UO_Extension) { 17959c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall E = P->getSubExpr(); 17969c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall continue; 17979c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall } 1798f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 1799f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall break; 1800f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 1801f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall return E; 1802f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall} 1803f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 18042fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCallExpr *Expr::IgnoreParenImpCasts() { 18052fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall Expr *E = this; 18062fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall while (true) { 1807b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 18082fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall E = P->getSubExpr(); 1809b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1810b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1811b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) { 18122fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall E = P->getSubExpr(); 1813b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1814b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1815b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1816b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (P->getOpcode() == UO_Extension) { 1817b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara E = P->getSubExpr(); 1818b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1819b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1820b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1821b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara return E; 18222fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall } 18232fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall} 18242fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall 1825ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 1826ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// value (including ptr->int casts of the same size). Strip off any 1827ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// ParenExpr or CastExprs, returning their operand. 1828ecdd84147c0765caa999ddc22dde25b42712bb4dChris LattnerExpr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) { 1829ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Expr *E = this; 1830ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner while (true) { 1831ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1832ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner E = P->getSubExpr(); 1833ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner continue; 1834ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1836ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1837ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner // We ignore integer <-> casts that are of the same width, ptr<->ptr and 18382ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor // ptr<->int casts of the same width. We also ignore all identity casts. 1839ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Expr *SE = P->getSubExpr(); 18401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1841ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) { 1842ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner E = SE; 1843ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner continue; 1844ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 18451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1846b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if ((E->getType()->isPointerType() || 18479d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor E->getType()->isIntegralType(Ctx)) && 1848b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara (SE->getType()->isPointerType() || 18499d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor SE->getType()->isIntegralType(Ctx)) && 1850ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) { 1851ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner E = SE; 1852ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner continue; 1853ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 1854ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1856b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 1857b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara if (P->getOpcode() == UO_Extension) { 1858b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara E = P->getSubExpr(); 1859b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara continue; 1860b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1861b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara } 1862b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara 1863ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner return E; 1864ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 1865ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner} 1866ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner 18676eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregorbool Expr::isDefaultArgument() const { 18686eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor const Expr *E = this; 18696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) 18706eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor E = ICE->getSubExprAsWritten(); 1871c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 18726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return isa<CXXDefaultArgExpr>(E); 18736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor} 1874ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner 18752f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor/// \brief Skip over any no-op casts and any temporary-binding 18762f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor/// expressions. 1877f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlssonstatic const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) { 18782f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 18792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (ICE->getCastKind() == CK_NoOp) 18802f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor E = ICE->getSubExpr(); 18812f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor else 18822f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor break; 18832f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 18842f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 18852f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E)) 18862f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor E = BE->getSubExpr(); 18872f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 18882f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 18892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (ICE->getCastKind() == CK_NoOp) 18902f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor E = ICE->getSubExpr(); 18912f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor else 18922f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor break; 18932f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 1894f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson 1895f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson return E->IgnoreParens(); 18962f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor} 18972f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 1898558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall/// isTemporaryObject - Determines if this expression produces a 1899558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall/// temporary of the given class type. 1900558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallbool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const { 1901558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy))) 1902558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall return false; 19032f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 1904f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this); 19052f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 190658277b57f9492d0234748be89bcad48b322c5cf7John McCall // Temporaries are by definition pr-values of class type. 1907db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian if (!E->Classify(C).isPRValue()) { 1908db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian // In this context, property reference is a message call and is pr-value. 190912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (!isa<ObjCPropertyRefExpr>(E)) 1910db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian return false; 1911db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian } 19122f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 191319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // Black-list a few cases which yield pr-values of class type that don't 191419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // refer to temporaries of that type: 191519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 191619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // - implicit derived-to-base conversions 1917558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall if (isa<ImplicitCastExpr>(E)) { 1918558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall switch (cast<ImplicitCastExpr>(E)->getCastKind()) { 1919558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall case CK_DerivedToBase: 1920558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall case CK_UncheckedDerivedToBase: 1921558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall return false; 1922558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall default: 1923558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall break; 1924558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall } 19252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor } 19262f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 192719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // - member expressions (all) 192819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall if (isa<MemberExpr>(E)) 192919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall return false; 193019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 1931558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall return true; 19322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor} 19332f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 1934898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyTypeDependentArguments - Determines if any of the expressions 1935898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is type-dependent. 1936898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) { 1937898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor for (unsigned I = 0; I < NumExprs; ++I) 1938898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor if (Exprs[I]->isTypeDependent()) 1939898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return true; 1940898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1941898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return false; 1942898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} 1943898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1944898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyValueDependentArguments - Determines if any of the expressions 1945898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is value-dependent. 1946898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) { 1947898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor for (unsigned I = 0; I < NumExprs; ++I) 1948898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor if (Exprs[I]->isValueDependent()) 1949898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return true; 1950898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1951898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return false; 1952898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} 1953898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 19544204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCallbool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const { 1955c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // This function is attempting whether an expression is an initializer 1956c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // which can be evaluated at compile-time. isEvaluatable handles most 1957c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // of the cases, but it can't deal with some initializer-specific 1958c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // expressions, and it can't deal with aggregates; we deal with those here, 1959c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // and fall back to isEvaluatable for the other cases. 1960c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman 19614204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // If we ever capture reference-binding directly in the AST, we can 19624204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // kill the second parameter. 19634204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall 19644204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall if (IsForRef) { 19654204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall EvalResult Result; 19664204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects; 19674204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall } 19681f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman 1969e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson switch (getStmtClass()) { 1970c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman default: break; 1971e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson case StringLiteralClass: 197214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff case ObjCStringLiteralClass: 1973eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner case ObjCEncodeExprClass: 1974e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson return true; 1975b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall case CXXTemporaryObjectExprClass: 1976b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall case CXXConstructExprClass: { 1977b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall const CXXConstructExpr *CE = cast<CXXConstructExpr>(this); 19784204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall 19794204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // Only if it's 19804204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // 1) an application of the trivial default constructor or 1981b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall if (!CE->getConstructor()->isTrivial()) return false; 19824204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall if (!CE->getNumArgs()) return true; 19834204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall 19844204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // 2) an elidable trivial copy construction of an operand which is 19854204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // itself a constant initializer. Note that we consider the 19864204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall // operand on its own, *not* as a reference binding. 19874204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return CE->isElidable() && 19884204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall CE->getArg(0)->isConstantInitializer(Ctx, false); 1989b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall } 199059b5da6d853b4368b984700315adf7b37de05764Nate Begeman case CompoundLiteralExprClass: { 19911f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // This handles gcc's extension that allows global initializers like 19921f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // "struct x {int x;} x = (struct x) {};". 19931f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This accepts other cases it shouldn't! 199459b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer(); 19954204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return Exp->isConstantInitializer(Ctx, false); 199659b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 1997e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson case InitListExprClass: { 19981f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This doesn't deal with fields with reference types correctly. 19991f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This incorrectly allows pointers cast to integers to be assigned 20001f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // to bitfields. 2001e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson const InitListExpr *Exp = cast<InitListExpr>(this); 2002e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson unsigned numInits = Exp->getNumInits(); 2003e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson for (unsigned i = 0; i < numInits; i++) { 20044204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall if (!Exp->getInit(i)->isConstantInitializer(Ctx, false)) 2005e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson return false; 2006e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson } 2007c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return true; 2008e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson } 20093498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor case ImplicitValueInitExprClass: 20103498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return true; 20113ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner case ParenExprClass: 20124204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return cast<ParenExpr>(this)->getSubExpr() 20134204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall ->isConstantInitializer(Ctx, IsForRef); 20145cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara case ChooseExprClass: 20155cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx) 20165cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara ->isConstantInitializer(Ctx, IsForRef); 2017c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman case UnaryOperatorClass: { 2018c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman const UnaryOperator* Exp = cast<UnaryOperator>(this); 20192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == UO_Extension) 20204204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return Exp->getSubExpr()->isConstantInitializer(Ctx, false); 2021c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman break; 2022c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman } 20233ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner case BinaryOperatorClass: { 20243ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner // Special case &&foo - &&bar. It would be nice to generalize this somehow 20253ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner // but this handles the common case. 20263ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner const BinaryOperator *Exp = cast<BinaryOperator>(this); 20272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Exp->getOpcode() == BO_Sub && 20283ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) && 20293ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx))) 20303ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner return true; 20313ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner break; 20323ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner } 20334204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall case CXXFunctionalCastExprClass: 2034b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall case CXXStaticCastExprClass: 203581045d8dcd967def69d8e0945566214a9fe9ffccChris Lattner case ImplicitCastExprClass: 2036c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman case CStyleCastExprClass: 2037c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // Handle casts with a destination that's a struct or union; this 2038c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // deals with both the gcc no-op struct cast extension and the 2039c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // cast-to-union extension. 2040c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman if (getType()->isRecordType()) 20414204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return cast<CastExpr>(this)->getSubExpr() 20424204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall ->isConstantInitializer(Ctx, false); 2043c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2044430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner // Integer->integer casts can be handled here, which is important for 2045430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner // things like (int)(&&x-&&y). Scary but true. 2046430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner if (getType()->isIntegerType() && 2047430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType()) 20484204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall return cast<CastExpr>(this)->getSubExpr() 20494204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall ->isConstantInitializer(Ctx, false); 2050c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2051c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman break; 2052e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson } 2053c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return isEvaluatable(Ctx); 205438374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff} 205538374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff 20565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isNullPointerConstant - C99 6.3.2.3p3 - Return true if this is either an 20575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// integer constant expression with the value zero, or if this is one that is 20585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// cast to void*. 2059ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregorbool Expr::isNullPointerConstant(ASTContext &Ctx, 2060ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NullPointerConstantValueDependence NPC) const { 2061ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor if (isValueDependent()) { 2062ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor switch (NPC) { 2063ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor case NPC_NeverValueDependent: 2064ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor assert(false && "Unexpected value dependent expression!"); 2065ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor // If the unthinkable happens, fall through to the safest alternative. 2066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2067ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor case NPC_ValueDependentIsNull: 20689d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor return isTypeDependent() || getType()->isIntegralType(Ctx); 2069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2070ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor case NPC_ValueDependentIsNotNull: 2071ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return false; 2072ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor } 2073ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor } 2074f515b2268f829adfbfdb751f54d102b53ed0285cDaniel Dunbar 20750777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Strip off a cast to void*, if it exists. Except in C++. 20760835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) { 20776215dee86c0e715b9f2b0d401ab2a5fcf629f1afSebastian Redl if (!Ctx.getLangOptions().CPlusPlus) { 20780777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Check that it is a cast to void*. 20796217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = CE->getType()->getAs<PointerType>()) { 20800777972d38a3125efed962b045704c30ae6965cfSebastian Redl QualType Pointee = PT->getPointeeType(); 20810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (!Pointee.hasQualifiers() && 20820777972d38a3125efed962b045704c30ae6965cfSebastian Redl Pointee->isVoidType() && // to void* 20830777972d38a3125efed962b045704c30ae6965cfSebastian Redl CE->getSubExpr()->getType()->isIntegerType()) // from int. 2084ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 20850777972d38a3125efed962b045704c30ae6965cfSebastian Redl } 20865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2087aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) { 2088aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // Ignore the ImplicitCastExpr type entirely. 2089ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2090aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) { 2091aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // Accept ((void*)0) as a null pointer constant, as many other 2092aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // implementations do. 2093ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (const CXXDefaultArgExpr *DefaultArg 20958123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner = dyn_cast<CXXDefaultArgExpr>(this)) { 209604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // See through default argument expressions 2097ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC); 20982d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor } else if (isa<GNUNullExpr>(this)) { 20992d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor // The GNU __null extension is always a null pointer constant. 21002d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor return true; 2101aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff } 21022d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 21036e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // C++0x nullptr_t is always a null pointer constant. 21046e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl if (getType()->isNullPtrType()) 21056e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl return true; 21066e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 2107ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian if (const RecordType *UT = getType()->getAsUnionType()) 2108ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) 2109ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){ 2110ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian const Expr *InitExpr = CLE->getInitializer(); 2111ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr)) 2112ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC); 2113ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian } 2114aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // This expression must be an integer type. 2115c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt if (!getType()->isIntegerType() || 211656fc0d18caf9c829647a5e3ce35197f0d7e0feeeFariborz Jahanian (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType())) 2117aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff return false; 21181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If we have an integer constant expression, we need to *evaluate* it and 21205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // test for the value 0. 212109de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman llvm::APSInt Result; 212209de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman return isIntegerConstantExpr(Result, Ctx) && Result == 0; 21235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 212431a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff 2125f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall/// \brief If this expression is an l-value for an Objective C 2126f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall/// property, find the underlying property reference expression. 2127f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallconst ObjCPropertyRefExpr *Expr::getObjCProperty() const { 2128f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall const Expr *E = this; 2129f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall while (true) { 2130f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall assert((E->getValueKind() == VK_LValue && 2131f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall E->getObjectKind() == OK_ObjCProperty) && 2132f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall "expression is not a property reference"); 2133f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall E = E->IgnoreParenCasts(); 2134f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { 2135f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (BO->getOpcode() == BO_Comma) { 2136f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall E = BO->getRHS(); 2137f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall continue; 2138f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 2139f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 2140f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 2141f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall break; 2142f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 2143f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 2144f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall return cast<ObjCPropertyRefExpr>(E); 2145f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall} 2146f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 214733bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas GregorFieldDecl *Expr::getBitField() { 21486f4a69a3107e7ff1569c747f7c6bdf7cff8cbf55Douglas Gregor Expr *E = this->IgnoreParens(); 214933bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor 2150de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2151f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall if (ICE->getCastKind() == CK_LValueToRValue || 2152f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp)) 2153de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor E = ICE->getSubExpr()->IgnoreParens(); 2154de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor else 2155de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor break; 2156de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor } 2157de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor 215827c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E)) 215986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl())) 216033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor if (Field->isBitField()) 216133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor return Field; 216233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor 21630f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) 21640f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl())) 21650f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis if (Field->isBitField()) 21660f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis return Field; 21670f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis 216833bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) 216933bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor if (BinOp->isAssignmentOp() && BinOp->getLHS()) 217033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor return BinOp->getLHS()->getBitField(); 217133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor 217233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor return 0; 217327c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor} 217427c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor 2175093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlssonbool Expr::refersToVectorElement() const { 2176093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson const Expr *E = this->IgnoreParens(); 2177c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2178093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 21795baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall if (ICE->getValueKind() != VK_RValue && 21802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall ICE->getCastKind() == CK_NoOp) 2181093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson E = ICE->getSubExpr()->IgnoreParens(); 2182093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson else 2183093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson break; 2184093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson } 2185c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 2186093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) 2187093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson return ASE->getBase()->getType()->isVectorType(); 2188093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson 2189093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson if (isa<ExtVectorElementExpr>(E)) 2190093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson return true; 2191093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson 2192093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson return false; 2193093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson} 2194093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson 21952140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// isArrow - Return true if the base expression is a pointer to vector, 21962140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// return false if the base expression is a vector. 21972140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattnerbool ExtVectorElementExpr::isArrow() const { 21982140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner return getBase()->getType()->isPointerType(); 21992140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner} 22002140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner 2201213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanunsigned ExtVectorElementExpr::getNumElements() const { 2202183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const VectorType *VT = getType()->getAs<VectorType>()) 22038a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman return VT->getNumElements(); 22048a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman return 1; 22054d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner} 22064d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner 22078a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// containsDuplicateElements - Return true if any element access is repeated. 2208213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanbool ExtVectorElementExpr::containsDuplicateElements() const { 2209a2b34eb7d19d1d199a244da20afe12353e3593acDaniel Dunbar // FIXME: Refactor this code to an accessor on the AST node which returns the 2210a2b34eb7d19d1d199a244da20afe12353e3593acDaniel Dunbar // "type" of component access, and share with code below and in Sema. 221101eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar llvm::StringRef Comp = Accessor->getName(); 2212190d6a25393995b42e32086949a68285ee423fb9Nate Begeman 2213190d6a25393995b42e32086949a68285ee423fb9Nate Begeman // Halving swizzles do not contain duplicate elements. 2214150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd") 2215190d6a25393995b42e32086949a68285ee423fb9Nate Begeman return false; 22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2217190d6a25393995b42e32086949a68285ee423fb9Nate Begeman // Advance past s-char prefix on hex swizzles. 2218150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar if (Comp[0] == 's' || Comp[0] == 'S') 2219150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar Comp = Comp.substr(1); 22201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2221150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar for (unsigned i = 0, e = Comp.size(); i != e; ++i) 2222150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos) 2223fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff return true; 2224150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar 2225fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff return false; 2226fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff} 2227b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner 22288a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. 22293b8d116703db8018f855cbb4733ace426422623bNate Begemanvoid ExtVectorElementExpr::getEncodedElementAccess( 22303b8d116703db8018f855cbb4733ace426422623bNate Begeman llvm::SmallVectorImpl<unsigned> &Elts) const { 22314b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar llvm::StringRef Comp = Accessor->getName(); 22324b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar if (Comp[0] == 's' || Comp[0] == 'S') 22334b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar Comp = Comp.substr(1); 22341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22354b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar bool isHi = Comp == "hi"; 22364b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar bool isLo = Comp == "lo"; 22374b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar bool isEven = Comp == "even"; 22384b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar bool isOdd = Comp == "odd"; 22391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22408a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman for (unsigned i = 0, e = getNumElements(); i != e; ++i) { 22418a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman uint64_t Index; 22421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22438a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman if (isHi) 22448a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = e + i; 22458a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else if (isLo) 22468a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = i; 22478a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else if (isEven) 22488a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = 2 * i; 22498a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else if (isOdd) 22508a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = 2 * i + 1; 22518a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else 22524b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar Index = ExtVectorType::getAccessorIdx(Comp[i]); 2253b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner 22543b8d116703db8018f855cbb4733ace426422623bNate Begeman Elts.push_back(Index); 2255b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner } 22568a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman} 22578a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman 225804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T, 2259f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 226004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation LBracLoc, 226104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation SuperLoc, 226204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor bool IsInstanceSuper, 226304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType SuperType, 2264c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Selector Sel, 2265f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelLoc, 226604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCMethodDecl *Method, 226704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr **Args, unsigned NumArgs, 226804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation RBracLoc) 2269f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, 2270bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*TypeDependent=*/false, /*ValueDependent=*/false, 2271bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 227204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass), 227304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor HasMethod(Method != 0), SuperLoc(SuperLoc), 227404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 227504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor : Sel.getAsOpaquePtr())), 2276f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2277c2350e553b853ad00914faf23fa731e5fc4a8a5cDouglas Gregor{ 227804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor setReceiverPointer(SuperType.getAsOpaquePtr()); 227904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (NumArgs) 228004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor memcpy(getArgs(), Args, NumArgs * sizeof(Expr *)); 228104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 228204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 228304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T, 2284f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 228504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation LBracLoc, 228604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor TypeSourceInfo *Receiver, 2287f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Selector Sel, 2288f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelLoc, 228904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCMethodDecl *Method, 229004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr **Args, unsigned NumArgs, 229104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation RBracLoc) 2292f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(), 2293bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor T->isDependentType(), T->containsUnexpandedParameterPack()), 229404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0), 229504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 229604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor : Sel.getAsOpaquePtr())), 2297f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 229804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor{ 229904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor setReceiverPointer(Receiver); 2300aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Expr **MyArgs = getArgs(); 2301bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned I = 0; I != NumArgs; ++I) { 2302bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->isTypeDependent()) 2303bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 2304bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->isValueDependent()) 2305bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2306bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->containsUnexpandedParameterPack()) 2307bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 2308bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 2309bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor MyArgs[I] = Args[I]; 2310bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 231104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 231204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 231304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T, 2314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 231504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation LBracLoc, 231604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr *Receiver, 2317c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Selector Sel, 2318f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelLoc, 231904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCMethodDecl *Method, 232004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr **Args, unsigned NumArgs, 232104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation RBracLoc) 2322f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(), 2323bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Receiver->isTypeDependent(), 2324bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Receiver->containsUnexpandedParameterPack()), 232504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0), 232604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 232704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor : Sel.getAsOpaquePtr())), 2328f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 232904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor{ 233004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor setReceiverPointer(Receiver); 2331aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Expr **MyArgs = getArgs(); 2332bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned I = 0; I != NumArgs; ++I) { 2333bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->isTypeDependent()) 2334bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 2335bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->isValueDependent()) 2336bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2337bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Args[I]->containsUnexpandedParameterPack()) 2338bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 2339bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 2340bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor MyArgs[I] = Args[I]; 2341bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 234204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 234304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 234404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2345f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 234604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation LBracLoc, 234704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation SuperLoc, 234804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor bool IsInstanceSuper, 234904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor QualType SuperType, 2350c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Selector Sel, 2351f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelLoc, 235204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCMethodDecl *Method, 235304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr **Args, unsigned NumArgs, 235404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation RBracLoc) { 2355c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 235604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs * sizeof(Expr *); 235704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2358f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper, 2359f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SuperType, Sel, SelLoc, Method, Args,NumArgs, 236004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor RBracLoc); 236104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 236204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 236304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2364f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 236504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation LBracLoc, 236604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor TypeSourceInfo *Receiver, 2367c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Selector Sel, 2368f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelLoc, 236904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCMethodDecl *Method, 237004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr **Args, unsigned NumArgs, 237104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation RBracLoc) { 2372c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 237304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs * sizeof(Expr *); 237404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2375f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc, 2376f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Method, Args, NumArgs, RBracLoc); 237704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 237804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 237904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2380f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 238104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation LBracLoc, 238204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr *Receiver, 2383f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Selector Sel, 2384f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis SourceLocation SelLoc, 238504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCMethodDecl *Method, 238604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Expr **Args, unsigned NumArgs, 238704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor SourceLocation RBracLoc) { 2388c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 238904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs * sizeof(Expr *); 239004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 2391f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc, 2392f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis Method, Args, NumArgs, RBracLoc); 239304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 239404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 2395c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context, 239604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor unsigned NumArgs) { 2397c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 239804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor NumArgs * sizeof(Expr *); 239904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment); 240004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs); 240104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 2402e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis 2403e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios KyrtzidisSourceRange ObjCMessageExpr::getReceiverRange() const { 2404e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis switch (getReceiverKind()) { 2405e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis case Instance: 2406e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis return getInstanceReceiver()->getSourceRange(); 2407e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis 2408e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis case Class: 2409e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange(); 2410e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis 2411e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis case SuperInstance: 2412e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis case SuperClass: 2413e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis return getSuperLoc(); 2414e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis } 2415e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis 2416e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis return SourceLocation(); 2417e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis} 2418e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis 241904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorSelector ObjCMessageExpr::getSelector() const { 242004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (HasMethod) 242104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod) 242204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ->getSelector(); 2423c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return Selector(SelectorOrMethod); 242404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor} 242504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 242604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const { 242704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (getReceiverKind()) { 242804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case Instance: 242904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr 243004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>()) 243104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return Ptr->getInterfaceDecl(); 243204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 24334df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek 243404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case Class: 2435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (const ObjCObjectType *Ty 2436c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall = getClassReceiver()->getAs<ObjCObjectType>()) 2437c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall return Ty->getInterface(); 243804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 24394df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek 244004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case SuperInstance: 244104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Ptr 244204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor = getSuperType()->getAs<ObjCObjectPointerType>()) 244304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return Ptr->getInterfaceDecl(); 244404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 2445c2350e553b853ad00914faf23fa731e5fc4a8a5cDouglas Gregor 244604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case SuperClass: 244704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (const ObjCObjectPointerType *Iface 244804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor = getSuperType()->getAs<ObjCObjectPointerType>()) 244904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return Iface->getInterfaceDecl(); 245004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 245104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 24520389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner 245304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return 0; 2454eb3b324800598cc3d5385fbad95ae5cff2c79113Ted Kremenek} 24550389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner 24564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ChooseExpr::isConditionTrue(const ASTContext &C) const { 24579a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman return getCond()->EvaluateAsInt(C) != 0; 245827437caadea35f84d550cd29f024fcf3ea240eecChris Lattner} 245927437caadea35f84d550cd29f024fcf3ea240eecChris Lattner 2460bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr, 2461bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor QualType Type, SourceLocation BLoc, 2462bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SourceLocation RP) 2463bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary, 2464bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Type->isDependentType(), Type->isDependentType(), 2465bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Type->containsUnexpandedParameterPack()), 2466bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr) 2467bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor{ 2468bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SubExprs = new (C) Stmt*[nexpr]; 2469bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned i = 0; i < nexpr; i++) { 2470bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isTypeDependent()) 2471bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 2472bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->isValueDependent()) 2473bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2474bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (args[i]->containsUnexpandedParameterPack()) 2475bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 2476bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 2477bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SubExprs[i] = args[i]; 2478bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 2479bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor} 2480bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 2481888376a2bbcfc2f047902249f8455918e2489ae1Nate Begemanvoid ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs, 2482888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman unsigned NumExprs) { 2483888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman if (SubExprs) C.Deallocate(SubExprs); 2484888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman 2485888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman SubExprs = new (C) Stmt* [NumExprs]; 248694cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor this->NumExprs = NumExprs; 248794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs); 24881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 2489888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman 249077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===// 249105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor// DesignatedInitExpr 249205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===// 249305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 249405c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorIdentifierInfo *DesignatedInitExpr::Designator::getFieldName() { 249505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 249605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field.NameOrField & 0x01) 249705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01); 249805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else 249905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return getField()->getIdentifier(); 250005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 250105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 2502c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntDesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty, 2503319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor unsigned NumDesignators, 2504ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Designators, 25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EqualOrColonLoc, 2506ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor bool GNUSyntax, 25071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr **IndexExprs, 25089ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor unsigned NumIndexExprs, 25099ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Init) 25101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(DesignatedInitExprClass, Ty, 2511f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Init->getValueKind(), Init->getObjectKind(), 2512bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Init->isTypeDependent(), Init->isValueDependent(), 2513bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Init->containsUnexpandedParameterPack()), 25141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax), 25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) { 2516319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor this->Designators = new (C) Designator[NumDesignators]; 25179ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 25189ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Record the initializer itself. 25199ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor child_iterator Child = child_begin(); 25209ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = Init; 25219ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 25229ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Copy the designators and their subexpressions, computing 25239ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // value-dependence along the way. 25249ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor unsigned IndexIdx = 0; 25259ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor for (unsigned I = 0; I != NumDesignators; ++I) { 2526ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor this->Designators[I] = Designators[I]; 25279ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 25289ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (this->Designators[I].isArrayDesignator()) { 25299ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Compute type- and value-dependence. 25309ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Index = IndexExprs[IndexIdx]; 2531bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Index->isTypeDependent() || Index->isValueDependent()) 2532bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2533bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 2534bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // Propagate unexpanded parameter packs. 2535bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Index->containsUnexpandedParameterPack()) 2536bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 25379ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 25389ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Copy the index expressions into permanent storage. 25399ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = IndexExprs[IndexIdx++]; 25409ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (this->Designators[I].isArrayRangeDesignator()) { 25419ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Compute type- and value-dependence. 25429ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Start = IndexExprs[IndexIdx]; 25439ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *End = IndexExprs[IndexIdx + 1]; 2544bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Start->isTypeDependent() || Start->isValueDependent() || 2545bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor End->isTypeDependent() || End->isValueDependent()) 2546bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2547bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 2548bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // Propagate unexpanded parameter packs. 2549bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (Start->containsUnexpandedParameterPack() || 2550bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor End->containsUnexpandedParameterPack()) 2551bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 25529ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 25539ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Copy the start/end expressions into permanent storage. 25549ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = IndexExprs[IndexIdx++]; 25559ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = IndexExprs[IndexIdx++]; 25569ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } 25579ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } 25589ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 25599ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions"); 2560ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 2561ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 256205c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorDesignatedInitExpr * 25631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr::Create(ASTContext &C, Designator *Designators, 256405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumDesignators, 256505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr **IndexExprs, unsigned NumIndexExprs, 256605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation ColonOrEqualLoc, 256705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool UsesColonSyntax, Expr *Init) { 2568c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 2569c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff sizeof(Stmt *) * (NumIndexExprs + 1), 8); 2570319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators, 25719ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor ColonOrEqualLoc, UsesColonSyntax, 25729ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor IndexExprs, NumIndexExprs, Init); 257305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 257405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 25751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C, 2576d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned NumIndexExprs) { 2577d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 2578d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor sizeof(Stmt *) * (NumIndexExprs + 1), 8); 2579d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor return new (Mem) DesignatedInitExpr(NumIndexExprs + 1); 2580d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor} 2581d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 2582319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregorvoid DesignatedInitExpr::setDesignators(ASTContext &C, 2583319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor const Designator *Desigs, 2584d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned NumDesigs) { 2585319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor Designators = new (C) Designator[NumDesigs]; 2586d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor NumDesignators = NumDesigs; 2587d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor for (unsigned I = 0; I != NumDesigs; ++I) 2588d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Designators[I] = Desigs[I]; 2589d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor} 2590d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 259105c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorSourceRange DesignatedInitExpr::getSourceRange() const { 259205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation StartLoc; 2593d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner Designator &First = 2594d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner *const_cast<DesignatedInitExpr*>(this)->designators_begin(); 259505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (First.isFieldDesignator()) { 2596eeae8f072748affce25ab4064982626361293390Douglas Gregor if (GNUSyntax) 259705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc); 259805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else 259905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc); 260005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } else 2601d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner StartLoc = 2602d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc); 260305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceRange(StartLoc, getInit()->getSourceRange().getEnd()); 260405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 260505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 260605c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayIndex(const Designator& D) { 260705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(D.Kind == Designator::ArrayDesignator && "Requires array designator"); 260805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 260905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 261005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 261105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 261205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 261305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 261405c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) { 26151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(D.Kind == Designator::ArrayRangeDesignator && 261605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Requires array range designator"); 261705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 261805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 261905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 262005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 262105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 262205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 262305c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) { 26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(D.Kind == Designator::ArrayRangeDesignator && 262505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Requires array range designator"); 262605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 262705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 262805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 262905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2)); 263005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 263105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 2632ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Replaces the designator at index @p Idx with the series 2633ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// of designators in [First, Last). 2634319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregorvoid DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx, 26351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Designator *First, 2636ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Last) { 2637ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor unsigned NumNewDesignators = Last - First; 2638ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (NumNewDesignators == 0) { 2639ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy_backward(Designators + Idx + 1, 2640ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators + NumDesignators, 2641ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators + Idx); 2642ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor --NumNewDesignators; 2643ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 2644ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } else if (NumNewDesignators == 1) { 2645ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators[Idx] = *First; 2646ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 2647ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 2648ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 26491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator *NewDesignators 2650319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor = new (C) Designator[NumDesignators - 1 + NumNewDesignators]; 2651ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy(Designators, Designators + Idx, NewDesignators); 2652ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy(First, Last, NewDesignators + Idx); 2653ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy(Designators + Idx + 1, Designators + NumDesignators, 2654ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor NewDesignators + Idx + NumNewDesignators); 2655ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators = NewDesignators; 2656ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor NumDesignators = NumDesignators - 1 + NumNewDesignators; 2657ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 2658ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 26591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc, 26602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Expr **exprs, unsigned nexprs, 26612ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation rparenloc) 2662bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary, 2663bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, false, false), 2664bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) { 26651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Exprs = new (C) Stmt*[nexprs]; 2667bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (unsigned i = 0; i != nexprs; ++i) { 2668bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (exprs[i]->isTypeDependent()) 2669bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.TypeDependent = true; 2670bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (exprs[i]->isValueDependent()) 2671bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ValueDependent = true; 2672bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (exprs[i]->containsUnexpandedParameterPack()) 2673bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = true; 2674bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 26752ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Exprs[i] = exprs[i]; 2676bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 26772ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 26782ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 267905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===// 2680ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek// ExprIterator. 2681ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===// 2682ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek 2683ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); } 2684ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator*() const { return cast<Expr>(*I); } 2685ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator->() const { return cast<Expr>(*I); } 2686ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator[](size_t idx) const { 2687ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek return cast<Expr>(I[idx]); 2688ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek} 2689ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); } 2690ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); } 2691ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek 2692ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===// 269377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// Child Iterators for iterating over subexpressions/substatements 269477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===// 269577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 269677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// DeclRefExpr 26979ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); } 26989ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); } 269977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 27007779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff// ObjCIvarRefExpr 27015549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; } 27025549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; } 27037779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff 2704e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroff// ObjCPropertyRefExpr 27058ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz JahanianStmt::child_iterator ObjCPropertyRefExpr::child_begin() 27068ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian{ 270712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Receiver.is<Stmt*>()) { 27088ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian // Hack alert! 270912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall return reinterpret_cast<Stmt**> (&Receiver); 27108ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian } 27118ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian return child_iterator(); 27128ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian} 27138ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian 27148ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz JahanianStmt::child_iterator ObjCPropertyRefExpr::child_end() 271512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall{ return Receiver.is<Stmt*>() ? 271612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall reinterpret_cast<Stmt**> (&Receiver)+1 : 27178ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian child_iterator(); 27188ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian} 2719ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff 2720f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff// ObjCIsaExpr 2721f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve NaroffStmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; } 2722f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve NaroffStmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; } 2723f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff 2724d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner// PredefinedExpr 2725d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris LattnerStmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); } 2726d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris LattnerStmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); } 272777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 272877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// IntegerLiteral 27299ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); } 27309ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); } 273177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 273277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// CharacterLiteral 2733d603eaa682cecac2c10771a700cb83aa301653b4Chris LattnerStmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();} 27349ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); } 273577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 273677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// FloatingLiteral 27379ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); } 27389ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); } 273977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 27405d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner// ImaginaryLiteral 27415549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; } 27425549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; } 27435d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 274477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// StringLiteral 27459ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator StringLiteral::child_begin() { return child_iterator(); } 27469ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator StringLiteral::child_end() { return child_iterator(); } 274777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 274877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ParenExpr 27495549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ParenExpr::child_begin() { return &Val; } 27505549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ParenExpr::child_end() { return &Val+1; } 275177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 275277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// UnaryOperator 27535549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator UnaryOperator::child_begin() { return &Val; } 27545549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator UnaryOperator::child_end() { return &Val+1; } 275577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 27568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor// OffsetOfExpr 27578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorStmt::child_iterator OffsetOfExpr::child_begin() { 27588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return reinterpret_cast<Stmt **> (reinterpret_cast<OffsetOfNode *> (this + 1) 27598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor + NumComps); 27608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 27618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorStmt::child_iterator OffsetOfExpr::child_end() { 27628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return child_iterator(&*child_begin() + NumExprs); 27638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 27648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 27650518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl// SizeOfAlignOfExpr 27661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator SizeOfAlignOfExpr::child_begin() { 27670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // If this is of a type and the type is a VLA type (and not a typedef), the 27680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // size expression of the VLA needs to be treated as an executable expression. 27690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // Why isn't this weirdness documented better in StmtIterator? 27700518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (isArgumentType()) { 2771f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall if (const VariableArrayType* T = dyn_cast<VariableArrayType>( 27720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl getArgumentType().getTypePtr())) 27730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return child_iterator(T); 27740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return child_iterator(); 27750518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 2776d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl return child_iterator(&Argument.Ex); 27779ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 27780518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlStmt::child_iterator SizeOfAlignOfExpr::child_end() { 27790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (isArgumentType()) 27800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return child_iterator(); 2781d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl return child_iterator(&Argument.Ex + 1); 27829ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 278377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 278477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ArraySubscriptExpr 27851237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ArraySubscriptExpr::child_begin() { 27865549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 278777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 27881237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ArraySubscriptExpr::child_end() { 27895549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+END_EXPR; 279077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 279177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 279277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// CallExpr 27931237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator CallExpr::child_begin() { 27945549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 279577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 27961237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator CallExpr::child_end() { 27975549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+NumArgs+ARGS_START; 279877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 27991237c673c07f9d827129ba02720108816abde562Ted Kremenek 28001237c673c07f9d827129ba02720108816abde562Ted Kremenek// MemberExpr 28015549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator MemberExpr::child_begin() { return &Base; } 28025549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator MemberExpr::child_end() { return &Base+1; } 28031237c673c07f9d827129ba02720108816abde562Ted Kremenek 2804213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman// ExtVectorElementExpr 28055549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; } 28065549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; } 28071237c673c07f9d827129ba02720108816abde562Ted Kremenek 28081237c673c07f9d827129ba02720108816abde562Ted Kremenek// CompoundLiteralExpr 28095549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; } 28105549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; } 28111237c673c07f9d827129ba02720108816abde562Ted Kremenek 28121237c673c07f9d827129ba02720108816abde562Ted Kremenek// CastExpr 28135549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CastExpr::child_begin() { return &Op; } 28145549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CastExpr::child_end() { return &Op+1; } 28151237c673c07f9d827129ba02720108816abde562Ted Kremenek 28161237c673c07f9d827129ba02720108816abde562Ted Kremenek// BinaryOperator 28171237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator BinaryOperator::child_begin() { 28185549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 28191237c673c07f9d827129ba02720108816abde562Ted Kremenek} 28201237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator BinaryOperator::child_end() { 28215549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+END_EXPR; 28221237c673c07f9d827129ba02720108816abde562Ted Kremenek} 28231237c673c07f9d827129ba02720108816abde562Ted Kremenek 28241237c673c07f9d827129ba02720108816abde562Ted Kremenek// ConditionalOperator 28251237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ConditionalOperator::child_begin() { 28265549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 28271237c673c07f9d827129ba02720108816abde562Ted Kremenek} 28281237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ConditionalOperator::child_end() { 28295549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+END_EXPR; 28301237c673c07f9d827129ba02720108816abde562Ted Kremenek} 28311237c673c07f9d827129ba02720108816abde562Ted Kremenek 28321237c673c07f9d827129ba02720108816abde562Ted Kremenek// AddrLabelExpr 28339ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); } 28349ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); } 28351237c673c07f9d827129ba02720108816abde562Ted Kremenek 28361237c673c07f9d827129ba02720108816abde562Ted Kremenek// StmtExpr 28375549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator StmtExpr::child_begin() { return &SubStmt; } 28385549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; } 28391237c673c07f9d827129ba02720108816abde562Ted Kremenek 28401237c673c07f9d827129ba02720108816abde562Ted Kremenek 28411237c673c07f9d827129ba02720108816abde562Ted Kremenek// ChooseExpr 28425549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; } 28435549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; } 28442d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 28452d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor// GNUNullExpr 28462d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas GregorStmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); } 28472d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas GregorStmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); } 28481237c673c07f9d827129ba02720108816abde562Ted Kremenek 2849d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman// ShuffleVectorExpr 2850d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanStmt::child_iterator ShuffleVectorExpr::child_begin() { 28515549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 2852d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman} 2853d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanStmt::child_iterator ShuffleVectorExpr::child_end() { 28545549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+NumExprs; 2855d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman} 2856d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 28577c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson// VAArgExpr 28585549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator VAArgExpr::child_begin() { return &Val; } 28595549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator VAArgExpr::child_end() { return &Val+1; } 28607c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson 286166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson// InitListExpr 2862ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed KremenekStmt::child_iterator InitListExpr::child_begin() { 2863ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek return InitExprs.size() ? &InitExprs[0] : 0; 2864ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek} 2865ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed KremenekStmt::child_iterator InitListExpr::child_end() { 2866ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0; 2867ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek} 286866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 28693498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor// DesignatedInitExpr 287005c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorStmt::child_iterator DesignatedInitExpr::child_begin() { 287105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 287205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 287305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 287405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 287505c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorStmt::child_iterator DesignatedInitExpr::child_end() { 287605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return child_iterator(&*child_begin() + NumSubExprs); 287705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 287805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 28793498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor// ImplicitValueInitExpr 28801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ImplicitValueInitExpr::child_begin() { 28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return child_iterator(); 28823498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 28833498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 28841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ImplicitValueInitExpr::child_end() { 28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return child_iterator(); 28863498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 28873498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 28882ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman// ParenListExpr 28892ef13e5abef0570a9f567b4671367275c05d4d34Nate BegemanStmt::child_iterator ParenListExpr::child_begin() { 28902ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return &Exprs[0]; 28912ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 28922ef13e5abef0570a9f567b4671367275c05d4d34Nate BegemanStmt::child_iterator ParenListExpr::child_end() { 28932ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return &Exprs[0]+NumExprs; 28942ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 28952ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 28961237c673c07f9d827129ba02720108816abde562Ted Kremenek// ObjCStringLiteral 28971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCStringLiteral::child_begin() { 2898c6c16af963eddc3e9b75b5d2614d069e1162fe27Chris Lattner return &String; 28999ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 29009ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCStringLiteral::child_end() { 2901c6c16af963eddc3e9b75b5d2614d069e1162fe27Chris Lattner return &String+1; 29029ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 29031237c673c07f9d827129ba02720108816abde562Ted Kremenek 29041237c673c07f9d827129ba02720108816abde562Ted Kremenek// ObjCEncodeExpr 29059ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); } 29069ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); } 29071237c673c07f9d827129ba02720108816abde562Ted Kremenek 2908b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian// ObjCSelectorExpr 29091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCSelectorExpr::child_begin() { 29109ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 29119ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 29129ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCSelectorExpr::child_end() { 29139ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 29149ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 2915b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 2916390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian// ObjCProtocolExpr 29179ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCProtocolExpr::child_begin() { 29189ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 29199ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 29209ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCProtocolExpr::child_end() { 29219ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 29229ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 2923390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 2924563477da25f824e37c535131695dc4dc9b68c465Steve Naroff// ObjCMessageExpr 29251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCMessageExpr::child_begin() { 292604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (getReceiverKind() == Instance) 292704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor return reinterpret_cast<Stmt **>(this + 1); 2928aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return reinterpret_cast<Stmt **>(getArgs()); 2929563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 2930563477da25f824e37c535131695dc4dc9b68c465Steve NaroffStmt::child_iterator ObjCMessageExpr::child_end() { 2931aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor return reinterpret_cast<Stmt **>(getArgs() + getNumArgs()); 2932563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 2933563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 29344eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Blocks 2935a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas GregorBlockDeclRefExpr::BlockDeclRefExpr(ValueDecl *d, QualType t, ExprValueKind VK, 2936a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor SourceLocation l, bool ByRef, 2937a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor bool constAdded, Stmt *copyConstructorVal) 2938a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary, 2939a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor (!t.isNull() && t->isDependentType()), false, 2940a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor d->isParameterPack()), 2941a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor D(d), Loc(l), IsByRef(ByRef), 2942a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor ConstQualAdded(constAdded), CopyConstructorVal(copyConstructorVal) 2943a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor{ 2944a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor // FIXME: Compute type/value dependence. 2945a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor} 2946a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor 294756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffStmt::child_iterator BlockExpr::child_begin() { return child_iterator(); } 294856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffStmt::child_iterator BlockExpr::child_end() { return child_iterator(); } 29494eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 29509da13f9ddb2567e36f4bbee7b3c32f54aeb76d5bTed KremenekStmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();} 29519da13f9ddb2567e36f4bbee7b3c32f54aeb76d5bTed KremenekStmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); } 29527cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 29537cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall// OpaqueValueExpr 29547cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallSourceRange OpaqueValueExpr::getSourceRange() const { return SourceRange(); } 29557cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallStmt::child_iterator OpaqueValueExpr::child_begin() { return child_iterator(); } 29567cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallStmt::child_iterator OpaqueValueExpr::child_end() { return child_iterator(); } 29577cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 2958