Expr.cpp revision ce94049b69f75b44c18584fe79cd238978b6b0d5
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" 231b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 24da5a6b6d9fd52899499d5b7b46273ec844dcaa6eChris Lattner#include "clang/Basic/TargetInfo.h" 253a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson#include "llvm/Support/raw_ostream.h" 26ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor#include <algorithm> 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions. 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 333a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// FIXME: Maybe this should use DeclPrinter with a special "print predefined 343a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// expr" policy instead. 353a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlssonstd::string PredefinedExpr::ComputeName(ASTContext &Context, IdentType IT, 363a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson const Decl *CurrentDecl) { 373a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) { 383a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (IT != PrettyFunction) 393a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return FD->getNameAsString(); 403a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 413a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::SmallString<256> Name; 423a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::raw_svector_ostream Out(Name); 433a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 443a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 453a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (MD->isVirtual()) 463a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << "virtual "; 473a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 483a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 493a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson PrintingPolicy Policy(Context.getLangOptions()); 503a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Policy.SuppressTagKind = true; 513a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 523a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson std::string Proto = FD->getQualifiedNameAsString(Policy); 533a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 54183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *AFT = FD->getType()->getAs<FunctionType>(); 553a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson const FunctionProtoType *FT = 0; 563a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FD->hasWrittenPrototype()) 573a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson FT = dyn_cast<FunctionProtoType>(AFT); 583a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 593a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Proto += "("; 603a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FT) { 613a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::raw_string_ostream POut(Proto); 623a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) { 633a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (i) POut << ", "; 643a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson std::string Param; 653a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy); 663a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson POut << Param; 673a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 683a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 693a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FT->isVariadic()) { 703a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (FD->getNumParams()) POut << ", "; 713a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson POut << "..."; 723a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 733a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 743a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Proto += ")"; 753a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 763a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson AFT->getResultType().getAsStringInternal(Proto, Policy); 773a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 783a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << Proto; 793a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 803a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out.flush(); 813a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return Name.str().str(); 823a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 833a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) { 843a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::SmallString<256> Name; 853a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson llvm::raw_svector_ostream Out(Name); 863a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << (MD->isInstanceMethod() ? '-' : '+'); 873a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << '['; 883a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << MD->getClassInterface()->getNameAsString(); 893a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (const ObjCCategoryImplDecl *CID = 903a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) { 913a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << '('; 923a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << CID->getNameAsString(); 933a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << ')'; 943a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 953a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << ' '; 963a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << MD->getSelector().getAsString(); 973a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out << ']'; 983a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 993a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson Out.flush(); 1003a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return Name.str().str(); 1013a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 1023a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) { 1033a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string. 1043a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return "top level"; 1053a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson } 1063a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return ""; 1073a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson} 1083a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 109da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// getValueAsApproximateDouble - This returns the value as an inaccurate 110da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// double. Note that this may cause loss of precision, but is useful for 111da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// debugging dumps, etc. 112da8249e57f3badecf925571881fe57243935c6c1Chris Lattnerdouble FloatingLiteral::getValueAsApproximateDouble() const { 113da8249e57f3badecf925571881fe57243935c6c1Chris Lattner llvm::APFloat V = getValue(); 114ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen bool ignored; 115ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, 116ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen &ignored); 117da8249e57f3badecf925571881fe57243935c6c1Chris Lattner return V.convertToDouble(); 118da8249e57f3badecf925571881fe57243935c6c1Chris Lattner} 119da8249e57f3badecf925571881fe57243935c6c1Chris Lattner 1202085fd6cd22ec5c268175251db10d7c60caf7aaaChris LattnerStringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData, 1212085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner unsigned ByteLength, bool Wide, 1222085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner QualType Ty, 1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const SourceLocation *Loc, 124a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson unsigned NumStrs) { 1252085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner // Allocate enough space for the StringLiteral plus an array of locations for 1262085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner // any concatenated string tokens. 1272085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner void *Mem = C.Allocate(sizeof(StringLiteral)+ 1282085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner sizeof(SourceLocation)*(NumStrs-1), 1292085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner llvm::alignof<StringLiteral>()); 1302085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner StringLiteral *SL = new (Mem) StringLiteral(Ty); 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // OPTIMIZE: could allocate this appended to the StringLiteral. 1332085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner char *AStrData = new (C, 1) char[ByteLength]; 1342085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner memcpy(AStrData, StrData, ByteLength); 1352085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->StrData = AStrData; 1362085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->ByteLength = ByteLength; 1372085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->IsWide = Wide; 1382085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->TokLocs[0] = Loc[0]; 1392085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner SL->NumConcatenated = NumStrs; 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 141726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner if (NumStrs != 1) 1422085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1)); 1432085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner return SL; 144726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner} 145726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner 146673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas GregorStringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) { 147673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor void *Mem = C.Allocate(sizeof(StringLiteral)+ 148673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor sizeof(SourceLocation)*(NumStrs-1), 149673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor llvm::alignof<StringLiteral>()); 150673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor StringLiteral *SL = new (Mem) StringLiteral(QualType()); 151673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor SL->StrData = 0; 152673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor SL->ByteLength = 0; 153673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor SL->NumConcatenated = NumStrs; 154673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor return SL; 155673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor} 156673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 15742602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregorvoid StringLiteral::DoDestroy(ASTContext &C) { 1588189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek C.Deallocate(const_cast<char*>(StrData)); 15942602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor Expr::DoDestroy(C); 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 162b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbarvoid StringLiteral::setString(ASTContext &C, llvm::StringRef Str) { 163673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor if (StrData) 164673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor C.Deallocate(const_cast<char*>(StrData)); 165673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 166b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar char *AStrData = new (C, 1) char[Str.size()]; 167b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar memcpy(AStrData, Str.data(), Str.size()); 168673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor StrData = AStrData; 169b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar ByteLength = Str.size(); 170673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor} 171673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "sizeof" or "[pre]++". 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *UnaryOperator::getOpcodeStr(Opcode Op) { 1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Op) { 1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown unary operator"); 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case PostInc: return "++"; 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case PostDec: return "--"; 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case PreInc: return "++"; 1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case PreDec: return "--"; 1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case AddrOf: return "&"; 1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Deref: return "*"; 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Plus: return "+"; 1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Minus: return "-"; 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Not: return "~"; 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LNot: return "!"; 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Real: return "__real"; 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Imag: return "__imag"; 1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Extension: return "__extension__"; 19073d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner case OffsetOf: return "__builtin_offsetof"; 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpUnaryOperator::Opcode 195bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorUnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) { 196bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor switch (OO) { 197bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor default: assert(false && "No unary operator for overloaded function"); 198b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_PlusPlus: return Postfix ? PostInc : PreInc; 199b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_MinusMinus: return Postfix ? PostDec : PreDec; 200b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_Amp: return AddrOf; 201b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_Star: return Deref; 202b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_Plus: return Plus; 203b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_Minus: return Minus; 204b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_Tilde: return Not; 205b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner case OO_Exclaim: return LNot; 206bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor } 207bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor} 208bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 209bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorOverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) { 210bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor switch (Opc) { 211bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case PostInc: case PreInc: return OO_PlusPlus; 212bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case PostDec: case PreDec: return OO_MinusMinus; 213bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case AddrOf: return OO_Amp; 214bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case Deref: return OO_Star; 215bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case Plus: return OO_Plus; 216bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case Minus: return OO_Minus; 217bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case Not: return OO_Tilde; 218bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor case LNot: return OO_Exclaim; 219bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor default: return OO_None; 220bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor } 221bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor} 222bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 223bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators. 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 228668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args, 2298189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek unsigned numargs, QualType t, SourceLocation rparenloc) 2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(SC, t, 231898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs), 232d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner fn->isValueDependent() || hasAnyValueDependentArguments(args,numargs)), 233898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor NumArgs(numargs) { 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 235668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek SubExprs = new (C) Stmt*[numargs+1]; 236b4609806e9232593ece09ce08b630836e825865cDouglas Gregor SubExprs[FN] = fn; 237b4609806e9232593ece09ce08b630836e825865cDouglas Gregor for (unsigned i = 0; i != numargs; ++i) 238b4609806e9232593ece09ce08b630836e825865cDouglas Gregor SubExprs[i+ARGS_START] = args[i]; 239668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 240b4609806e9232593ece09ce08b630836e825865cDouglas Gregor RParenLoc = rparenloc; 241b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 242e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman 243668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, 244668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek QualType t, SourceLocation rparenloc) 245898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor : Expr(CallExprClass, t, 246898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs), 247d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner fn->isValueDependent() || hasAnyValueDependentArguments(args,numargs)), 248898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor NumArgs(numargs) { 249668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 250668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek SubExprs = new (C) Stmt*[numargs+1]; 25177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek SubExprs[FN] = fn; 2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != numargs; ++i) 25377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek SubExprs[i+ARGS_START] = args[i]; 254668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer RParenLoc = rparenloc; 2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty) 2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(SC, Empty), SubExprs(0), NumArgs(0) { 2601f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor SubExprs = new (C) Stmt*[1]; 2611f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor} 2621f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 26342602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregorvoid CallExpr::DoDestroy(ASTContext& C) { 264668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek DestroyChildren(C); 265668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek if (SubExprs) C.Deallocate(SubExprs); 266668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek this->~CallExpr(); 267668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek C.Deallocate(this); 268668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek} 269668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek 270a00425414e8c209cabc25d1826b200aeb94259afZhongxing XuFunctionDecl *CallExpr::getDirectCallee() { 271a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu Expr *CEE = getCallee()->IgnoreParenCasts(); 2726346f963145ed18b6edf50a78753b47db505e912Chris Lattner if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) 273a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu return dyn_cast<FunctionDecl>(DRE->getDecl()); 274a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 275a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu return 0; 276a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu} 277a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 278d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// setNumArgs - This changes the number of arguments present in this call. 279d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// Any orphaned expressions are deleted by this, and any new operands are set 280d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// to null. 2818189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenekvoid CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) { 282d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // No change, just return. 283d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner if (NumArgs == getNumArgs()) return; 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 285d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // If shrinking # arguments, just delete the extras and forgot them. 286d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner if (NumArgs < getNumArgs()) { 287d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner for (unsigned i = NumArgs, e = getNumArgs(); i != e; ++i) 2888189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek getArg(i)->Destroy(C); 289d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner this->NumArgs = NumArgs; 290d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner return; 291d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner } 292d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner 293d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // Otherwise, we are growing the # arguments. New an bigger argument array. 29468a049cab6015a7437bec5661601b7d37d23c70cDaniel Dunbar Stmt **NewSubExprs = new (C) Stmt*[NumArgs+1]; 295d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // Copy over args. 296d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i) 297d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner NewSubExprs[i] = SubExprs[i]; 298d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner // Null out new args. 299d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i) 300d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner NewSubExprs[i] = 0; 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30288c9a46f0b84f1ee83e01917825346551ee540d0Douglas Gregor if (SubExprs) C.Deallocate(SubExprs); 303d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner SubExprs = NewSubExprs; 304d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner this->NumArgs = NumArgs; 305d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner} 306d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner 307cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 308cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// not, return 0. 3093c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregorunsigned CallExpr::isBuiltinCall(ASTContext &Context) const { 310c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff // All simple function calls (e.g. func()) are implicitly cast to pointer to 3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // function. As a result, we try and obtain the DeclRefExpr from the 312c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff // ImplicitCastExpr. 313c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee()); 314c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()). 315cb888967400a03504c88acedd5248d6778a82f46Chris Lattner return 0; 3161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()); 318c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff if (!DRE) 319cb888967400a03504c88acedd5248d6778a82f46Chris Lattner return 0; 3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 322bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson if (!FDecl) 323cb888967400a03504c88acedd5248d6778a82f46Chris Lattner return 0; 3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3254fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor if (!FDecl->getIdentifier()) 3264fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor return 0; 3274fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor 3287814e6d6645d587891293d59ecf6576defcfac92Douglas Gregor return FDecl->getBuiltinID(); 329cb888967400a03504c88acedd5248d6778a82f46Chris Lattner} 330bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson 3316dde78f744382a5627a04f984a97049e0c4b5e73Anders CarlssonQualType CallExpr::getCallReturnType() const { 3326dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson QualType CalleeType = getCallee()->getType(); 3336217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>()) 3346dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson CalleeType = FnTypePtr->getPointeeType(); 3356217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>()) 3366dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson CalleeType = BPT->getPointeeType(); 3371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const FunctionType *FnType = CalleeType->getAs<FunctionType>(); 3396dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson return FnType->getResultType(); 3406dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson} 341cb888967400a03504c88acedd5248d6778a82f46Chris Lattner 3421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpMemberExpr::MemberExpr(Expr *base, bool isarrow, NestedNameSpecifier *qual, 3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceRange qualrange, NamedDecl *memberdecl, 344c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor SourceLocation l, bool has_explicit, 345c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor SourceLocation langle, 346c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor const TemplateArgument *targs, unsigned numtargs, 347c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor SourceLocation rangle, QualType ty) 3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(MemberExprClass, ty, 34983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor base->isTypeDependent() || (qual && qual->isDependent()), 35083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor base->isValueDependent() || (qual && qual->isDependent())), 35183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow), 352c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor HasQualifier(qual != 0), HasExplicitTemplateArgumentList(has_explicit) { 35383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor // Initialize the qualifier, if any. 35483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (HasQualifier) { 35583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NameQualifier *NQ = getMemberQualifier(); 35683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NQ->NNS = qual; 35783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NQ->Range = qualrange; 35883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor // Initialize the explicit template argument list, if any. 361c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (HasExplicitTemplateArgumentList) { 3621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ExplicitTemplateArgumentList *ETemplateArgs 363c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor = getExplicitTemplateArgumentList(); 364c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor ETemplateArgs->LAngleLoc = langle; 365c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor ETemplateArgs->RAngleLoc = rangle; 366c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor ETemplateArgs->NumTemplateArgs = numtargs; 3671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 368c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor TemplateArgument *TemplateArgs = ETemplateArgs->getTemplateArgs(); 369c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor for (unsigned I = 0; I < numtargs; ++I) 3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (TemplateArgs + I) TemplateArgument(targs[I]); 371c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 37283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor} 37383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpMemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow, 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *qual, 37683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange qualrange, 3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *memberdecl, 3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation l, 379c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor bool has_explicit, 380c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor SourceLocation langle, 381c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor const TemplateArgument *targs, 382c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor unsigned numtargs, 383c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor SourceLocation rangle, 384c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor QualType ty) { 38583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor std::size_t Size = sizeof(MemberExpr); 38683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (qual != 0) 38783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Size += sizeof(NameQualifier); 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 389c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (has_explicit) 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Size += sizeof(ExplicitTemplateArgumentList) + 391c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor sizeof(TemplateArgument) * numtargs; 3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor void *Mem = C.Allocate(Size, llvm::alignof<MemberExpr>()); 394c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return new (Mem) MemberExpr(base, isarrow, qual, qualrange, memberdecl, l, 395c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor has_explicit, langle, targs, numtargs, rangle, 39683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor ty); 39783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor} 39883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 399f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlssonconst char *CastExpr::getCastKindName() const { 400f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson switch (getCastKind()) { 401f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_Unknown: 402f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "Unknown"; 403f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_BitCast: 404f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "BitCast"; 405f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_NoOp: 406f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "NoOp"; 407f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_DerivedToBase: 408f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "DerivedToBase"; 409f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_Dynamic: 410f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "Dynamic"; 411f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_ToUnion: 412f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "ToUnion"; 413f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_ArrayToPointerDecay: 414f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "ArrayToPointerDecay"; 415f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_FunctionToPointerDecay: 416f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "FunctionToPointerDecay"; 417f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_NullToMemberPointer: 418f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "NullToMemberPointer"; 419f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_BaseToDerivedMemberPointer: 420f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "BaseToDerivedMemberPointer"; 421f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_UserDefinedConversion: 422f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "UserDefinedConversion"; 423f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson case CastExpr::CK_ConstructorConversion: 424f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return "ConstructorConversion"; 4257f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson case CastExpr::CK_IntegralToPointer: 4267f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson return "IntegralToPointer"; 4277f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson case CastExpr::CK_PointerToIntegral: 4287f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson return "PointerToIntegral"; 429f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson } 4301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 431f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson assert(0 && "Unhandled cast kind!"); 432f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson return 0; 433f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson} 434f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson 4355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 4365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "<<=". 4375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *BinaryOperator::getOpcodeStr(Opcode Op) { 4385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Op) { 439baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor case PtrMemD: return ".*"; 440baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor case PtrMemI: return "->*"; 4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Mul: return "*"; 4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Div: return "/"; 4435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Rem: return "%"; 4445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Add: return "+"; 4455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Sub: return "-"; 4465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Shl: return "<<"; 4475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Shr: return ">>"; 4485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LT: return "<"; 4495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case GT: return ">"; 4505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LE: return "<="; 4515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case GE: return ">="; 4525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case EQ: return "=="; 4535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case NE: return "!="; 4545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case And: return "&"; 4555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Xor: return "^"; 4565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Or: return "|"; 4575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LAnd: return "&&"; 4585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LOr: return "||"; 4595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Assign: return "="; 4605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case MulAssign: return "*="; 4615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DivAssign: return "/="; 4625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case RemAssign: return "%="; 4635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case AddAssign: return "+="; 4645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case SubAssign: return "-="; 4655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ShlAssign: return "<<="; 4665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ShrAssign: return ">>="; 4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case AndAssign: return "&="; 4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case XorAssign: return "^="; 4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case OrAssign: return "|="; 4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Comma: return ","; 4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 472baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor 473baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor return ""; 4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpBinaryOperator::Opcode 477063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorBinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) { 478063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor switch (OO) { 479b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner default: assert(false && "Not an overloadable binary operator"); 480063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Plus: return Add; 481063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Minus: return Sub; 482063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Star: return Mul; 483063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Slash: return Div; 484063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Percent: return Rem; 485063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Caret: return Xor; 486063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Amp: return And; 487063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Pipe: return Or; 488063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Equal: return Assign; 489063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Less: return LT; 490063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Greater: return GT; 491063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_PlusEqual: return AddAssign; 492063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_MinusEqual: return SubAssign; 493063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_StarEqual: return MulAssign; 494063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_SlashEqual: return DivAssign; 495063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_PercentEqual: return RemAssign; 496063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_CaretEqual: return XorAssign; 497063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_AmpEqual: return AndAssign; 498063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_PipeEqual: return OrAssign; 499063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_LessLess: return Shl; 500063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_GreaterGreater: return Shr; 501063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_LessLessEqual: return ShlAssign; 502063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_GreaterGreaterEqual: return ShrAssign; 503063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_EqualEqual: return EQ; 504063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_ExclaimEqual: return NE; 505063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_LessEqual: return LE; 506063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_GreaterEqual: return GE; 507063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_AmpAmp: return LAnd; 508063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_PipePipe: return LOr; 509063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_Comma: return Comma; 510063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor case OO_ArrowStar: return PtrMemI; 511063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor } 512063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor} 513063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 514063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorOverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) { 515063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor static const OverloadedOperatorKind OverOps[] = { 516063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /* .* Cannot be overloaded */OO_None, OO_ArrowStar, 517063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Star, OO_Slash, OO_Percent, 518063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Plus, OO_Minus, 519063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_LessLess, OO_GreaterGreater, 520063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual, 521063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_EqualEqual, OO_ExclaimEqual, 522063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Amp, 523063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Caret, 524063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Pipe, 525063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_AmpAmp, 526063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_PipePipe, 527063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Equal, OO_StarEqual, 528063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_SlashEqual, OO_PercentEqual, 529063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_PlusEqual, OO_MinusEqual, 530063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_LessLessEqual, OO_GreaterGreaterEqual, 531063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_AmpEqual, OO_CaretEqual, 532063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_PipeEqual, 533063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OO_Comma 534063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor }; 535063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor return OverOps[Opc]; 536063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor} 537063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 5381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpInitListExpr::InitListExpr(SourceLocation lbraceloc, 539418f6c7d142e5ff4607f70cd8431d008442bafe9Chris Lattner Expr **initExprs, unsigned numInits, 5404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceLocation rbraceloc) 5419ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor : Expr(InitListExprClass, QualType(), 5429ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor hasAnyTypeDependentArguments(initExprs, numInits), 5439ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor hasAnyValueDependentArguments(initExprs, numInits)), 5441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0), 545a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor UnionFieldInit(0), HadArrayRangeDesignator(false) { 546418f6c7d142e5ff4607f70cd8431d008442bafe9Chris Lattner 547418f6c7d142e5ff4607f70cd8431d008442bafe9Chris Lattner InitExprs.insert(InitExprs.end(), initExprs, initExprs+numInits); 54866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 550fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregorvoid InitListExpr::reserveInits(unsigned NumInits) { 551fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor if (NumInits > InitExprs.size()) 552fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor InitExprs.reserve(NumInits); 553fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor} 554fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor 5554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregorvoid InitListExpr::resizeInits(ASTContext &Context, unsigned NumInits) { 556d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner for (unsigned Idx = NumInits, LastIdx = InitExprs.size(); 557f592c929bd1f083abcc8199b24bb825fdd28df1cDaniel Dunbar Idx < LastIdx; ++Idx) 558068636800594844c53fba0bc871c579745757d0eDouglas Gregor InitExprs[Idx]->Destroy(Context); 5594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitExprs.resize(NumInits, 0); 5604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 5614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 5624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas GregorExpr *InitListExpr::updateInit(unsigned Init, Expr *expr) { 5634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Init >= InitExprs.size()) { 5644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitExprs.insert(InitExprs.end(), Init - InitExprs.size() + 1, 0); 5654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitExprs.back() = expr; 5664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return 0; 5674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 5681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor Expr *Result = cast_or_null<Expr>(InitExprs[Init]); 5704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitExprs[Init] = expr; 5714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return Result; 5724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor} 5734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 574bfdcae678d44906293e21c0cddc6537f3ee8b5a4Steve Naroff/// getFunctionType - Return the underlying function type for this block. 5754eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff/// 5764eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffconst FunctionType *BlockExpr::getFunctionType() const { 5776217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek return getType()->getAs<BlockPointerType>()-> 578183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall getPointeeType()->getAs<FunctionType>(); 5794eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 5804eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 5811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSourceLocation BlockExpr::getCaretLocation() const { 5821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return TheBlock->getCaretLocation(); 58356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst Stmt *BlockExpr::getBody() const { 5857297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor return TheBlock->getBody(); 5867297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor} 5871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt *BlockExpr::getBody() { 5881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return TheBlock->getBody(); 5897297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor} 59056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 59156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 5925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Generic Expression Routines 5945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 596026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// isUnusedResultAWarning - Return true if this immediate expression should 597026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// be warned about if the result is unused. If so, fill in Loc and Ranges 598026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// with location to warn on and the source range[s] to report with the 599026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// warning. 600026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerbool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1, 60140b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis SourceRange &R2) const { 602ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson // Don't warn if the expr is type dependent. The type could end up 603ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson // instantiating to void. 604ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson if (isTypeDependent()) 605ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson return false; 6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (getStmtClass()) { 6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: 609026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = getExprLoc(); 610026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = getSourceRange(); 611026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ParenExprClass: 613026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return cast<ParenExpr>(this)->getSubExpr()-> 61440b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis isUnusedResultAWarning(Loc, R1, R2); 6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperatorClass: { 6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const UnaryOperator *UO = cast<UnaryOperator>(this); 6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (UO->getOpcode()) { 619026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner default: break; 6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::PostInc: 6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::PostDec: 6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::PreInc: 623026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner case UnaryOperator::PreDec: // ++/-- 624026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; // Not a warning. 6255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Deref: 6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Dereferencing a volatile pointer is a side-effect. 627026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (getType().isVolatileQualified()) 628026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 629026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner break; 6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Real: 6315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Imag: 6325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // accessing a piece of a volatile complex is a side-effect. 633026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (UO->getSubExpr()->getType().isVolatileQualified()) 634026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 635026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner break; 6365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Extension: 63740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 6385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 639026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = UO->getOperatorLoc(); 640026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = UO->getSubExpr()->getSourceRange(); 641026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 6425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 643e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner case BinaryOperatorClass: { 644026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner const BinaryOperator *BO = cast<BinaryOperator>(this); 645026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // Consider comma to have side effects if the LHS or RHS does. 646026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (BO->getOpcode() == BinaryOperator::Comma) 64740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2) || 64840b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2); 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 650026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (BO->isAssignmentOp()) 651026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 652026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = BO->getOperatorLoc(); 653026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = BO->getLHS()->getSourceRange(); 654026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = BO->getRHS()->getSourceRange(); 655026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 656e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner } 657eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner case CompoundAssignOperatorClass: 658026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 6595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 660ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian case ConditionalOperatorClass: { 661026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // The condition must be evaluated, but if either the LHS or RHS is a 662026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // warning, warn about them. 663ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian const ConditionalOperator *Exp = cast<ConditionalOperator>(this); 6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Exp->getLHS() && 66540b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2)) 666026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 66740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2); 668ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian } 669ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian 6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case MemberExprClass: 671026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // If the base pointer or element is to a volatile pointer/field, accessing 672026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // it is a side effect. 673026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (getType().isVolatileQualified()) 674026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 675026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<MemberExpr>(this)->getMemberLoc(); 676026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = SourceRange(Loc, Loc); 677026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = cast<MemberExpr>(this)->getBase()->getSourceRange(); 678026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ArraySubscriptExprClass: 6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If the base pointer or element is to a volatile pointer/field, accessing 682026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // it is a side effect. 683026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (getType().isVolatileQualified()) 684026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 685026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc(); 686026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange(); 687026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange(); 688026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 689211f6adf1301a1461015fb6cb08a05f0a35b65f3Eli Friedman 6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case CallExprClass: 691852871abbff45f1c1d3787755a27fce08365b166Eli Friedman case CXXOperatorCallExprClass: 692852871abbff45f1c1d3787755a27fce08365b166Eli Friedman case CXXMemberCallExprClass: { 693026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // If this is a direct call, get the callee. 694026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner const CallExpr *CE = cast<CallExpr>(this); 695026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner const Expr *CalleeExpr = CE->getCallee()->IgnoreParenCasts(); 696026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (const DeclRefExpr *CalleeDRE = dyn_cast<DeclRefExpr>(CalleeExpr)) { 697026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // If the callee has attribute pure, const, or warn_unused_result, warn 698026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // about it. void foo() { strlen("bar"); } should warn. 699026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CalleeDRE->getDecl())) 70040b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis if (FD->getAttr<WarnUnusedResultAttr>() || 70140b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) { 702026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = CE->getCallee()->getLocStart(); 703026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = CE->getCallee()->getSourceRange(); 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 705026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (unsigned NumArgs = CE->getNumArgs()) 706026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R2 = SourceRange(CE->getArg(0)->getLocStart(), 707026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner CE->getArg(NumArgs-1)->getLocEnd()); 708026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 709026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner } 710026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner } 711026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 712026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner } 713a9c01021724b9b546d282b8609cbe559734812ecChris Lattner case ObjCMessageExprClass: 714026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71609105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian case ObjCImplicitSetterGetterRefExprClass: { // Dot syntax for message send. 717a50089ec68a583d13718107c1b0c898f0903709eChris Lattner#if 0 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const ObjCImplicitSetterGetterRefExpr *Ref = 71909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian cast<ObjCImplicitSetterGetterRefExpr>(this); 720a50089ec68a583d13718107c1b0c898f0903709eChris Lattner // FIXME: We really want the location of the '.' here. 721154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian Loc = Ref->getLocation(); 722154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian R1 = SourceRange(Ref->getLocation(), Ref->getLocation()); 723154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian if (Ref->getBase()) 724154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian R2 = Ref->getBase()->getSourceRange(); 7255e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner#else 7265e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner Loc = getExprLoc(); 7275e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner R1 = getSourceRange(); 728a50089ec68a583d13718107c1b0c898f0903709eChris Lattner#endif 729a50089ec68a583d13718107c1b0c898f0903709eChris Lattner return true; 730a50089ec68a583d13718107c1b0c898f0903709eChris Lattner } 731611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner case StmtExprClass: { 732611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // Statement exprs don't logically have side effects themselves, but are 733611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // sometimes used in macros in ways that give them a type that is unused. 734611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // For example ({ blah; foo(); }) will end up with a type if foo has a type. 735611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // however, if the result of the stmt expr is dead, we don't want to emit a 736611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner // warning. 737611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt(); 738611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner if (!CS->body_empty()) 739611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner if (const Expr *E = dyn_cast<Expr>(CS->body_back())) 74040b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis return E->isUnusedResultAWarning(Loc, R1, R2); 7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 742026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<StmtExpr>(this)->getLParenLoc(); 743026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = getSourceRange(); 744026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 745611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner } 7466eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor case CStyleCastExprClass: 747fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner // If this is an explicit cast to void, allow it. People do this when they 748fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner // think they know what they're doing :). 749026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner if (getType()->isVoidType()) 750fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner return false; 751026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<CStyleCastExpr>(this)->getLParenLoc(); 752026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange(); 753026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 754987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis case CXXFunctionalCastExprClass: 7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is a cast to void, check the operand. Otherwise, the result of 7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // the cast is unused. 7575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (getType()->isVoidType()) 75868584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor return cast<CastExpr>(this)->getSubExpr() 75940b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis ->isUnusedResultAWarning(Loc, R1, R2); 760026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc(); 761026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange(); 762026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return true; 7631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7644be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman case ImplicitCastExprClass: 7654be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman // Check the operand, since implicit casts are inserted by Sema 766026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return cast<ImplicitCastExpr>(this) 76740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 7684be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman 76904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner case CXXDefaultArgExprClass: 770026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return cast<CXXDefaultArgExpr>(this) 77140b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis ->getExpr()->isUnusedResultAWarning(Loc, R1, R2); 7724c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 7734c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl case CXXNewExprClass: 7744c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // FIXME: In theory, there might be new expressions that don't have side 7754c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // effects (e.g. a placement new with an uninitialized POD). 7764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl case CXXDeleteExprClass: 777026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner return false; 7782d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson case CXXBindTemporaryExprClass: 7792d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson return cast<CXXBindTemporaryExpr>(this) 7802d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 7816b1d283fe879fb11d7ce7a69feecf66e77b0eaf3Anders Carlsson case CXXExprWithTemporariesClass: 7826b1d283fe879fb11d7ce7a69feecf66e77b0eaf3Anders Carlsson return cast<CXXExprWithTemporaries>(this) 78340b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 7844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 7855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 787ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor/// DeclCanBeLvalue - Determine whether the given declaration can be 788ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor/// an lvalue. This is a helper routine for isLvalue. 789ba7e210a999275695f58be03ef402758cfec3635Douglas Gregorstatic bool DeclCanBeLvalue(const NamedDecl *Decl, ASTContext &Ctx) { 79072c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor // C++ [temp.param]p6: 79172c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor // A non-type non-reference template-parameter is not an lvalue. 7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const NonTypeTemplateParmDecl *NTTParm 79372c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(Decl)) 79472c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor return NTTParm->getType()->isReferenceType(); 79572c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor 79644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return isa<VarDecl>(Decl) || isa<FieldDecl>(Decl) || 797ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor // C++ 3.10p2: An lvalue refers to an object or function. 798ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor (Ctx.getLangOptions().CPlusPlus && 79983314aa1cf61ed2458a8a20c83b2d4708192d5dcDouglas Gregor (isa<FunctionDecl>(Decl) || isa<OverloadedFunctionDecl>(Decl) || 80083314aa1cf61ed2458a8a20c83b2d4708192d5dcDouglas Gregor isa<FunctionTemplateDecl>(Decl))); 801ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor} 802ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor 8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or an 8045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// incomplete type other than void. Nonarray expressions that can be lvalues: 8055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - name, where name must be a variable 8065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - e[i] 8075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - (e), where e must be an lvalue 8085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - e.name, where e must be an lvalue 8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - e->name 8105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - *e, the type of e cannot be a function type 8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - string-constant 8127da36f642e907ff5a5ba4b18b5bfebfabf36ecc7Chris Lattner/// - (__real__ e) and (__imag__ e) where e is an lvalue [GNU extension] 81308ad47cbd1f81fcb31dbc731c13b885a07e12704Bill Wendling/// - reference type [C++ [expr]] 8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 81528be73f74c9e241a23ea24fe5756623de6bf1084Chris LattnerExpr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { 81653202857c60214d80950a975e6e52aebf30bd16aEli Friedman assert(!TR->isReferenceType() && "Expressions can't have reference type."); 81753202857c60214d80950a975e6e52aebf30bd16aEli Friedman 81853202857c60214d80950a975e6e52aebf30bd16aEli Friedman isLvalueResult Res = isLvalueInternal(Ctx); 81953202857c60214d80950a975e6e52aebf30bd16aEli Friedman if (Res != LV_Valid || Ctx.getLangOptions().CPlusPlus) 82053202857c60214d80950a975e6e52aebf30bd16aEli Friedman return Res; 82153202857c60214d80950a975e6e52aebf30bd16aEli Friedman 82298cd599ee8a9b259ed7388ee2921a20d97658864Douglas Gregor // first, check the type (C99 6.3.2.1). Expressions with function 82398cd599ee8a9b259ed7388ee2921a20d97658864Douglas Gregor // type in C are not lvalues, but they can be lvalues in C++. 82483314aa1cf61ed2458a8a20c83b2d4708192d5dcDouglas Gregor if (TR->isFunctionType() || TR == Ctx.OverloadTy) 8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return LV_NotObjectType; 8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 827acb818a4f7d9b608826171094d6b5a555a8fe694Steve Naroff // Allow qualified void which is an incomplete type other than void (yuck). 8280953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (TR->isVoidType() && !Ctx.getCanonicalType(TR).hasQualifiers()) 829acb818a4f7d9b608826171094d6b5a555a8fe694Steve Naroff return LV_IncompleteVoidType; 830acb818a4f7d9b608826171094d6b5a555a8fe694Steve Naroff 83153202857c60214d80950a975e6e52aebf30bd16aEli Friedman return LV_Valid; 83253202857c60214d80950a975e6e52aebf30bd16aEli Friedman} 83308ad47cbd1f81fcb31dbc731c13b885a07e12704Bill Wendling 83453202857c60214d80950a975e6e52aebf30bd16aEli Friedman// Check whether the expression can be sanely treated like an l-value 83553202857c60214d80950a975e6e52aebf30bd16aEli FriedmanExpr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const { 8365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (getStmtClass()) { 837eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner case StringLiteralClass: // C99 6.5.1p4 838eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner case ObjCEncodeExprClass: // @encode behaves like its string in every way. 8397323a6297edad643c202594dcf3d9a174de96ca6Anders Carlsson return LV_Valid; 8405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ArraySubscriptExprClass: // C99 6.5.3p4 (e1[e2] == (*((e1)+(e2)))) 8415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // For vectors, make sure base is an lvalue (i.e. not a function call). 8425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (cast<ArraySubscriptExpr>(this)->getBase()->getType()->isVectorType()) 84328be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue(Ctx); 8445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return LV_Valid; 8451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclRefExprClass: 8461a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor case QualifiedDeclRefExprClass: { // C99 6.5.1p2 847ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor const NamedDecl *RefdDecl = cast<DeclRefExpr>(this)->getDecl(); 848ba7e210a999275695f58be03ef402758cfec3635Douglas Gregor if (DeclCanBeLvalue(RefdDecl, Ctx)) 8495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return LV_Valid; 8505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 8514111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner } 852dd972f20dc2bd3609d833893e5c6544ac09b59a9Steve Naroff case BlockDeclRefExprClass: { 853dd972f20dc2bd3609d833893e5c6544ac09b59a9Steve Naroff const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this); 8544f6a7d7ead09b439216c32f2de806a998aeb222aSteve Naroff if (isa<VarDecl>(BDR->getDecl())) 855dd972f20dc2bd3609d833893e5c6544ac09b59a9Steve Naroff return LV_Valid; 856dd972f20dc2bd3609d833893e5c6544ac09b59a9Steve Naroff break; 857dd972f20dc2bd3609d833893e5c6544ac09b59a9Steve Naroff } 85883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor case MemberExprClass: { 8595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const MemberExpr *m = cast<MemberExpr>(this); 86086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (Ctx.getLangOptions().CPlusPlus) { // C++ [expr.ref]p4: 86186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor NamedDecl *Member = m->getMemberDecl(); 86286f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // C++ [expr.ref]p4: 86386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // If E2 is declared to have type "reference to T", then E1.E2 86486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // is an lvalue. 86586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (ValueDecl *Value = dyn_cast<ValueDecl>(Member)) 86686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (Value->getType()->isReferenceType()) 86786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return LV_Valid; 86886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 86986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // -- If E2 is a static data member [...] then E1.E2 is an lvalue. 8702d2e9cfdc1dbb6e4a22f8c0b1abcd30437e3795dDouglas Gregor if (isa<VarDecl>(Member) && Member->getDeclContext()->isRecord()) 87186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return LV_Valid; 87286f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 87386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // -- If E2 is a non-static data member [...]. If E1 is an 87486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // lvalue, then E1.E2 is an lvalue. 87586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (isa<FieldDecl>(Member)) 87686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return m->isArrow() ? LV_Valid : m->getBase()->isLvalue(Ctx); 87786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 87886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // -- If it refers to a static member function [...], then 87986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // E1.E2 is an lvalue. 88086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // -- Otherwise, if E1.E2 refers to a non-static member 88186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // function [...], then E1.E2 is not an lvalue. 88286f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Member)) 88386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return Method->isStatic()? LV_Valid : LV_MemberFunction; 88486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 88586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // -- If E2 is a member enumerator [...], the expression E1.E2 88686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // is not an lvalue. 88786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (isa<EnumConstantDecl>(Member)) 88886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return LV_InvalidExpression; 88986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 89086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // Not an lvalue. 89186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return LV_InvalidExpression; 8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 89386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 89486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor // C99 6.5.2.3p4 89528be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner return m->isArrow() ? LV_Valid : m->getBase()->isLvalue(Ctx); 896fdd75663fffeb2058a7847975e50837e61200593Anton Korobeynikov } 8977da36f642e907ff5a5ba4b18b5bfebfabf36ecc7Chris Lattner case UnaryOperatorClass: 8985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref) 8997da36f642e907ff5a5ba4b18b5bfebfabf36ecc7Chris Lattner return LV_Valid; // C99 6.5.3p4 9007da36f642e907ff5a5ba4b18b5bfebfabf36ecc7Chris Lattner 9017da36f642e907ff5a5ba4b18b5bfebfabf36ecc7Chris Lattner if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Real || 902baf0d6678418e0dd9309438c3e50274253cfc7b2Chris Lattner cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Imag || 903baf0d6678418e0dd9309438c3e50274253cfc7b2Chris Lattner cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Extension) 90428be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner return cast<UnaryOperator>(this)->getSubExpr()->isLvalue(Ctx); // GNU. 90574253736184c0717a0649922551bf9d8b6815651Douglas Gregor 90674253736184c0717a0649922551bf9d8b6815651Douglas Gregor if (Ctx.getLangOptions().CPlusPlus && // C++ [expr.pre.incr]p1 90774253736184c0717a0649922551bf9d8b6815651Douglas Gregor (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::PreInc || 90874253736184c0717a0649922551bf9d8b6815651Douglas Gregor cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::PreDec)) 90974253736184c0717a0649922551bf9d8b6815651Douglas Gregor return LV_Valid; 9105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 911eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor case ImplicitCastExprClass: 9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return cast<ImplicitCastExpr>(this)->isLvalueCast()? LV_Valid 913eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor : LV_InvalidExpression; 9145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ParenExprClass: // C99 6.5.1p5 91528be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner return cast<ParenExpr>(this)->getSubExpr()->isLvalue(Ctx); 916eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor case BinaryOperatorClass: 917eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor case CompoundAssignOperatorClass: { 918eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor const BinaryOperator *BinOp = cast<BinaryOperator>(this); 919337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 920337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor if (Ctx.getLangOptions().CPlusPlus && // C++ [expr.comma]p1 921337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor BinOp->getOpcode() == BinaryOperator::Comma) 922337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor return BinOp->getRHS()->isLvalue(Ctx); 923337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 924224605064a4ef87d1c3d35ad1cb363f8b534012bSebastian Redl // C++ [expr.mptr.oper]p6 925224605064a4ef87d1c3d35ad1cb363f8b534012bSebastian Redl if ((BinOp->getOpcode() == BinaryOperator::PtrMemD || 926224605064a4ef87d1c3d35ad1cb363f8b534012bSebastian Redl BinOp->getOpcode() == BinaryOperator::PtrMemI) && 927224605064a4ef87d1c3d35ad1cb363f8b534012bSebastian Redl !BinOp->getType()->isFunctionType()) 928224605064a4ef87d1c3d35ad1cb363f8b534012bSebastian Redl return BinOp->getLHS()->isLvalue(Ctx); 929224605064a4ef87d1c3d35ad1cb363f8b534012bSebastian Redl 930bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor if (!BinOp->isAssignmentOp()) 931eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor return LV_InvalidExpression; 932eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor 933bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor if (Ctx.getLangOptions().CPlusPlus) 9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // C++ [expr.ass]p1: 935bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor // The result of an assignment operation [...] is an lvalue. 936bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor return LV_Valid; 937bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor 938bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor 939bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor // C99 6.5.16: 940bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor // An assignment expression [...] is not an lvalue. 941bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor return LV_InvalidExpression; 942eb8f3063257a392f15aea48d42fb73ec51afc548Douglas Gregor } 9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case CallExprClass: 94488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor case CXXOperatorCallExprClass: 94588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor case CXXMemberCallExprClass: { 9467c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // C++0x [expr.call]p10 9479d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // A function call is an lvalue if and only if the result type 9487c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // is an lvalue reference. 9496dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson QualType ReturnType = cast<CallExpr>(this)->getCallReturnType(); 9506dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson if (ReturnType->isLValueReferenceType()) 9516dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson return LV_Valid; 9527c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl 9539d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor break; 9549d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor } 955e6386394677ed4f77b20e2e3d5446a3a2f628e53Steve Naroff case CompoundLiteralExprClass: // C99 6.5.2.5p5 956e6386394677ed4f77b20e2e3d5446a3a2f628e53Steve Naroff return LV_Valid; 957670a62cd1d51042ea076cda5e93f26a1d8327fb3Chris Lattner case ChooseExprClass: 958670a62cd1d51042ea076cda5e93f26a1d8327fb3Chris Lattner // __builtin_choose_expr is an lvalue if the selected operand is. 9597976932a1c256d447316ffac58e9821417725e34Eli Friedman return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)->isLvalue(Ctx); 960213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman case ExtVectorElementExprClass: 961213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman if (cast<ExtVectorElementExpr>(this)->containsDuplicateElements()) 962fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff return LV_DuplicateVectorComponents; 963fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff return LV_Valid; 964027282d1c1ac151aa7b1b3b45babc918b8ad456aSteve Naroff case ObjCIvarRefExprClass: // ObjC instance variables are lvalues. 965027282d1c1ac151aa7b1b3b45babc918b8ad456aSteve Naroff return LV_Valid; 966799a6a6850af625946bb8d88ca960bb6604e3858Steve Naroff case ObjCPropertyRefExprClass: // FIXME: check if read-only property. 967799a6a6850af625946bb8d88ca960bb6604e3858Steve Naroff return LV_Valid; 96809105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian case ObjCImplicitSetterGetterRefExprClass: // FIXME: check if read-only property. 969670a62cd1d51042ea076cda5e93f26a1d8327fb3Chris Lattner return LV_Valid; 970d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExprClass: 971796da18402f286b897782a298ae3b20c459c102eDouglas Gregor return LV_Valid; 97204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner case CXXDefaultArgExprClass: 97328be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner return cast<CXXDefaultArgExpr>(this)->getExpr()->isLvalue(Ctx); 97424b41fa8239c63b9eb570d3e83c4a82840656a65Argyrios Kyrtzidis case CXXConditionDeclExprClass: 97524b41fa8239c63b9eb570d3e83c4a82840656a65Argyrios Kyrtzidis return LV_Valid; 9766eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor case CStyleCastExprClass: 9779d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor case CXXFunctionalCastExprClass: 9789d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor case CXXStaticCastExprClass: 9799d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor case CXXDynamicCastExprClass: 9809d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor case CXXReinterpretCastExprClass: 9819d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor case CXXConstCastExprClass: 9829d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // The result of an explicit cast is an lvalue if the type we are 9837c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // casting to is an lvalue reference type. See C++ [expr.cast]p1, 9849d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // C++ [expr.static.cast]p2, C++ [expr.dynamic.cast]p2, 9859d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // C++ [expr.reinterpret.cast]p1, C++ [expr.const.cast]p1. 9867c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl if (cast<ExplicitCastExpr>(this)->getTypeAsWritten()-> 9877c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl isLValueReferenceType()) 9889d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor return LV_Valid; 9899d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor break; 990c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl case CXXTypeidExprClass: 991c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl // C++ 5.2.8p1: The result of a typeid expression is an lvalue of ... 992c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return LV_Valid; 9936f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson case CXXBindTemporaryExprClass: 9946f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson return cast<CXXBindTemporaryExpr>(this)->getSubExpr()-> 9956f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson isLvalueInternal(Ctx); 99676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl case ConditionalOperatorClass: { 99776458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // Complicated handling is only for C++. 99876458501a8963fa11b91c9337a487de6871169b4Sebastian Redl if (!Ctx.getLangOptions().CPlusPlus) 99976458501a8963fa11b91c9337a487de6871169b4Sebastian Redl return LV_InvalidExpression; 100076458501a8963fa11b91c9337a487de6871169b4Sebastian Redl 100176458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // Sema should have taken care to ensure that a CXXTemporaryObjectExpr is 100276458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // everywhere there's an object converted to an rvalue. Also, any other 100376458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // casts should be wrapped by ImplicitCastExprs. There's just the special 100476458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // case involving throws to work out. 100576458501a8963fa11b91c9337a487de6871169b4Sebastian Redl const ConditionalOperator *Cond = cast<ConditionalOperator>(this); 1006d5f3a0fde43bca9f3738aed931b0f13ca73a9f11Douglas Gregor Expr *True = Cond->getTrueExpr(); 1007d5f3a0fde43bca9f3738aed931b0f13ca73a9f11Douglas Gregor Expr *False = Cond->getFalseExpr(); 100876458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // C++0x 5.16p2 100976458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // If either the second or the third operand has type (cv) void, [...] 101076458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // the result [...] is an rvalue. 1011d5f3a0fde43bca9f3738aed931b0f13ca73a9f11Douglas Gregor if (True->getType()->isVoidType() || False->getType()->isVoidType()) 101276458501a8963fa11b91c9337a487de6871169b4Sebastian Redl return LV_InvalidExpression; 101376458501a8963fa11b91c9337a487de6871169b4Sebastian Redl 101476458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // Both sides must be lvalues for the result to be an lvalue. 1015d5f3a0fde43bca9f3738aed931b0f13ca73a9f11Douglas Gregor if (True->isLvalue(Ctx) != LV_Valid || False->isLvalue(Ctx) != LV_Valid) 101676458501a8963fa11b91c9337a487de6871169b4Sebastian Redl return LV_InvalidExpression; 101776458501a8963fa11b91c9337a487de6871169b4Sebastian Redl 101876458501a8963fa11b91c9337a487de6871169b4Sebastian Redl // That's it. 101976458501a8963fa11b91c9337a487de6871169b4Sebastian Redl return LV_Valid; 102076458501a8963fa11b91c9337a487de6871169b4Sebastian Redl } 102176458501a8963fa11b91c9337a487de6871169b4Sebastian Redl 10225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: 10235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return LV_InvalidExpression; 10265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 10295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// does not have an incomplete type, does not have a const-qualified type, and 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// if it is a structure or union, does not have any member (including, 10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// recursively, any member or element of all contained aggregates or unions) 10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with a const-qualified type. 10331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpExpr::isModifiableLvalueResult 103444e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel DunbarExpr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const { 103528be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner isLvalueResult lvalResult = isLvalue(Ctx); 10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (lvalResult) { 10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case LV_Valid: 1039ae8d467e75a4e72b19e1eca199bf93dfaab47acfDouglas Gregor // C++ 3.10p11: Functions cannot be modified, but pointers to 1040ae8d467e75a4e72b19e1eca199bf93dfaab47acfDouglas Gregor // functions can be modifiable. 1041ae8d467e75a4e72b19e1eca199bf93dfaab47acfDouglas Gregor if (Ctx.getLangOptions().CPlusPlus && TR->isFunctionType()) 1042ae8d467e75a4e72b19e1eca199bf93dfaab47acfDouglas Gregor return MLV_NotObjectType; 1043ae8d467e75a4e72b19e1eca199bf93dfaab47acfDouglas Gregor break; 1044ae8d467e75a4e72b19e1eca199bf93dfaab47acfDouglas Gregor 10455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LV_NotObjectType: return MLV_NotObjectType; 10465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LV_IncompleteVoidType: return MLV_IncompleteVoidType; 1047fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff case LV_DuplicateVectorComponents: return MLV_DuplicateVectorComponents; 1048ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner case LV_InvalidExpression: 1049ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner // If the top level is a C-style cast, and the subexpression is a valid 1050ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner // lvalue, then this is probably a use of the old-school "cast as lvalue" 1051ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner // GCC extension. We don't support it, but we want to produce good 1052ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner // diagnostics when it happens so that the user knows why. 105344e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar if (const CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(IgnoreParens())) { 105444e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar if (CE->getSubExpr()->isLvalue(Ctx) == LV_Valid) { 105544e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar if (Loc) 105644e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar *Loc = CE->getLParenLoc(); 1057ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner return MLV_LValueCast; 105844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar } 105944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar } 1060ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner return MLV_InvalidExpression; 106186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor case LV_MemberFunction: return MLV_MemberFunction; 10625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 106304831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman 106404831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman // The following is illegal: 106504831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman // void takeclosure(void (^C)(void)); 106604831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman // void func() { int x = 1; takeclosure(^{ x = 7; }); } 106704831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman // 1068c3f48cd3f08c384de50a3eeceaa79f4800a35f19Fariborz Jahanian if (const BlockDeclRefExpr *BDR = dyn_cast<BlockDeclRefExpr>(this)) { 106904831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman if (!BDR->isByRef() && isa<VarDecl>(BDR->getDecl())) 107004831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman return MLV_NotBlockQualified; 107104831aa3271edc5f00a651bf7152c2902981d7c3Eli Friedman } 10727e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 1073c3f48cd3f08c384de50a3eeceaa79f4800a35f19Fariborz Jahanian // Assigning to an 'implicit' property? 10747e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar if (const ObjCImplicitSetterGetterRefExpr* Expr = 1075c3f48cd3f08c384de50a3eeceaa79f4800a35f19Fariborz Jahanian dyn_cast<ObjCImplicitSetterGetterRefExpr>(this)) { 1076c3f48cd3f08c384de50a3eeceaa79f4800a35f19Fariborz Jahanian if (Expr->getSetterMethod() == 0) 1077c3f48cd3f08c384de50a3eeceaa79f4800a35f19Fariborz Jahanian return MLV_NoSetterProperty; 1078c3f48cd3f08c384de50a3eeceaa79f4800a35f19Fariborz Jahanian } 10797e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 1080c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner QualType CT = Ctx.getCanonicalType(getType()); 10811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1082c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (CT.isConstQualified()) 10835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return MLV_ConstQualified; 1084c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (CT->isArrayType()) 10855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return MLV_ArrayType; 1086c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (CT->isIncompleteType()) 10875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return MLV_IncompleteType; 10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10896217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *r = CT->getAs<RecordType>()) { 10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (r->hasConstFields()) 10915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return MLV_ConstQualified; 10925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return MLV_Valid; 10955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 109744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian/// isOBJCGCCandidate - Check if an expression is objc gc'able. 10987f4f86a2167abc116275e49c81350fc3225485e5Fariborz Jahanian/// returns true, if it is; false otherwise. 1099102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanianbool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { 110044baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian switch (getStmtClass()) { 110144baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian default: 110244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian return false; 110344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ObjCIvarRefExprClass: 110444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian return true; 1105207c5210eb0ac7b632609f0c006eb97ef2738948Fariborz Jahanian case Expr::UnaryOperatorClass: 1106102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<UnaryOperator>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 110744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ParenExprClass: 1108102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 110944baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ImplicitCastExprClass: 1110102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 111106b89124a9a5971a0528cc9da6817740bac43164Fariborz Jahanian case CStyleCastExprClass: 1112102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 111344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case DeclRefExprClass: 111444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case QualifiedDeclRefExprClass: { 111544baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian const Decl *D = cast<DeclRefExpr>(this)->getDecl(); 1116102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 1117102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian if (VD->hasGlobalStorage()) 1118102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return true; 1119102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian QualType T = VD->getType(); 112059a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian // dereferencing to a pointer is always a gc'able candidate, 112159a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian // unless it is __weak. 11227e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar return T->isPointerType() && 11230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak); 1124102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian } 112544baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian return false; 112644baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian } 112783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor case MemberExprClass: { 112844baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian const MemberExpr *M = cast<MemberExpr>(this); 1129102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return M->getBase()->isOBJCGCCandidate(Ctx); 113044baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian } 113144baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian case ArraySubscriptExprClass: 1132102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(Ctx); 113344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian } 113444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian} 11354e99a5fc3b203397a91136c6e695e405fb8fc606Ted KremenekExpr* Expr::IgnoreParens() { 11364e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek Expr* E = this; 11374e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek while (ParenExpr* P = dyn_cast<ParenExpr>(E)) 11384e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek E = P->getSubExpr(); 11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11404e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek return E; 11414e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek} 11424e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek 114356f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 114456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// or CastExprs or ImplicitCastExprs, returning their operand. 114556f349400c5932a196509c0480ff6f99a9a0b48fChris LattnerExpr *Expr::IgnoreParenCasts() { 114656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner Expr *E = this; 114756f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner while (true) { 114856f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner if (ParenExpr *P = dyn_cast<ParenExpr>(E)) 114956f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner E = P->getSubExpr(); 115056f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner else if (CastExpr *P = dyn_cast<CastExpr>(E)) 115156f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner E = P->getSubExpr(); 115256f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner else 115356f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner return E; 115456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner } 115556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner} 115656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner 1157ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 1158ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// value (including ptr->int casts of the same size). Strip off any 1159ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// ParenExpr or CastExprs, returning their operand. 1160ecdd84147c0765caa999ddc22dde25b42712bb4dChris LattnerExpr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) { 1161ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Expr *E = this; 1162ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner while (true) { 1163ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1164ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner E = P->getSubExpr(); 1165ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner continue; 1166ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 11671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1168ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1169ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner // We ignore integer <-> casts that are of the same width, ptr<->ptr and 1170ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner // ptr<->int casts of the same width. We also ignore all identify casts. 1171ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Expr *SE = P->getSubExpr(); 11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1173ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) { 1174ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner E = SE; 1175ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner continue; 1176ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1178ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner if ((E->getType()->isPointerType() || E->getType()->isIntegralType()) && 1179ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner (SE->getType()->isPointerType() || SE->getType()->isIntegralType()) && 1180ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) { 1181ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner E = SE; 1182ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner continue; 1183ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 1184ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1186ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner return E; 1187ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 1188ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner} 1189ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner 1190ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner 1191898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyTypeDependentArguments - Determines if any of the expressions 1192898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is type-dependent. 1193898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) { 1194898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor for (unsigned I = 0; I < NumExprs; ++I) 1195898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor if (Exprs[I]->isTypeDependent()) 1196898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return true; 1197898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1198898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return false; 1199898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} 1200898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1201898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyValueDependentArguments - Determines if any of the expressions 1202898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is value-dependent. 1203898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) { 1204898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor for (unsigned I = 0; I < NumExprs; ++I) 1205898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor if (Exprs[I]->isValueDependent()) 1206898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return true; 1207898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1208898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor return false; 1209898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} 1210898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1211c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedmanbool Expr::isConstantInitializer(ASTContext &Ctx) const { 1212c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // This function is attempting whether an expression is an initializer 1213c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // which can be evaluated at compile-time. isEvaluatable handles most 1214c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // of the cases, but it can't deal with some initializer-specific 1215c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // expressions, and it can't deal with aggregates; we deal with those here, 1216c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // and fall back to isEvaluatable for the other cases. 1217c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman 12181f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This function assumes the variable being assigned to 12191f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // isn't a reference type! 12201f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman 1221e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson switch (getStmtClass()) { 1222c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman default: break; 1223e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson case StringLiteralClass: 122414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff case ObjCStringLiteralClass: 1225eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner case ObjCEncodeExprClass: 1226e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson return true; 122759b5da6d853b4368b984700315adf7b37de05764Nate Begeman case CompoundLiteralExprClass: { 12281f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // This handles gcc's extension that allows global initializers like 12291f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // "struct x {int x;} x = (struct x) {};". 12301f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This accepts other cases it shouldn't! 123159b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer(); 1232c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman return Exp->isConstantInitializer(Ctx); 123359b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 1234e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson case InitListExprClass: { 12351f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This doesn't deal with fields with reference types correctly. 12361f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // FIXME: This incorrectly allows pointers cast to integers to be assigned 12371f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman // to bitfields. 1238e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson const InitListExpr *Exp = cast<InitListExpr>(this); 1239e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson unsigned numInits = Exp->getNumInits(); 1240e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson for (unsigned i = 0; i < numInits; i++) { 12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Exp->getInit(i)->isConstantInitializer(Ctx)) 1242e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson return false; 1243e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson } 1244c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return true; 1245e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson } 12463498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor case ImplicitValueInitExprClass: 12473498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return true; 1248c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman case ParenExprClass: { 1249c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return cast<ParenExpr>(this)->getSubExpr()->isConstantInitializer(Ctx); 1250c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman } 1251c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman case UnaryOperatorClass: { 1252c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman const UnaryOperator* Exp = cast<UnaryOperator>(this); 1253c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman if (Exp->getOpcode() == UnaryOperator::Extension) 1254c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return Exp->getSubExpr()->isConstantInitializer(Ctx); 1255c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman break; 1256c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman } 125781045d8dcd967def69d8e0945566214a9fe9ffccChris Lattner case ImplicitCastExprClass: 1258c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman case CStyleCastExprClass: 1259c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // Handle casts with a destination that's a struct or union; this 1260c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // deals with both the gcc no-op struct cast extension and the 1261c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman // cast-to-union extension. 1262c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman if (getType()->isRecordType()) 1263c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return cast<CastExpr>(this)->getSubExpr()->isConstantInitializer(Ctx); 1264c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman break; 1265e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson } 1266c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman return isEvaluatable(Ctx); 126738374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff} 126838374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff 12695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isIntegerConstantExpr - this recursive routine will test if an expression is 1270e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman/// an integer constant expression. 12715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero, 12735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// comma, etc 12745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 1275ce0afc0b09accbf7370b2ba87574b2c4be7fb032Chris Lattner/// FIXME: Handle offsetof. Two things to do: Handle GCC's __builtin_offsetof 1276ce0afc0b09accbf7370b2ba87574b2c4be7fb032Chris Lattner/// to support gcc 4.0+ and handle the idiom GCC recognizes with a null pointer 1277ce0afc0b09accbf7370b2ba87574b2c4be7fb032Chris Lattner/// cast+dereference. 12782d6744ff04c1690a1485178d550d2fab84a0270bDaniel Dunbar 1279e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// CheckICE - This function does the fundamental ICE checking: the returned 1280e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation. 1281e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// Note that to reduce code duplication, this helper does no evaluation 12821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// itself; the caller checks whether the expression is evaluatable, and 1283e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// in the rare cases where CheckICE actually cares about the evaluated 12841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// value, it calls into Evalute. 1285e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// 1286e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// Meanings of Val: 1287e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// 0: This expression is an ICE if it can be evaluated by Evaluate. 1288e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// 1: This expression is not an ICE, but if it isn't evaluated, it's 1289e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// a legal subexpression for an ICE. This return value is used to handle 1290e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// the comma operator in C99 mode. 1291e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman// 2: This expression is not an ICE, and is not a legal subexpression for one. 1292e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman 1293e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedmanstruct ICEDiag { 1294e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman unsigned Val; 1295e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman SourceLocation Loc; 1296e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman 1297e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman public: 1298e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {} 1299e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag() : Val(0) {} 1300e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman}; 1301e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman 1302e28d7195aad595154130ac8d03cc6c6513ece1bfEli FriedmanICEDiag NoDiag() { return ICEDiag(); } 1303e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman 130460ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedmanstatic ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) { 130560ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman Expr::EvalResult EVResult; 130660ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (!E->Evaluate(EVResult, Ctx) || EVResult.HasSideEffects || 130760ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman !EVResult.Val.isInt()) { 130860ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return ICEDiag(2, E->getLocStart()); 130960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } 131060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return NoDiag(); 131160ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman} 131260ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman 1313e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedmanstatic ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { 1314c3082413e4207173b32c118e922d63149df6261fAnders Carlsson assert(!E->isValueDependent() && "Should not see value dependent exprs!"); 1315e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (!E->getType()->isIntegralType()) { 1316e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 1317a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1318e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman 1319e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman switch (E->getStmtClass()) { 1320f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor#define STMT(Node, Base) case Expr::Node##Class: 1321f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor#define EXPR(Node, Base) 1322f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor#include "clang/AST/StmtNodes.def" 1323f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::PredefinedExprClass: 1324f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::FloatingLiteralClass: 1325f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ImaginaryLiteralClass: 1326f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::StringLiteralClass: 1327f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ArraySubscriptExprClass: 1328f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::MemberExprClass: 1329f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CompoundAssignOperatorClass: 1330f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CompoundLiteralExprClass: 1331f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ExtVectorElementExprClass: 1332f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::InitListExprClass: 1333f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::DesignatedInitExprClass: 1334f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ImplicitValueInitExprClass: 1335f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ParenListExprClass: 1336f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::VAArgExprClass: 1337f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::AddrLabelExprClass: 1338f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::StmtExprClass: 1339f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXMemberCallExprClass: 1340f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXDynamicCastExprClass: 1341f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXTypeidExprClass: 1342f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXNullPtrLiteralExprClass: 1343f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXThisExprClass: 1344f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXThrowExprClass: 1345f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXConditionDeclExprClass: // FIXME: is this correct? 1346f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXNewExprClass: 1347f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXDeleteExprClass: 1348f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXPseudoDestructorExprClass: 1349f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::UnresolvedFunctionNameExprClass: 1350f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::UnresolvedDeclRefExprClass: 1351f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::TemplateIdRefExprClass: 1352f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXConstructExprClass: 1353f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXBindTemporaryExprClass: 1354f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXExprWithTemporariesClass: 1355f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXTemporaryObjectExprClass: 1356f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXUnresolvedConstructExprClass: 1357f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXUnresolvedMemberExprClass: 1358f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCStringLiteralClass: 1359f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCEncodeExprClass: 1360f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCMessageExprClass: 1361f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCSelectorExprClass: 1362f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCProtocolExprClass: 1363f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCIvarRefExprClass: 1364f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCPropertyRefExprClass: 1365f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCImplicitSetterGetterRefExprClass: 1366f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCSuperExprClass: 1367f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ObjCIsaExprClass: 1368f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ShuffleVectorExprClass: 1369f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::BlockExprClass: 1370f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::BlockDeclRefExprClass: 1371f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::NoStmtClass: 1372f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ExprClass: 1373e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 13747e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 1375043cad21b78c6b02597cdc7b6ead32388e27ebc7Douglas Gregor case Expr::GNUNullExprClass: 1376043cad21b78c6b02597cdc7b6ead32388e27ebc7Douglas Gregor // GCC considers the GNU __null value to be an integral constant expression. 1377043cad21b78c6b02597cdc7b6ead32388e27ebc7Douglas Gregor return NoDiag(); 13787e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 1379e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::ParenExprClass: 1380e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx); 1381e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::IntegerLiteralClass: 1382e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::CharacterLiteralClass: 1383e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::CXXBoolLiteralExprClass: 1384e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::CXXZeroInitValueExprClass: 1385e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::TypesCompatibleExprClass: 1386e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::UnaryTypeTraitExprClass: 1387e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 13881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Expr::CallExprClass: 1389e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::CXXOperatorCallExprClass: { 1390e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman const CallExpr *CE = cast<CallExpr>(E); 139160ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (CE->isBuiltinCall(Ctx)) 139260ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return CheckEvalInICE(E, Ctx); 1393e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 139413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff } 1395e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::DeclRefExprClass: 1396e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::QualifiedDeclRefExprClass: 1397e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl())) 1398e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 13994a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl if (Ctx.getLangOptions().CPlusPlus && 14000953e767ff7817f97b3ab20896b229891eeff45bJohn McCall E->getType().getCVRQualifiers() == Qualifiers::Const) { 14014a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl // C++ 7.1.5.1p2 14024a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl // A variable of non-volatile const-qualified integral or enumeration 14034a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl // type initialized by an ICE can be used in ICEs. 14044a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl if (const VarDecl *Dcl = 1405e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman dyn_cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl())) { 140678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Dcl->isInitKnownICE()) { 140778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // We have already checked whether this subexpression is an 140878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // integral constant expression. 140978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Dcl->isInitICE()) 141078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return NoDiag(); 141178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor else 141278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return ICEDiag(2, E->getLocStart()); 141378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 141478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 141578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (const Expr *Init = Dcl->getInit()) { 141678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor ICEDiag Result = CheckICE(Init, Ctx); 141778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // Cache the result of the ICE test. 141878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Dcl->setInitKnownICE(Ctx, Result.Val == 0); 141978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return Result; 142078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 14214a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl } 14224a4251b9e719415f30db0f5170abf31296a62225Sebastian Redl } 1423e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 1424e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::UnaryOperatorClass: { 1425e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman const UnaryOperator *Exp = cast<UnaryOperator>(E); 14265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Exp->getOpcode()) { 1427f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case UnaryOperator::PostInc: 1428f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case UnaryOperator::PostDec: 1429f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case UnaryOperator::PreInc: 1430f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case UnaryOperator::PreDec: 1431f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case UnaryOperator::AddrOf: 1432f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case UnaryOperator::Deref: 1433e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 14347e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 14355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Extension: 1436e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case UnaryOperator::LNot: 14375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Plus: 14385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Minus: 14395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UnaryOperator::Not: 144060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman case UnaryOperator::Real: 144160ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman case UnaryOperator::Imag: 1442e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return CheckICE(Exp->getSubExpr(), Ctx); 14435a1deb8d9c0722beae28d693fa137bbb942bd11fAnders Carlsson case UnaryOperator::OffsetOf: 144460ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // Note that per C99, offsetof must be an ICE. And AFAIK, using 144560ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // Evaluate matches the proposed gcc behavior for cases like 144660ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // "offsetof(struct s{int x[4];}, x[!.0])". This doesn't affect 144760ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // compliance: we should warn earlier for offsetof expressions with 144860ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // array subscripts that aren't ICEs, and if the array subscripts 144960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // are ICEs, the value of the offsetof must be an integer constant. 145060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return CheckEvalInICE(E, Ctx); 14515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 14525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1453e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::SizeOfAlignOfExprClass: { 1454e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman const SizeOfAlignOfExpr *Exp = cast<SizeOfAlignOfExpr>(E); 1455e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (Exp->isSizeOf() && Exp->getTypeOfArgument()->isVariableArrayType()) 1456e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 1457e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 14585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1459e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::BinaryOperatorClass: { 1460e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman const BinaryOperator *Exp = cast<BinaryOperator>(E); 14615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Exp->getOpcode()) { 1462f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::PtrMemD: 1463f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::PtrMemI: 1464f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::Assign: 1465f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::MulAssign: 1466f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::DivAssign: 1467f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::RemAssign: 1468f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::AddAssign: 1469f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::SubAssign: 1470f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::ShlAssign: 1471f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::ShrAssign: 1472f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::AndAssign: 1473f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::XorAssign: 1474f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case BinaryOperator::OrAssign: 1475e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 14767e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 14775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BinaryOperator::Mul: 14785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BinaryOperator::Div: 14795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BinaryOperator::Rem: 1480e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::Add: 1481e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::Sub: 14825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BinaryOperator::Shl: 14835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BinaryOperator::Shr: 1484e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::LT: 1485e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::GT: 1486e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::LE: 1487e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::GE: 1488e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::EQ: 1489e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::NE: 1490e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::And: 1491e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::Xor: 1492e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::Or: 1493e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::Comma: { 1494e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 1495e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 149660ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (Exp->getOpcode() == BinaryOperator::Div || 149760ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman Exp->getOpcode() == BinaryOperator::Rem) { 149860ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // Evaluate gives an error for undefined Div/Rem, so make sure 149960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // we don't evaluate one. 150060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (LHSResult.Val != 2 && RHSResult.Val != 2) { 150160ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman llvm::APSInt REval = Exp->getRHS()->EvaluateAsInt(Ctx); 150260ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (REval == 0) 150360ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return ICEDiag(1, E->getLocStart()); 150460ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (REval.isSigned() && REval.isAllOnesValue()) { 150560ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman llvm::APSInt LEval = Exp->getLHS()->EvaluateAsInt(Ctx); 150660ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (LEval.isMinSignedValue()) 150760ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return ICEDiag(1, E->getLocStart()); 150860ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } 150960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } 151060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } 151160ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (Exp->getOpcode() == BinaryOperator::Comma) { 151260ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (Ctx.getLangOptions().C99) { 151360ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // C99 6.6p3 introduces a strange edge case: comma can be in an ICE 151460ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // if it isn't evaluated. 151560ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (LHSResult.Val == 0 && RHSResult.Val == 0) 151660ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return ICEDiag(1, E->getLocStart()); 151760ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } else { 151860ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman // In both C89 and C++, commas in ICEs are illegal. 151960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return ICEDiag(2, E->getLocStart()); 152060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } 1521b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 1522e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (LHSResult.Val >= RHSResult.Val) 1523e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return LHSResult; 1524e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return RHSResult; 15255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1526e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::LAnd: 1527e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case BinaryOperator::LOr: { 1528e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 1529e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 1530e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (LHSResult.Val == 0 && RHSResult.Val == 1) { 1531e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman // Rare case where the RHS has a comma "side-effect"; we need 1532e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman // to actually check the condition to see whether the side 1533e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman // with the comma is evaluated. 1534e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if ((Exp->getOpcode() == BinaryOperator::LAnd) != 153560ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman (Exp->getLHS()->EvaluateAsInt(Ctx) == 0)) 1536e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return RHSResult; 1537e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 1538a135975d4257ccc83f13b607b29d882bb00c80b6Daniel Dunbar } 153960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman 1540e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (LHSResult.Val >= RHSResult.Val) 1541e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return LHSResult; 1542e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return RHSResult; 15435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1544987b15db39745cd7fb2e634ba1a4b85469ac9131Chris Lattner } 15455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1546f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CastExprClass: 1547e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::ImplicitCastExprClass: 1548f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::ExplicitCastExprClass: 1549e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::CStyleCastExprClass: 155059600d80b7e34e819cd25dd67f661aa1f3d9099dDouglas Gregor case Expr::CXXFunctionalCastExprClass: 1551f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor case Expr::CXXNamedCastExprClass: 155259600d80b7e34e819cd25dd67f661aa1f3d9099dDouglas Gregor case Expr::CXXStaticCastExprClass: 155359600d80b7e34e819cd25dd67f661aa1f3d9099dDouglas Gregor case Expr::CXXReinterpretCastExprClass: 155459600d80b7e34e819cd25dd67f661aa1f3d9099dDouglas Gregor case Expr::CXXConstCastExprClass: { 1555e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr(); 1556e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (SubExpr->getType()->isIntegralType()) 1557e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return CheckICE(SubExpr, Ctx); 1558e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (isa<FloatingLiteral>(SubExpr->IgnoreParens())) 1559e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 1560e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return ICEDiag(2, E->getLocStart()); 1561e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman } 1562e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::ConditionalOperatorClass: { 1563e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman const ConditionalOperator *Exp = cast<ConditionalOperator>(E); 15641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the condition (ignoring parens) is a __builtin_constant_p call, 156528daa53db73341b7ee7f269924ccfca1c6d179acChris Lattner // then only the true side is actually considered in an integer constant 156642b83dde7c700b34f9435ad746984169888ae705Chris Lattner // expression, and it is fully evaluated. This is an important GNU 156742b83dde7c700b34f9435ad746984169888ae705Chris Lattner // extension. See GCC PR38377 for discussion. 1568e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (const CallExpr *CallCE = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts())) 15693c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (CallCE->isBuiltinCall(Ctx) == Builtin::BI__builtin_constant_p) { 1570e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman Expr::EvalResult EVResult; 1571e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (!E->Evaluate(EVResult, Ctx) || EVResult.HasSideEffects || 1572e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman !EVResult.Val.isInt()) { 157360ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman return ICEDiag(2, E->getLocStart()); 1574e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman } 1575e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 157642b83dde7c700b34f9435ad746984169888ae705Chris Lattner } 1577e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx); 1578e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx); 1579e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 1580e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (CondResult.Val == 2) 1581e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return CondResult; 1582e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (TrueResult.Val == 2) 1583e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return TrueResult; 1584e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (FalseResult.Val == 2) 1585e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return FalseResult; 1586e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (CondResult.Val == 1) 1587e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return CondResult; 1588e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (TrueResult.Val == 0 && FalseResult.Val == 0) 1589e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return NoDiag(); 1590e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman // Rare case where the diagnostics depend on which side is evaluated 1591e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman // Note that if we get here, CondResult is 0, and at least one of 1592e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman // TrueResult and FalseResult is non-zero. 159360ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (Exp->getCond()->EvaluateAsInt(Ctx) == 0) { 1594e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return FalseResult; 1595e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman } 1596e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return TrueResult; 15975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1598e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman case Expr::CXXDefaultArgExprClass: 1599e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx); 160060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman case Expr::ChooseExprClass: { 16017976932a1c256d447316ffac58e9821417725e34Eli Friedman return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx); 160260ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman } 16035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16047e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar 1605f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor // Silence a GCC warning 1606f299124fe491879fed48f611f6f299382d114dd4Douglas Gregor return ICEDiag(2, E->getLocStart()); 1607e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman} 16085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1609e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedmanbool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 1610e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman SourceLocation *Loc, bool isEvaluated) const { 1611e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman ICEDiag d = CheckICE(this, Ctx); 1612e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (d.Val != 0) { 1613e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman if (Loc) *Loc = d.Loc; 1614e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman return false; 1615e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman } 1616e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman EvalResult EvalResult; 161760ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman if (!Evaluate(EvalResult, Ctx)) 161860ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman assert(0 && "ICE cannot be evaluated!"); 161960ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman assert(!EvalResult.HasSideEffects && "ICE with side effects!"); 162060ce9635b969d17ff1bbe269deff5ec3c6b1bc06Eli Friedman assert(EvalResult.Val.isInt() && "ICE that isn't integer!"); 1621e28d7195aad595154130ac8d03cc6c6513ece1bfEli Friedman Result = EvalResult.Val.getInt(); 16225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 16235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isNullPointerConstant - C99 6.3.2.3p3 - Return true if this is either an 16265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// integer constant expression with the value zero, or if this is one that is 16275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// cast to void*. 1628ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregorbool Expr::isNullPointerConstant(ASTContext &Ctx, 1629ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NullPointerConstantValueDependence NPC) const { 1630ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor if (isValueDependent()) { 1631ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor switch (NPC) { 1632ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor case NPC_NeverValueDependent: 1633ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor assert(false && "Unexpected value dependent expression!"); 1634ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor // If the unthinkable happens, fall through to the safest alternative. 1635ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor 1636ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor case NPC_ValueDependentIsNull: 1637ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return isTypeDependent() || getType()->isIntegralType(); 1638ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor 1639ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor case NPC_ValueDependentIsNotNull: 1640ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return false; 1641ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor } 1642ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor } 1643f515b2268f829adfbfdb751f54d102b53ed0285cDaniel Dunbar 16440777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Strip off a cast to void*, if it exists. Except in C++. 16450835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) { 16466215dee86c0e715b9f2b0d401ab2a5fcf629f1afSebastian Redl if (!Ctx.getLangOptions().CPlusPlus) { 16470777972d38a3125efed962b045704c30ae6965cfSebastian Redl // Check that it is a cast to void*. 16486217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = CE->getType()->getAs<PointerType>()) { 16490777972d38a3125efed962b045704c30ae6965cfSebastian Redl QualType Pointee = PT->getPointeeType(); 16500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (!Pointee.hasQualifiers() && 16510777972d38a3125efed962b045704c30ae6965cfSebastian Redl Pointee->isVoidType() && // to void* 16520777972d38a3125efed962b045704c30ae6965cfSebastian Redl CE->getSubExpr()->getType()->isIntegerType()) // from int. 1653ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 16540777972d38a3125efed962b045704c30ae6965cfSebastian Redl } 16555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1656aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) { 1657aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // Ignore the ImplicitCastExpr type entirely. 1658ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 1659aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) { 1660aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // Accept ((void*)0) as a null pointer constant, as many other 1661aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // implementations do. 1662ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (const CXXDefaultArgExpr *DefaultArg 16648123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner = dyn_cast<CXXDefaultArgExpr>(this)) { 166504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // See through default argument expressions 1666ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC); 16672d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor } else if (isa<GNUNullExpr>(this)) { 16682d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor // The GNU __null extension is always a null pointer constant. 16692d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor return true; 1670aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff } 16712d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 16726e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl // C++0x nullptr_t is always a null pointer constant. 16736e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl if (getType()->isNullPtrType()) 16746e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl return true; 16756e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 1676aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff // This expression must be an integer type. 1677aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff if (!getType()->isIntegerType()) 1678aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff return false; 16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If we have an integer constant expression, we need to *evaluate* it and 16815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // test for the value 0. 168209de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman llvm::APSInt Result; 168309de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman return isIntegerConstantExpr(Result, Ctx) && Result == 0; 16845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 168531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff 168633bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas GregorFieldDecl *Expr::getBitField() { 16876f4a69a3107e7ff1569c747f7c6bdf7cff8cbf55Douglas Gregor Expr *E = this->IgnoreParens(); 168833bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor 168927c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E)) 169086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl())) 169133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor if (Field->isBitField()) 169233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor return Field; 169333bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor 169433bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) 169533bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor if (BinOp->isAssignmentOp() && BinOp->getLHS()) 169633bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor return BinOp->getLHS()->getBitField(); 169733bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor 169833bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor return 0; 169927c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor} 170027c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor 17012140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// isArrow - Return true if the base expression is a pointer to vector, 17022140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// return false if the base expression is a vector. 17032140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattnerbool ExtVectorElementExpr::isArrow() const { 17042140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner return getBase()->getType()->isPointerType(); 17052140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner} 17062140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner 1707213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanunsigned ExtVectorElementExpr::getNumElements() const { 1708183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const VectorType *VT = getType()->getAs<VectorType>()) 17098a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman return VT->getNumElements(); 17108a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman return 1; 17114d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner} 17124d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner 17138a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// containsDuplicateElements - Return true if any element access is repeated. 1714213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanbool ExtVectorElementExpr::containsDuplicateElements() const { 1715d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor const char *compStr = Accessor->getName(); 1716d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor unsigned length = Accessor->getLength(); 1717190d6a25393995b42e32086949a68285ee423fb9Nate Begeman 1718190d6a25393995b42e32086949a68285ee423fb9Nate Begeman // Halving swizzles do not contain duplicate elements. 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!strcmp(compStr, "hi") || !strcmp(compStr, "lo") || 1720190d6a25393995b42e32086949a68285ee423fb9Nate Begeman !strcmp(compStr, "even") || !strcmp(compStr, "odd")) 1721190d6a25393995b42e32086949a68285ee423fb9Nate Begeman return false; 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1723190d6a25393995b42e32086949a68285ee423fb9Nate Begeman // Advance past s-char prefix on hex swizzles. 1724131f4658249b2a7d2d7e30fe07e84c484f79ef99Nate Begeman if (*compStr == 's' || *compStr == 'S') { 1725190d6a25393995b42e32086949a68285ee423fb9Nate Begeman compStr++; 1726190d6a25393995b42e32086949a68285ee423fb9Nate Begeman length--; 1727190d6a25393995b42e32086949a68285ee423fb9Nate Begeman } 17281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17297e3e9b152e06edf329ceb32190d3255f248d4d5fChris Lattner for (unsigned i = 0; i != length-1; i++) { 1730fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff const char *s = compStr+i; 1731fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff for (const char c = *s++; *s; s++) 17321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (c == *s) 1733fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff return true; 1734fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff } 1735fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff return false; 1736fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff} 1737b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner 17388a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. 17393b8d116703db8018f855cbb4733ace426422623bNate Begemanvoid ExtVectorElementExpr::getEncodedElementAccess( 17403b8d116703db8018f855cbb4733ace426422623bNate Begeman llvm::SmallVectorImpl<unsigned> &Elts) const { 1741d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor const char *compStr = Accessor->getName(); 1742131f4658249b2a7d2d7e30fe07e84c484f79ef99Nate Begeman if (*compStr == 's' || *compStr == 'S') 1743353417af9d254d4fd0eb7d0a3ff71c4d8594ac58Nate Begeman compStr++; 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1745353417af9d254d4fd0eb7d0a3ff71c4d8594ac58Nate Begeman bool isHi = !strcmp(compStr, "hi"); 1746353417af9d254d4fd0eb7d0a3ff71c4d8594ac58Nate Begeman bool isLo = !strcmp(compStr, "lo"); 1747353417af9d254d4fd0eb7d0a3ff71c4d8594ac58Nate Begeman bool isEven = !strcmp(compStr, "even"); 1748353417af9d254d4fd0eb7d0a3ff71c4d8594ac58Nate Begeman bool isOdd = !strcmp(compStr, "odd"); 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17508a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman for (unsigned i = 0, e = getNumElements(); i != e; ++i) { 17518a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman uint64_t Index; 17521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17538a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman if (isHi) 17548a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = e + i; 17558a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else if (isLo) 17568a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = i; 17578a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else if (isEven) 17588a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = 2 * i; 17598a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else if (isOdd) 17608a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = 2 * i + 1; 17618a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman else 17628a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman Index = ExtVectorType::getAccessorIdx(compStr[i]); 1763b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner 17643b8d116703db8018f855cbb4733ace426422623bNate Begeman Elts.push_back(Index); 1765b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner } 17668a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman} 17678a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman 176868d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff// constructor for instance messages. 1769bcfb06ac6da1aa3c74ac1ef7a49c2807522366e7Steve NaroffObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo, 1770a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek QualType retType, ObjCMethodDecl *mproto, 1771db611d556f71f98b66b69514d45958d76e5727abSteve Naroff SourceLocation LBrac, SourceLocation RBrac, 177249f109c786f99eb7468dac3976db083a65493444Steve Naroff Expr **ArgExprs, unsigned nargs) 17731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 1774ea958e57a370b641c5a69347b75e9f8e3b5a41a2Ted Kremenek MethodProto(mproto) { 177549f109c786f99eb7468dac3976db083a65493444Steve Naroff NumArgs = nargs; 17765549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek SubExprs = new Stmt*[NumArgs+1]; 177768d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff SubExprs[RECEIVER] = receiver; 177849f109c786f99eb7468dac3976db083a65493444Steve Naroff if (NumArgs) { 177949f109c786f99eb7468dac3976db083a65493444Steve Naroff for (unsigned i = 0; i != NumArgs; ++i) 178068d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]); 178168d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff } 1782563477da25f824e37c535131695dc4dc9b68c465Steve Naroff LBracloc = LBrac; 1783563477da25f824e37c535131695dc4dc9b68c465Steve Naroff RBracloc = RBrac; 1784563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 1785563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// constructor for class messages. 178768d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff// FIXME: clsName should be typed to ObjCInterfaceType 1788bcfb06ac6da1aa3c74ac1ef7a49c2807522366e7Steve NaroffObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo, 1789a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek QualType retType, ObjCMethodDecl *mproto, 1790db611d556f71f98b66b69514d45958d76e5727abSteve Naroff SourceLocation LBrac, SourceLocation RBrac, 179149f109c786f99eb7468dac3976db083a65493444Steve Naroff Expr **ArgExprs, unsigned nargs) 17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 1793ea958e57a370b641c5a69347b75e9f8e3b5a41a2Ted Kremenek MethodProto(mproto) { 179449f109c786f99eb7468dac3976db083a65493444Steve Naroff NumArgs = nargs; 17955549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek SubExprs = new Stmt*[NumArgs+1]; 17964df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek SubExprs[RECEIVER] = (Expr*) ((uintptr_t) clsName | IsClsMethDeclUnknown); 179749f109c786f99eb7468dac3976db083a65493444Steve Naroff if (NumArgs) { 179849f109c786f99eb7468dac3976db083a65493444Steve Naroff for (unsigned i = 0; i != NumArgs; ++i) 179968d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]); 180068d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff } 1801563477da25f824e37c535131695dc4dc9b68c465Steve Naroff LBracloc = LBrac; 1802563477da25f824e37c535131695dc4dc9b68c465Steve Naroff RBracloc = RBrac; 1803563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 1804563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 18051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// constructor for class messages. 18064df728e368fa1f65ffc57572fed613dcca5b4fe8Ted KremenekObjCMessageExpr::ObjCMessageExpr(ObjCInterfaceDecl *cls, Selector selInfo, 18074df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek QualType retType, ObjCMethodDecl *mproto, 18084df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek SourceLocation LBrac, SourceLocation RBrac, 18094df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek Expr **ArgExprs, unsigned nargs) 18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump: Expr(ObjCMessageExprClass, retType), SelName(selInfo), 18114df728e368fa1f65ffc57572fed613dcca5b4fe8Ted KremenekMethodProto(mproto) { 18124df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek NumArgs = nargs; 18134df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek SubExprs = new Stmt*[NumArgs+1]; 18144df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek SubExprs[RECEIVER] = (Expr*) ((uintptr_t) cls | IsClsMethDeclKnown); 18154df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek if (NumArgs) { 18164df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek for (unsigned i = 0; i != NumArgs; ++i) 18174df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]); 18184df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek } 18194df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek LBracloc = LBrac; 18204df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek RBracloc = RBrac; 18214df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek} 18224df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek 18234df728e368fa1f65ffc57572fed613dcca5b4fe8Ted KremenekObjCMessageExpr::ClassInfo ObjCMessageExpr::getClassInfo() const { 18244df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek uintptr_t x = (uintptr_t) SubExprs[RECEIVER]; 18254df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek switch (x & Flags) { 18264df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek default: 18274df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek assert(false && "Invalid ObjCMessageExpr."); 18284df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek case IsInstMeth: 18294df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek return ClassInfo(0, 0); 18304df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek case IsClsMethDeclUnknown: 18314df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek return ClassInfo(0, (IdentifierInfo*) (x & ~Flags)); 18324df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek case IsClsMethDeclKnown: { 18334df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek ObjCInterfaceDecl* D = (ObjCInterfaceDecl*) (x & ~Flags); 18344df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek return ClassInfo(D, D->getIdentifier()); 18354df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek } 18364df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek } 18374df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek} 18384df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek 18390389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattnervoid ObjCMessageExpr::setClassInfo(const ObjCMessageExpr::ClassInfo &CI) { 18400389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner if (CI.first == 0 && CI.second == 0) 18410389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner SubExprs[RECEIVER] = (Expr*)((uintptr_t)0 | IsInstMeth); 18420389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner else if (CI.first == 0) 18430389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner SubExprs[RECEIVER] = (Expr*)((uintptr_t)CI.second | IsClsMethDeclUnknown); 18440389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner else 18450389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner SubExprs[RECEIVER] = (Expr*)((uintptr_t)CI.first | IsClsMethDeclKnown); 18460389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner} 18470389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner 18480389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner 184927437caadea35f84d550cd29f024fcf3ea240eecChris Lattnerbool ChooseExpr::isConditionTrue(ASTContext &C) const { 18509a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman return getCond()->EvaluateAsInt(C) != 0; 185127437caadea35f84d550cd29f024fcf3ea240eecChris Lattner} 185227437caadea35f84d550cd29f024fcf3ea240eecChris Lattner 1853888376a2bbcfc2f047902249f8455918e2489ae1Nate Begemanvoid ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs, 1854888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman unsigned NumExprs) { 1855888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman if (SubExprs) C.Deallocate(SubExprs); 1856888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman 1857888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman SubExprs = new (C) Stmt* [NumExprs]; 185894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor this->NumExprs = NumExprs; 185994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs); 18601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1861888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman 1862888376a2bbcfc2f047902249f8455918e2489ae1Nate Begemanvoid ShuffleVectorExpr::DoDestroy(ASTContext& C) { 1863888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman DestroyChildren(C); 1864888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman if (SubExprs) C.Deallocate(SubExprs); 1865888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman this->~ShuffleVectorExpr(); 1866888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman C.Deallocate(this); 186794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor} 186894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 186942602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregorvoid SizeOfAlignOfExpr::DoDestroy(ASTContext& C) { 18700518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // Override default behavior of traversing children. If this has a type 18710518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // operand and the type is a variable-length array, the child iteration 18720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // will iterate over the size expression. However, this expression belongs 18730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // to the type, not to this, so we don't want to delete it. 18740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // We still want to delete this expression. 18758189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek if (isArgumentType()) { 18768189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek this->~SizeOfAlignOfExpr(); 18778189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek C.Deallocate(this); 18788189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek } 18790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl else 188042602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor Expr::DoDestroy(C); 18819048891ff983d0681c116c6e8f1073aa31bdd6e8Daniel Dunbar} 18829048891ff983d0681c116c6e8f1073aa31bdd6e8Daniel Dunbar 188377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===// 188405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor// DesignatedInitExpr 188505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===// 188605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 188705c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorIdentifierInfo *DesignatedInitExpr::Designator::getFieldName() { 188805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 188905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field.NameOrField & 0x01) 189005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01); 189105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else 189205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return getField()->getIdentifier(); 189305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 189405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 18951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr::DesignatedInitExpr(QualType Ty, unsigned NumDesignators, 1896ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Designators, 18971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation EqualOrColonLoc, 1898ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor bool GNUSyntax, 18991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr **IndexExprs, 19009ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor unsigned NumIndexExprs, 19019ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Init) 19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Expr(DesignatedInitExprClass, Ty, 19039ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Init->isTypeDependent(), Init->isValueDependent()), 19041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax), 19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) { 1906ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor this->Designators = new Designator[NumDesignators]; 19079ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 19089ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Record the initializer itself. 19099ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor child_iterator Child = child_begin(); 19109ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = Init; 19119ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 19129ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Copy the designators and their subexpressions, computing 19139ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // value-dependence along the way. 19149ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor unsigned IndexIdx = 0; 19159ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor for (unsigned I = 0; I != NumDesignators; ++I) { 1916ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor this->Designators[I] = Designators[I]; 19179ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 19189ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor if (this->Designators[I].isArrayDesignator()) { 19199ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Compute type- and value-dependence. 19209ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Index = IndexExprs[IndexIdx]; 19211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ValueDependent = ValueDependent || 19229ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Index->isTypeDependent() || Index->isValueDependent(); 19239ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 19249ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Copy the index expressions into permanent storage. 19259ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = IndexExprs[IndexIdx++]; 19269ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } else if (this->Designators[I].isArrayRangeDesignator()) { 19279ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Compute type- and value-dependence. 19289ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Start = IndexExprs[IndexIdx]; 19299ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *End = IndexExprs[IndexIdx + 1]; 19301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ValueDependent = ValueDependent || 19319ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Start->isTypeDependent() || Start->isValueDependent() || 19329ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor End->isTypeDependent() || End->isValueDependent(); 19339ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 19349ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor // Copy the start/end expressions into permanent storage. 19359ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = IndexExprs[IndexIdx++]; 19369ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor *Child++ = IndexExprs[IndexIdx++]; 19379ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } 19389ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor } 19399ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 19409ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions"); 1941ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 1942ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 194305c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorDesignatedInitExpr * 19441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr::Create(ASTContext &C, Designator *Designators, 194505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumDesignators, 194605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr **IndexExprs, unsigned NumIndexExprs, 194705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation ColonOrEqualLoc, 194805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool UsesColonSyntax, Expr *Init) { 1949c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 1950c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff sizeof(Stmt *) * (NumIndexExprs + 1), 8); 19519ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor return new (Mem) DesignatedInitExpr(C.VoidTy, NumDesignators, Designators, 19529ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor ColonOrEqualLoc, UsesColonSyntax, 19539ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor IndexExprs, NumIndexExprs, Init); 195405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 195505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 19561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C, 1957d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned NumIndexExprs) { 1958d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 1959d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor sizeof(Stmt *) * (NumIndexExprs + 1), 8); 1960d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor return new (Mem) DesignatedInitExpr(NumIndexExprs + 1); 1961d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor} 1962d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid DesignatedInitExpr::setDesignators(const Designator *Desigs, 1964d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned NumDesigs) { 1965d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor if (Designators) 1966d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor delete [] Designators; 1967d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 1968d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Designators = new Designator[NumDesigs]; 1969d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor NumDesignators = NumDesigs; 1970d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor for (unsigned I = 0; I != NumDesigs; ++I) 1971d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Designators[I] = Desigs[I]; 1972d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor} 1973d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 197405c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorSourceRange DesignatedInitExpr::getSourceRange() const { 197505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation StartLoc; 1976d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner Designator &First = 1977d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner *const_cast<DesignatedInitExpr*>(this)->designators_begin(); 197805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (First.isFieldDesignator()) { 1979eeae8f072748affce25ab4064982626361293390Douglas Gregor if (GNUSyntax) 198005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc); 198105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else 198205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc); 198305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } else 1984d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner StartLoc = 1985d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc); 198605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceRange(StartLoc, getInit()->getSourceRange().getEnd()); 198705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 198805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 198905c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayIndex(const Designator& D) { 199005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(D.Kind == Designator::ArrayDesignator && "Requires array designator"); 199105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 199205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 199305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 199405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 199505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 199605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 199705c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) { 19981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(D.Kind == Designator::ArrayRangeDesignator && 199905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Requires array range designator"); 200005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 200105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 200205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 200305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 200405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 200505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 200605c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) { 20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(D.Kind == Designator::ArrayRangeDesignator && 200805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Requires array range designator"); 200905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 201005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 201105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 201205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2)); 201305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 201405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 2015ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Replaces the designator at index @p Idx with the series 2016ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// of designators in [First, Last). 20171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid DesignatedInitExpr::ExpandDesignator(unsigned Idx, 20181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Designator *First, 2019ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Last) { 2020ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor unsigned NumNewDesignators = Last - First; 2021ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor if (NumNewDesignators == 0) { 2022ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy_backward(Designators + Idx + 1, 2023ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators + NumDesignators, 2024ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators + Idx); 2025ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor --NumNewDesignators; 2026ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 2027ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } else if (NumNewDesignators == 1) { 2028ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators[Idx] = *First; 2029ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor return; 2030ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 2031ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 20321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator *NewDesignators 2033ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor = new Designator[NumDesignators - 1 + NumNewDesignators]; 2034ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy(Designators, Designators + Idx, NewDesignators); 2035ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy(First, Last, NewDesignators + Idx); 2036ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor std::copy(Designators + Idx + 1, Designators + NumDesignators, 2037ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor NewDesignators + Idx + NumNewDesignators); 2038ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor delete [] Designators; 2039ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designators = NewDesignators; 2040ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor NumDesignators = NumDesignators - 1 + NumNewDesignators; 2041ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 2042ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 204342602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregorvoid DesignatedInitExpr::DoDestroy(ASTContext &C) { 2044ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor delete [] Designators; 204542602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor Expr::DoDestroy(C); 2046ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor} 2047ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 20481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc, 20492ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Expr **exprs, unsigned nexprs, 20502ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation rparenloc) 20512ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman: Expr(ParenListExprClass, QualType(), 20522ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman hasAnyTypeDependentArguments(exprs, nexprs), 20531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump hasAnyValueDependentArguments(exprs, nexprs)), 20542ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) { 20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20562ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Exprs = new (C) Stmt*[nexprs]; 20572ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0; i != nexprs; ++i) 20582ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Exprs[i] = exprs[i]; 20592ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 20602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 20612ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid ParenListExpr::DoDestroy(ASTContext& C) { 20622ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman DestroyChildren(C); 20632ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (Exprs) C.Deallocate(Exprs); 20642ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman this->~ParenListExpr(); 20652ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman C.Deallocate(this); 20662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 20672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 206805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===// 2069ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek// ExprIterator. 2070ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===// 2071ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek 2072ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); } 2073ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator*() const { return cast<Expr>(*I); } 2074ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator->() const { return cast<Expr>(*I); } 2075ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator[](size_t idx) const { 2076ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek return cast<Expr>(I[idx]); 2077ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek} 2078ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); } 2079ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); } 2080ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek 2081ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===// 208277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// Child Iterators for iterating over subexpressions/substatements 208377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===// 208477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 208577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// DeclRefExpr 20869ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); } 20879ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); } 208877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 20897779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff// ObjCIvarRefExpr 20905549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; } 20915549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; } 20927779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff 2093e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroff// ObjCPropertyRefExpr 20945549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; } 20955549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; } 2096ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff 209709105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian// ObjCImplicitSetterGetterRefExpr 20981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_begin() { 20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return &Base; 2100154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian} 21011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_end() { 21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return &Base+1; 2103154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian} 21045daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 2105cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor// ObjCSuperExpr 2106cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas GregorStmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); } 2107cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas GregorStmt::child_iterator ObjCSuperExpr::child_end() { return child_iterator(); } 2108cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 2109f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff// ObjCIsaExpr 2110f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve NaroffStmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; } 2111f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve NaroffStmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; } 2112f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff 2113d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner// PredefinedExpr 2114d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris LattnerStmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); } 2115d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris LattnerStmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); } 211677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 211777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// IntegerLiteral 21189ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); } 21199ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); } 212077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 212177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// CharacterLiteral 2122d603eaa682cecac2c10771a700cb83aa301653b4Chris LattnerStmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();} 21239ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); } 212477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 212577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// FloatingLiteral 21269ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); } 21279ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); } 212877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 21295d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner// ImaginaryLiteral 21305549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; } 21315549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; } 21325d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 213377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// StringLiteral 21349ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator StringLiteral::child_begin() { return child_iterator(); } 21359ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator StringLiteral::child_end() { return child_iterator(); } 213677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 213777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ParenExpr 21385549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ParenExpr::child_begin() { return &Val; } 21395549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ParenExpr::child_end() { return &Val+1; } 214077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 214177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// UnaryOperator 21425549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator UnaryOperator::child_begin() { return &Val; } 21435549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator UnaryOperator::child_end() { return &Val+1; } 214477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 21450518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl// SizeOfAlignOfExpr 21461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator SizeOfAlignOfExpr::child_begin() { 21470518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // If this is of a type and the type is a VLA type (and not a typedef), the 21480518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // size expression of the VLA needs to be treated as an executable expression. 21490518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // Why isn't this weirdness documented better in StmtIterator? 21500518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (isArgumentType()) { 21510518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (VariableArrayType* T = dyn_cast<VariableArrayType>( 21520518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl getArgumentType().getTypePtr())) 21530518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return child_iterator(T); 21540518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return child_iterator(); 21550518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 2156d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl return child_iterator(&Argument.Ex); 21579ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 21580518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlStmt::child_iterator SizeOfAlignOfExpr::child_end() { 21590518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (isArgumentType()) 21600518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return child_iterator(); 2161d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl return child_iterator(&Argument.Ex + 1); 21629ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 216377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 216477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ArraySubscriptExpr 21651237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ArraySubscriptExpr::child_begin() { 21665549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 216777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 21681237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ArraySubscriptExpr::child_end() { 21695549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+END_EXPR; 217077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 217177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 217277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// CallExpr 21731237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator CallExpr::child_begin() { 21745549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 217577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 21761237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator CallExpr::child_end() { 21775549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+NumArgs+ARGS_START; 217877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek} 21791237c673c07f9d827129ba02720108816abde562Ted Kremenek 21801237c673c07f9d827129ba02720108816abde562Ted Kremenek// MemberExpr 21815549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator MemberExpr::child_begin() { return &Base; } 21825549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator MemberExpr::child_end() { return &Base+1; } 21831237c673c07f9d827129ba02720108816abde562Ted Kremenek 2184213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman// ExtVectorElementExpr 21855549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; } 21865549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; } 21871237c673c07f9d827129ba02720108816abde562Ted Kremenek 21881237c673c07f9d827129ba02720108816abde562Ted Kremenek// CompoundLiteralExpr 21895549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; } 21905549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; } 21911237c673c07f9d827129ba02720108816abde562Ted Kremenek 21921237c673c07f9d827129ba02720108816abde562Ted Kremenek// CastExpr 21935549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CastExpr::child_begin() { return &Op; } 21945549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CastExpr::child_end() { return &Op+1; } 21951237c673c07f9d827129ba02720108816abde562Ted Kremenek 21961237c673c07f9d827129ba02720108816abde562Ted Kremenek// BinaryOperator 21971237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator BinaryOperator::child_begin() { 21985549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 21991237c673c07f9d827129ba02720108816abde562Ted Kremenek} 22001237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator BinaryOperator::child_end() { 22015549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+END_EXPR; 22021237c673c07f9d827129ba02720108816abde562Ted Kremenek} 22031237c673c07f9d827129ba02720108816abde562Ted Kremenek 22041237c673c07f9d827129ba02720108816abde562Ted Kremenek// ConditionalOperator 22051237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ConditionalOperator::child_begin() { 22065549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 22071237c673c07f9d827129ba02720108816abde562Ted Kremenek} 22081237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ConditionalOperator::child_end() { 22095549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+END_EXPR; 22101237c673c07f9d827129ba02720108816abde562Ted Kremenek} 22111237c673c07f9d827129ba02720108816abde562Ted Kremenek 22121237c673c07f9d827129ba02720108816abde562Ted Kremenek// AddrLabelExpr 22139ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); } 22149ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); } 22151237c673c07f9d827129ba02720108816abde562Ted Kremenek 22161237c673c07f9d827129ba02720108816abde562Ted Kremenek// StmtExpr 22175549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator StmtExpr::child_begin() { return &SubStmt; } 22185549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; } 22191237c673c07f9d827129ba02720108816abde562Ted Kremenek 22201237c673c07f9d827129ba02720108816abde562Ted Kremenek// TypesCompatibleExpr 22219ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator TypesCompatibleExpr::child_begin() { 22229ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 22239ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 22249ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek 22259ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator TypesCompatibleExpr::child_end() { 22269ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 22279ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 22281237c673c07f9d827129ba02720108816abde562Ted Kremenek 22291237c673c07f9d827129ba02720108816abde562Ted Kremenek// ChooseExpr 22305549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; } 22315549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; } 22322d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 22332d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor// GNUNullExpr 22342d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas GregorStmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); } 22352d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas GregorStmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); } 22361237c673c07f9d827129ba02720108816abde562Ted Kremenek 2237d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman// ShuffleVectorExpr 2238d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanStmt::child_iterator ShuffleVectorExpr::child_begin() { 22395549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]; 2240d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman} 2241d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanStmt::child_iterator ShuffleVectorExpr::child_end() { 22425549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+NumExprs; 2243d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman} 2244d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 22457c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson// VAArgExpr 22465549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator VAArgExpr::child_begin() { return &Val; } 22475549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator VAArgExpr::child_end() { return &Val+1; } 22487c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson 224966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson// InitListExpr 225066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders CarlssonStmt::child_iterator InitListExpr::child_begin() { 22515549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return InitExprs.size() ? &InitExprs[0] : 0; 225266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 225366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders CarlssonStmt::child_iterator InitListExpr::child_end() { 22545549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0; 225566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 225666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 22573498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor// DesignatedInitExpr 225805c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorStmt::child_iterator DesignatedInitExpr::child_begin() { 225905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 226005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 226105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 226205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 226305c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorStmt::child_iterator DesignatedInitExpr::child_end() { 226405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return child_iterator(&*child_begin() + NumSubExprs); 226505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 226605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 22673498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor// ImplicitValueInitExpr 22681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ImplicitValueInitExpr::child_begin() { 22691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return child_iterator(); 22703498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 22713498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 22721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ImplicitValueInitExpr::child_end() { 22731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return child_iterator(); 22743498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 22753498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 22762ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman// ParenListExpr 22772ef13e5abef0570a9f567b4671367275c05d4d34Nate BegemanStmt::child_iterator ParenListExpr::child_begin() { 22782ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return &Exprs[0]; 22792ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 22802ef13e5abef0570a9f567b4671367275c05d4d34Nate BegemanStmt::child_iterator ParenListExpr::child_end() { 22812ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return &Exprs[0]+NumExprs; 22822ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 22832ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 22841237c673c07f9d827129ba02720108816abde562Ted Kremenek// ObjCStringLiteral 22851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCStringLiteral::child_begin() { 2286c6c16af963eddc3e9b75b5d2614d069e1162fe27Chris Lattner return &String; 22879ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 22889ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCStringLiteral::child_end() { 2289c6c16af963eddc3e9b75b5d2614d069e1162fe27Chris Lattner return &String+1; 22909ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 22911237c673c07f9d827129ba02720108816abde562Ted Kremenek 22921237c673c07f9d827129ba02720108816abde562Ted Kremenek// ObjCEncodeExpr 22939ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); } 22949ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); } 22951237c673c07f9d827129ba02720108816abde562Ted Kremenek 2296b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian// ObjCSelectorExpr 22971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCSelectorExpr::child_begin() { 22989ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 22999ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 23009ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCSelectorExpr::child_end() { 23019ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 23029ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 2303b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 2304390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian// ObjCProtocolExpr 23059ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCProtocolExpr::child_begin() { 23069ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 23079ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 23089ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCProtocolExpr::child_end() { 23099ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek return child_iterator(); 23109ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek} 2311390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 2312563477da25f824e37c535131695dc4dc9b68c465Steve Naroff// ObjCMessageExpr 23131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCMessageExpr::child_begin() { 23145549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return getReceiver() ? &SubExprs[0] : &SubExprs[0] + ARGS_START; 2315563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 2316563477da25f824e37c535131695dc4dc9b68c465Steve NaroffStmt::child_iterator ObjCMessageExpr::child_end() { 23175549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return &SubExprs[0]+ARGS_START+getNumArgs(); 2318563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 2319563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 23204eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Blocks 232156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffStmt::child_iterator BlockExpr::child_begin() { return child_iterator(); } 232256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffStmt::child_iterator BlockExpr::child_end() { return child_iterator(); } 23234eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 23249da13f9ddb2567e36f4bbee7b3c32f54aeb76d5bTed KremenekStmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();} 23259da13f9ddb2567e36f4bbee7b3c32f54aeb76d5bTed KremenekStmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); } 2326