Expr.cpp revision 8d852e35adb46e0799538dfc9c80d44f27cd3597
1//===--- Expr.cpp - Expression AST Node Implementation --------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the Expr class and subclasses. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang/AST/Expr.h" 15#include "clang/AST/ExprCXX.h" 16#include "clang/AST/APValue.h" 17#include "clang/AST/ASTContext.h" 18#include "clang/AST/DeclObjC.h" 19#include "clang/AST/DeclCXX.h" 20#include "clang/AST/DeclTemplate.h" 21#include "clang/AST/EvaluatedExprVisitor.h" 22#include "clang/AST/RecordLayout.h" 23#include "clang/AST/StmtVisitor.h" 24#include "clang/Lex/LiteralSupport.h" 25#include "clang/Lex/Lexer.h" 26#include "clang/Sema/SemaDiagnostic.h" 27#include "clang/Basic/Builtins.h" 28#include "clang/Basic/SourceManager.h" 29#include "clang/Basic/TargetInfo.h" 30#include "llvm/Support/ErrorHandling.h" 31#include "llvm/Support/raw_ostream.h" 32#include <algorithm> 33#include <cstring> 34using namespace clang; 35 36const CXXRecordDecl *Expr::getBestDynamicClassType() const { 37 const Expr *E = this; 38 39 while (true) { 40 E = E->IgnoreParens(); 41 if (const CastExpr *CE = dyn_cast<CastExpr>(E)) { 42 if (CE->getCastKind() == CK_DerivedToBase || 43 CE->getCastKind() == CK_UncheckedDerivedToBase || 44 CE->getCastKind() == CK_NoOp) { 45 E = CE->getSubExpr(); 46 continue; 47 } 48 } 49 50 break; 51 } 52 53 QualType DerivedType = E->getType(); 54 if (const PointerType *PTy = DerivedType->getAs<PointerType>()) 55 DerivedType = PTy->getPointeeType(); 56 57 const RecordType *Ty = DerivedType->castAs<RecordType>(); 58 Decl *D = Ty->getDecl(); 59 return cast<CXXRecordDecl>(D); 60} 61 62/// isKnownToHaveBooleanValue - Return true if this is an integer expression 63/// that is known to return 0 or 1. This happens for _Bool/bool expressions 64/// but also int expressions which are produced by things like comparisons in 65/// C. 66bool Expr::isKnownToHaveBooleanValue() const { 67 const Expr *E = IgnoreParens(); 68 69 // If this value has _Bool type, it is obvious 0/1. 70 if (E->getType()->isBooleanType()) return true; 71 // If this is a non-scalar-integer type, we don't care enough to try. 72 if (!E->getType()->isIntegralOrEnumerationType()) return false; 73 74 if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) { 75 switch (UO->getOpcode()) { 76 case UO_Plus: 77 return UO->getSubExpr()->isKnownToHaveBooleanValue(); 78 default: 79 return false; 80 } 81 } 82 83 // Only look through implicit casts. If the user writes 84 // '(int) (a && b)' treat it as an arbitrary int. 85 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 86 return CE->getSubExpr()->isKnownToHaveBooleanValue(); 87 88 if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { 89 switch (BO->getOpcode()) { 90 default: return false; 91 case BO_LT: // Relational operators. 92 case BO_GT: 93 case BO_LE: 94 case BO_GE: 95 case BO_EQ: // Equality operators. 96 case BO_NE: 97 case BO_LAnd: // AND operator. 98 case BO_LOr: // Logical OR operator. 99 return true; 100 101 case BO_And: // Bitwise AND operator. 102 case BO_Xor: // Bitwise XOR operator. 103 case BO_Or: // Bitwise OR operator. 104 // Handle things like (x==2)|(y==12). 105 return BO->getLHS()->isKnownToHaveBooleanValue() && 106 BO->getRHS()->isKnownToHaveBooleanValue(); 107 108 case BO_Comma: 109 case BO_Assign: 110 return BO->getRHS()->isKnownToHaveBooleanValue(); 111 } 112 } 113 114 if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) 115 return CO->getTrueExpr()->isKnownToHaveBooleanValue() && 116 CO->getFalseExpr()->isKnownToHaveBooleanValue(); 117 118 return false; 119} 120 121// Amusing macro metaprogramming hack: check whether a class provides 122// a more specific implementation of getExprLoc(). 123// 124// See also Stmt.cpp:{getLocStart(),getLocEnd()}. 125namespace { 126 /// This implementation is used when a class provides a custom 127 /// implementation of getExprLoc. 128 template <class E, class T> 129 SourceLocation getExprLocImpl(const Expr *expr, 130 SourceLocation (T::*v)() const) { 131 return static_cast<const E*>(expr)->getExprLoc(); 132 } 133 134 /// This implementation is used when a class doesn't provide 135 /// a custom implementation of getExprLoc. Overload resolution 136 /// should pick it over the implementation above because it's 137 /// more specialized according to function template partial ordering. 138 template <class E> 139 SourceLocation getExprLocImpl(const Expr *expr, 140 SourceLocation (Expr::*v)() const) { 141 return static_cast<const E*>(expr)->getLocStart(); 142 } 143} 144 145SourceLocation Expr::getExprLoc() const { 146 switch (getStmtClass()) { 147 case Stmt::NoStmtClass: llvm_unreachable("statement without class"); 148#define ABSTRACT_STMT(type) 149#define STMT(type, base) \ 150 case Stmt::type##Class: llvm_unreachable(#type " is not an Expr"); break; 151#define EXPR(type, base) \ 152 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc); 153#include "clang/AST/StmtNodes.inc" 154 } 155 llvm_unreachable("unknown statement kind"); 156} 157 158//===----------------------------------------------------------------------===// 159// Primary Expressions. 160//===----------------------------------------------------------------------===// 161 162/// \brief Compute the type-, value-, and instantiation-dependence of a 163/// declaration reference 164/// based on the declaration being referenced. 165static void computeDeclRefDependence(ASTContext &Ctx, NamedDecl *D, QualType T, 166 bool &TypeDependent, 167 bool &ValueDependent, 168 bool &InstantiationDependent) { 169 TypeDependent = false; 170 ValueDependent = false; 171 InstantiationDependent = false; 172 173 // (TD) C++ [temp.dep.expr]p3: 174 // An id-expression is type-dependent if it contains: 175 // 176 // and 177 // 178 // (VD) C++ [temp.dep.constexpr]p2: 179 // An identifier is value-dependent if it is: 180 181 // (TD) - an identifier that was declared with dependent type 182 // (VD) - a name declared with a dependent type, 183 if (T->isDependentType()) { 184 TypeDependent = true; 185 ValueDependent = true; 186 InstantiationDependent = true; 187 return; 188 } else if (T->isInstantiationDependentType()) { 189 InstantiationDependent = true; 190 } 191 192 // (TD) - a conversion-function-id that specifies a dependent type 193 if (D->getDeclName().getNameKind() 194 == DeclarationName::CXXConversionFunctionName) { 195 QualType T = D->getDeclName().getCXXNameType(); 196 if (T->isDependentType()) { 197 TypeDependent = true; 198 ValueDependent = true; 199 InstantiationDependent = true; 200 return; 201 } 202 203 if (T->isInstantiationDependentType()) 204 InstantiationDependent = true; 205 } 206 207 // (VD) - the name of a non-type template parameter, 208 if (isa<NonTypeTemplateParmDecl>(D)) { 209 ValueDependent = true; 210 InstantiationDependent = true; 211 return; 212 } 213 214 // (VD) - a constant with integral or enumeration type and is 215 // initialized with an expression that is value-dependent. 216 // (VD) - a constant with literal type and is initialized with an 217 // expression that is value-dependent [C++11]. 218 // (VD) - FIXME: Missing from the standard: 219 // - an entity with reference type and is initialized with an 220 // expression that is value-dependent [C++11] 221 if (VarDecl *Var = dyn_cast<VarDecl>(D)) { 222 if ((Ctx.getLangOpts().CPlusPlus0x ? 223 Var->getType()->isLiteralType() : 224 Var->getType()->isIntegralOrEnumerationType()) && 225 (Var->getType().getCVRQualifiers() == Qualifiers::Const || 226 Var->getType()->isReferenceType())) { 227 if (const Expr *Init = Var->getAnyInitializer()) 228 if (Init->isValueDependent()) { 229 ValueDependent = true; 230 InstantiationDependent = true; 231 } 232 } 233 234 // (VD) - FIXME: Missing from the standard: 235 // - a member function or a static data member of the current 236 // instantiation 237 if (Var->isStaticDataMember() && 238 Var->getDeclContext()->isDependentContext()) { 239 ValueDependent = true; 240 InstantiationDependent = true; 241 } 242 243 return; 244 } 245 246 // (VD) - FIXME: Missing from the standard: 247 // - a member function or a static data member of the current 248 // instantiation 249 if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) { 250 ValueDependent = true; 251 InstantiationDependent = true; 252 } 253} 254 255void DeclRefExpr::computeDependence(ASTContext &Ctx) { 256 bool TypeDependent = false; 257 bool ValueDependent = false; 258 bool InstantiationDependent = false; 259 computeDeclRefDependence(Ctx, getDecl(), getType(), TypeDependent, 260 ValueDependent, InstantiationDependent); 261 262 // (TD) C++ [temp.dep.expr]p3: 263 // An id-expression is type-dependent if it contains: 264 // 265 // and 266 // 267 // (VD) C++ [temp.dep.constexpr]p2: 268 // An identifier is value-dependent if it is: 269 if (!TypeDependent && !ValueDependent && 270 hasExplicitTemplateArgs() && 271 TemplateSpecializationType::anyDependentTemplateArguments( 272 getTemplateArgs(), 273 getNumTemplateArgs(), 274 InstantiationDependent)) { 275 TypeDependent = true; 276 ValueDependent = true; 277 InstantiationDependent = true; 278 } 279 280 ExprBits.TypeDependent = TypeDependent; 281 ExprBits.ValueDependent = ValueDependent; 282 ExprBits.InstantiationDependent = InstantiationDependent; 283 284 // Is the declaration a parameter pack? 285 if (getDecl()->isParameterPack()) 286 ExprBits.ContainsUnexpandedParameterPack = true; 287} 288 289DeclRefExpr::DeclRefExpr(ASTContext &Ctx, 290 NestedNameSpecifierLoc QualifierLoc, 291 SourceLocation TemplateKWLoc, 292 ValueDecl *D, bool RefersToEnclosingLocal, 293 const DeclarationNameInfo &NameInfo, 294 NamedDecl *FoundD, 295 const TemplateArgumentListInfo *TemplateArgs, 296 QualType T, ExprValueKind VK) 297 : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false, false), 298 D(D), Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) { 299 DeclRefExprBits.HasQualifier = QualifierLoc ? 1 : 0; 300 if (QualifierLoc) 301 getInternalQualifierLoc() = QualifierLoc; 302 DeclRefExprBits.HasFoundDecl = FoundD ? 1 : 0; 303 if (FoundD) 304 getInternalFoundDecl() = FoundD; 305 DeclRefExprBits.HasTemplateKWAndArgsInfo 306 = (TemplateArgs || TemplateKWLoc.isValid()) ? 1 : 0; 307 DeclRefExprBits.RefersToEnclosingLocal = RefersToEnclosingLocal; 308 if (TemplateArgs) { 309 bool Dependent = false; 310 bool InstantiationDependent = false; 311 bool ContainsUnexpandedParameterPack = false; 312 getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs, 313 Dependent, 314 InstantiationDependent, 315 ContainsUnexpandedParameterPack); 316 if (InstantiationDependent) 317 setInstantiationDependent(true); 318 } else if (TemplateKWLoc.isValid()) { 319 getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc); 320 } 321 DeclRefExprBits.HadMultipleCandidates = 0; 322 323 computeDependence(Ctx); 324} 325 326DeclRefExpr *DeclRefExpr::Create(ASTContext &Context, 327 NestedNameSpecifierLoc QualifierLoc, 328 SourceLocation TemplateKWLoc, 329 ValueDecl *D, 330 bool RefersToEnclosingLocal, 331 SourceLocation NameLoc, 332 QualType T, 333 ExprValueKind VK, 334 NamedDecl *FoundD, 335 const TemplateArgumentListInfo *TemplateArgs) { 336 return Create(Context, QualifierLoc, TemplateKWLoc, D, 337 RefersToEnclosingLocal, 338 DeclarationNameInfo(D->getDeclName(), NameLoc), 339 T, VK, FoundD, TemplateArgs); 340} 341 342DeclRefExpr *DeclRefExpr::Create(ASTContext &Context, 343 NestedNameSpecifierLoc QualifierLoc, 344 SourceLocation TemplateKWLoc, 345 ValueDecl *D, 346 bool RefersToEnclosingLocal, 347 const DeclarationNameInfo &NameInfo, 348 QualType T, 349 ExprValueKind VK, 350 NamedDecl *FoundD, 351 const TemplateArgumentListInfo *TemplateArgs) { 352 // Filter out cases where the found Decl is the same as the value refenenced. 353 if (D == FoundD) 354 FoundD = 0; 355 356 std::size_t Size = sizeof(DeclRefExpr); 357 if (QualifierLoc != 0) 358 Size += sizeof(NestedNameSpecifierLoc); 359 if (FoundD) 360 Size += sizeof(NamedDecl *); 361 if (TemplateArgs) 362 Size += ASTTemplateKWAndArgsInfo::sizeFor(TemplateArgs->size()); 363 else if (TemplateKWLoc.isValid()) 364 Size += ASTTemplateKWAndArgsInfo::sizeFor(0); 365 366 void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>()); 367 return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D, 368 RefersToEnclosingLocal, 369 NameInfo, FoundD, TemplateArgs, T, VK); 370} 371 372DeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context, 373 bool HasQualifier, 374 bool HasFoundDecl, 375 bool HasTemplateKWAndArgsInfo, 376 unsigned NumTemplateArgs) { 377 std::size_t Size = sizeof(DeclRefExpr); 378 if (HasQualifier) 379 Size += sizeof(NestedNameSpecifierLoc); 380 if (HasFoundDecl) 381 Size += sizeof(NamedDecl *); 382 if (HasTemplateKWAndArgsInfo) 383 Size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs); 384 385 void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>()); 386 return new (Mem) DeclRefExpr(EmptyShell()); 387} 388 389SourceRange DeclRefExpr::getSourceRange() const { 390 SourceRange R = getNameInfo().getSourceRange(); 391 if (hasQualifier()) 392 R.setBegin(getQualifierLoc().getBeginLoc()); 393 if (hasExplicitTemplateArgs()) 394 R.setEnd(getRAngleLoc()); 395 return R; 396} 397SourceLocation DeclRefExpr::getLocStart() const { 398 if (hasQualifier()) 399 return getQualifierLoc().getBeginLoc(); 400 return getNameInfo().getLocStart(); 401} 402SourceLocation DeclRefExpr::getLocEnd() const { 403 if (hasExplicitTemplateArgs()) 404 return getRAngleLoc(); 405 return getNameInfo().getLocEnd(); 406} 407 408// FIXME: Maybe this should use DeclPrinter with a special "print predefined 409// expr" policy instead. 410std::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) { 411 ASTContext &Context = CurrentDecl->getASTContext(); 412 413 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) { 414 if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual) 415 return FD->getNameAsString(); 416 417 SmallString<256> Name; 418 llvm::raw_svector_ostream Out(Name); 419 420 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 421 if (MD->isVirtual() && IT != PrettyFunctionNoVirtual) 422 Out << "virtual "; 423 if (MD->isStatic()) 424 Out << "static "; 425 } 426 427 PrintingPolicy Policy(Context.getLangOpts()); 428 std::string Proto = FD->getQualifiedNameAsString(Policy); 429 llvm::raw_string_ostream POut(Proto); 430 431 const FunctionDecl *Decl = FD; 432 if (const FunctionDecl* Pattern = FD->getTemplateInstantiationPattern()) 433 Decl = Pattern; 434 const FunctionType *AFT = Decl->getType()->getAs<FunctionType>(); 435 const FunctionProtoType *FT = 0; 436 if (FD->hasWrittenPrototype()) 437 FT = dyn_cast<FunctionProtoType>(AFT); 438 439 POut << "("; 440 if (FT) { 441 for (unsigned i = 0, e = Decl->getNumParams(); i != e; ++i) { 442 if (i) POut << ", "; 443 POut << Decl->getParamDecl(i)->getType().stream(Policy); 444 } 445 446 if (FT->isVariadic()) { 447 if (FD->getNumParams()) POut << ", "; 448 POut << "..."; 449 } 450 } 451 POut << ")"; 452 453 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 454 Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers()); 455 if (ThisQuals.hasConst()) 456 POut << " const"; 457 if (ThisQuals.hasVolatile()) 458 POut << " volatile"; 459 RefQualifierKind Ref = MD->getRefQualifier(); 460 if (Ref == RQ_LValue) 461 POut << " &"; 462 else if (Ref == RQ_RValue) 463 POut << " &&"; 464 } 465 466 typedef SmallVector<const ClassTemplateSpecializationDecl *, 8> SpecsTy; 467 SpecsTy Specs; 468 const DeclContext *Ctx = FD->getDeclContext(); 469 while (Ctx && isa<NamedDecl>(Ctx)) { 470 const ClassTemplateSpecializationDecl *Spec 471 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx); 472 if (Spec && !Spec->isExplicitSpecialization()) 473 Specs.push_back(Spec); 474 Ctx = Ctx->getParent(); 475 } 476 477 std::string TemplateParams; 478 llvm::raw_string_ostream TOut(TemplateParams); 479 for (SpecsTy::reverse_iterator I = Specs.rbegin(), E = Specs.rend(); 480 I != E; ++I) { 481 const TemplateParameterList *Params 482 = (*I)->getSpecializedTemplate()->getTemplateParameters(); 483 const TemplateArgumentList &Args = (*I)->getTemplateArgs(); 484 assert(Params->size() == Args.size()); 485 for (unsigned i = 0, numParams = Params->size(); i != numParams; ++i) { 486 StringRef Param = Params->getParam(i)->getName(); 487 if (Param.empty()) continue; 488 TOut << Param << " = "; 489 Args.get(i).print(Policy, TOut); 490 TOut << ", "; 491 } 492 } 493 494 FunctionTemplateSpecializationInfo *FSI 495 = FD->getTemplateSpecializationInfo(); 496 if (FSI && !FSI->isExplicitSpecialization()) { 497 const TemplateParameterList* Params 498 = FSI->getTemplate()->getTemplateParameters(); 499 const TemplateArgumentList* Args = FSI->TemplateArguments; 500 assert(Params->size() == Args->size()); 501 for (unsigned i = 0, e = Params->size(); i != e; ++i) { 502 StringRef Param = Params->getParam(i)->getName(); 503 if (Param.empty()) continue; 504 TOut << Param << " = "; 505 Args->get(i).print(Policy, TOut); 506 TOut << ", "; 507 } 508 } 509 510 TOut.flush(); 511 if (!TemplateParams.empty()) { 512 // remove the trailing comma and space 513 TemplateParams.resize(TemplateParams.size() - 2); 514 POut << " [" << TemplateParams << "]"; 515 } 516 517 POut.flush(); 518 519 if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD)) 520 AFT->getResultType().getAsStringInternal(Proto, Policy); 521 522 Out << Proto; 523 524 Out.flush(); 525 return Name.str().str(); 526 } 527 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) { 528 SmallString<256> Name; 529 llvm::raw_svector_ostream Out(Name); 530 Out << (MD->isInstanceMethod() ? '-' : '+'); 531 Out << '['; 532 533 // For incorrect code, there might not be an ObjCInterfaceDecl. Do 534 // a null check to avoid a crash. 535 if (const ObjCInterfaceDecl *ID = MD->getClassInterface()) 536 Out << *ID; 537 538 if (const ObjCCategoryImplDecl *CID = 539 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) 540 Out << '(' << *CID << ')'; 541 542 Out << ' '; 543 Out << MD->getSelector().getAsString(); 544 Out << ']'; 545 546 Out.flush(); 547 return Name.str().str(); 548 } 549 if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) { 550 // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string. 551 return "top level"; 552 } 553 return ""; 554} 555 556void APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) { 557 if (hasAllocation()) 558 C.Deallocate(pVal); 559 560 BitWidth = Val.getBitWidth(); 561 unsigned NumWords = Val.getNumWords(); 562 const uint64_t* Words = Val.getRawData(); 563 if (NumWords > 1) { 564 pVal = new (C) uint64_t[NumWords]; 565 std::copy(Words, Words + NumWords, pVal); 566 } else if (NumWords == 1) 567 VAL = Words[0]; 568 else 569 VAL = 0; 570} 571 572IntegerLiteral * 573IntegerLiteral::Create(ASTContext &C, const llvm::APInt &V, 574 QualType type, SourceLocation l) { 575 return new (C) IntegerLiteral(C, V, type, l); 576} 577 578IntegerLiteral * 579IntegerLiteral::Create(ASTContext &C, EmptyShell Empty) { 580 return new (C) IntegerLiteral(Empty); 581} 582 583FloatingLiteral * 584FloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V, 585 bool isexact, QualType Type, SourceLocation L) { 586 return new (C) FloatingLiteral(C, V, isexact, Type, L); 587} 588 589FloatingLiteral * 590FloatingLiteral::Create(ASTContext &C, EmptyShell Empty) { 591 return new (C) FloatingLiteral(C, Empty); 592} 593 594/// getValueAsApproximateDouble - This returns the value as an inaccurate 595/// double. Note that this may cause loss of precision, but is useful for 596/// debugging dumps, etc. 597double FloatingLiteral::getValueAsApproximateDouble() const { 598 llvm::APFloat V = getValue(); 599 bool ignored; 600 V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, 601 &ignored); 602 return V.convertToDouble(); 603} 604 605int StringLiteral::mapCharByteWidth(TargetInfo const &target,StringKind k) { 606 int CharByteWidth = 0; 607 switch(k) { 608 case Ascii: 609 case UTF8: 610 CharByteWidth = target.getCharWidth(); 611 break; 612 case Wide: 613 CharByteWidth = target.getWCharWidth(); 614 break; 615 case UTF16: 616 CharByteWidth = target.getChar16Width(); 617 break; 618 case UTF32: 619 CharByteWidth = target.getChar32Width(); 620 break; 621 } 622 assert((CharByteWidth & 7) == 0 && "Assumes character size is byte multiple"); 623 CharByteWidth /= 8; 624 assert((CharByteWidth==1 || CharByteWidth==2 || CharByteWidth==4) 625 && "character byte widths supported are 1, 2, and 4 only"); 626 return CharByteWidth; 627} 628 629StringLiteral *StringLiteral::Create(ASTContext &C, StringRef Str, 630 StringKind Kind, bool Pascal, QualType Ty, 631 const SourceLocation *Loc, 632 unsigned NumStrs) { 633 // Allocate enough space for the StringLiteral plus an array of locations for 634 // any concatenated string tokens. 635 void *Mem = C.Allocate(sizeof(StringLiteral)+ 636 sizeof(SourceLocation)*(NumStrs-1), 637 llvm::alignOf<StringLiteral>()); 638 StringLiteral *SL = new (Mem) StringLiteral(Ty); 639 640 // OPTIMIZE: could allocate this appended to the StringLiteral. 641 SL->setString(C,Str,Kind,Pascal); 642 643 SL->TokLocs[0] = Loc[0]; 644 SL->NumConcatenated = NumStrs; 645 646 if (NumStrs != 1) 647 memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1)); 648 return SL; 649} 650 651StringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) { 652 void *Mem = C.Allocate(sizeof(StringLiteral)+ 653 sizeof(SourceLocation)*(NumStrs-1), 654 llvm::alignOf<StringLiteral>()); 655 StringLiteral *SL = new (Mem) StringLiteral(QualType()); 656 SL->CharByteWidth = 0; 657 SL->Length = 0; 658 SL->NumConcatenated = NumStrs; 659 return SL; 660} 661 662void StringLiteral::outputString(raw_ostream &OS) { 663 switch (getKind()) { 664 case Ascii: break; // no prefix. 665 case Wide: OS << 'L'; break; 666 case UTF8: OS << "u8"; break; 667 case UTF16: OS << 'u'; break; 668 case UTF32: OS << 'U'; break; 669 } 670 OS << '"'; 671 static const char Hex[] = "0123456789ABCDEF"; 672 673 unsigned LastSlashX = getLength(); 674 for (unsigned I = 0, N = getLength(); I != N; ++I) { 675 switch (uint32_t Char = getCodeUnit(I)) { 676 default: 677 // FIXME: Convert UTF-8 back to codepoints before rendering. 678 679 // Convert UTF-16 surrogate pairs back to codepoints before rendering. 680 // Leave invalid surrogates alone; we'll use \x for those. 681 if (getKind() == UTF16 && I != N - 1 && Char >= 0xd800 && 682 Char <= 0xdbff) { 683 uint32_t Trail = getCodeUnit(I + 1); 684 if (Trail >= 0xdc00 && Trail <= 0xdfff) { 685 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00); 686 ++I; 687 } 688 } 689 690 if (Char > 0xff) { 691 // If this is a wide string, output characters over 0xff using \x 692 // escapes. Otherwise, this is a UTF-16 or UTF-32 string, and Char is a 693 // codepoint: use \x escapes for invalid codepoints. 694 if (getKind() == Wide || 695 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) { 696 // FIXME: Is this the best way to print wchar_t? 697 OS << "\\x"; 698 int Shift = 28; 699 while ((Char >> Shift) == 0) 700 Shift -= 4; 701 for (/**/; Shift >= 0; Shift -= 4) 702 OS << Hex[(Char >> Shift) & 15]; 703 LastSlashX = I; 704 break; 705 } 706 707 if (Char > 0xffff) 708 OS << "\\U00" 709 << Hex[(Char >> 20) & 15] 710 << Hex[(Char >> 16) & 15]; 711 else 712 OS << "\\u"; 713 OS << Hex[(Char >> 12) & 15] 714 << Hex[(Char >> 8) & 15] 715 << Hex[(Char >> 4) & 15] 716 << Hex[(Char >> 0) & 15]; 717 break; 718 } 719 720 // If we used \x... for the previous character, and this character is a 721 // hexadecimal digit, prevent it being slurped as part of the \x. 722 if (LastSlashX + 1 == I) { 723 switch (Char) { 724 case '0': case '1': case '2': case '3': case '4': 725 case '5': case '6': case '7': case '8': case '9': 726 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 727 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 728 OS << "\"\""; 729 } 730 } 731 732 assert(Char <= 0xff && 733 "Characters above 0xff should already have been handled."); 734 735 if (isprint(Char)) 736 OS << (char)Char; 737 else // Output anything hard as an octal escape. 738 OS << '\\' 739 << (char)('0' + ((Char >> 6) & 7)) 740 << (char)('0' + ((Char >> 3) & 7)) 741 << (char)('0' + ((Char >> 0) & 7)); 742 break; 743 // Handle some common non-printable cases to make dumps prettier. 744 case '\\': OS << "\\\\"; break; 745 case '"': OS << "\\\""; break; 746 case '\n': OS << "\\n"; break; 747 case '\t': OS << "\\t"; break; 748 case '\a': OS << "\\a"; break; 749 case '\b': OS << "\\b"; break; 750 } 751 } 752 OS << '"'; 753} 754 755void StringLiteral::setString(ASTContext &C, StringRef Str, 756 StringKind Kind, bool IsPascal) { 757 //FIXME: we assume that the string data comes from a target that uses the same 758 // code unit size and endianess for the type of string. 759 this->Kind = Kind; 760 this->IsPascal = IsPascal; 761 762 CharByteWidth = mapCharByteWidth(C.getTargetInfo(),Kind); 763 assert((Str.size()%CharByteWidth == 0) 764 && "size of data must be multiple of CharByteWidth"); 765 Length = Str.size()/CharByteWidth; 766 767 switch(CharByteWidth) { 768 case 1: { 769 char *AStrData = new (C) char[Length]; 770 std::memcpy(AStrData,Str.data(),Str.size()); 771 StrData.asChar = AStrData; 772 break; 773 } 774 case 2: { 775 uint16_t *AStrData = new (C) uint16_t[Length]; 776 std::memcpy(AStrData,Str.data(),Str.size()); 777 StrData.asUInt16 = AStrData; 778 break; 779 } 780 case 4: { 781 uint32_t *AStrData = new (C) uint32_t[Length]; 782 std::memcpy(AStrData,Str.data(),Str.size()); 783 StrData.asUInt32 = AStrData; 784 break; 785 } 786 default: 787 assert(false && "unsupported CharByteWidth"); 788 } 789} 790 791/// getLocationOfByte - Return a source location that points to the specified 792/// byte of this string literal. 793/// 794/// Strings are amazingly complex. They can be formed from multiple tokens and 795/// can have escape sequences in them in addition to the usual trigraph and 796/// escaped newline business. This routine handles this complexity. 797/// 798SourceLocation StringLiteral:: 799getLocationOfByte(unsigned ByteNo, const SourceManager &SM, 800 const LangOptions &Features, const TargetInfo &Target) const { 801 assert((Kind == StringLiteral::Ascii || Kind == StringLiteral::UTF8) && 802 "Only narrow string literals are currently supported"); 803 804 // Loop over all of the tokens in this string until we find the one that 805 // contains the byte we're looking for. 806 unsigned TokNo = 0; 807 while (1) { 808 assert(TokNo < getNumConcatenated() && "Invalid byte number!"); 809 SourceLocation StrTokLoc = getStrTokenLoc(TokNo); 810 811 // Get the spelling of the string so that we can get the data that makes up 812 // the string literal, not the identifier for the macro it is potentially 813 // expanded through. 814 SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc); 815 816 // Re-lex the token to get its length and original spelling. 817 std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc); 818 bool Invalid = false; 819 StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid); 820 if (Invalid) 821 return StrTokSpellingLoc; 822 823 const char *StrData = Buffer.data()+LocInfo.second; 824 825 // Create a lexer starting at the beginning of this token. 826 Lexer TheLexer(SM.getLocForStartOfFile(LocInfo.first), Features, 827 Buffer.begin(), StrData, Buffer.end()); 828 Token TheTok; 829 TheLexer.LexFromRawLexer(TheTok); 830 831 // Use the StringLiteralParser to compute the length of the string in bytes. 832 StringLiteralParser SLP(&TheTok, 1, SM, Features, Target); 833 unsigned TokNumBytes = SLP.GetStringLength(); 834 835 // If the byte is in this token, return the location of the byte. 836 if (ByteNo < TokNumBytes || 837 (ByteNo == TokNumBytes && TokNo == getNumConcatenated() - 1)) { 838 unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo); 839 840 // Now that we know the offset of the token in the spelling, use the 841 // preprocessor to get the offset in the original source. 842 return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features); 843 } 844 845 // Move to the next string token. 846 ++TokNo; 847 ByteNo -= TokNumBytes; 848 } 849} 850 851 852 853/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 854/// corresponds to, e.g. "sizeof" or "[pre]++". 855const char *UnaryOperator::getOpcodeStr(Opcode Op) { 856 switch (Op) { 857 case UO_PostInc: return "++"; 858 case UO_PostDec: return "--"; 859 case UO_PreInc: return "++"; 860 case UO_PreDec: return "--"; 861 case UO_AddrOf: return "&"; 862 case UO_Deref: return "*"; 863 case UO_Plus: return "+"; 864 case UO_Minus: return "-"; 865 case UO_Not: return "~"; 866 case UO_LNot: return "!"; 867 case UO_Real: return "__real"; 868 case UO_Imag: return "__imag"; 869 case UO_Extension: return "__extension__"; 870 } 871 llvm_unreachable("Unknown unary operator"); 872} 873 874UnaryOperatorKind 875UnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) { 876 switch (OO) { 877 default: llvm_unreachable("No unary operator for overloaded function"); 878 case OO_PlusPlus: return Postfix ? UO_PostInc : UO_PreInc; 879 case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec; 880 case OO_Amp: return UO_AddrOf; 881 case OO_Star: return UO_Deref; 882 case OO_Plus: return UO_Plus; 883 case OO_Minus: return UO_Minus; 884 case OO_Tilde: return UO_Not; 885 case OO_Exclaim: return UO_LNot; 886 } 887} 888 889OverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) { 890 switch (Opc) { 891 case UO_PostInc: case UO_PreInc: return OO_PlusPlus; 892 case UO_PostDec: case UO_PreDec: return OO_MinusMinus; 893 case UO_AddrOf: return OO_Amp; 894 case UO_Deref: return OO_Star; 895 case UO_Plus: return OO_Plus; 896 case UO_Minus: return OO_Minus; 897 case UO_Not: return OO_Tilde; 898 case UO_LNot: return OO_Exclaim; 899 default: return OO_None; 900 } 901} 902 903 904//===----------------------------------------------------------------------===// 905// Postfix Operators. 906//===----------------------------------------------------------------------===// 907 908CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs, 909 Expr **args, unsigned numargs, QualType t, ExprValueKind VK, 910 SourceLocation rparenloc) 911 : Expr(SC, t, VK, OK_Ordinary, 912 fn->isTypeDependent(), 913 fn->isValueDependent(), 914 fn->isInstantiationDependent(), 915 fn->containsUnexpandedParameterPack()), 916 NumArgs(numargs) { 917 918 SubExprs = new (C) Stmt*[numargs+PREARGS_START+NumPreArgs]; 919 SubExprs[FN] = fn; 920 for (unsigned i = 0; i != numargs; ++i) { 921 if (args[i]->isTypeDependent()) 922 ExprBits.TypeDependent = true; 923 if (args[i]->isValueDependent()) 924 ExprBits.ValueDependent = true; 925 if (args[i]->isInstantiationDependent()) 926 ExprBits.InstantiationDependent = true; 927 if (args[i]->containsUnexpandedParameterPack()) 928 ExprBits.ContainsUnexpandedParameterPack = true; 929 930 SubExprs[i+PREARGS_START+NumPreArgs] = args[i]; 931 } 932 933 CallExprBits.NumPreArgs = NumPreArgs; 934 RParenLoc = rparenloc; 935} 936 937CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, 938 QualType t, ExprValueKind VK, SourceLocation rparenloc) 939 : Expr(CallExprClass, t, VK, OK_Ordinary, 940 fn->isTypeDependent(), 941 fn->isValueDependent(), 942 fn->isInstantiationDependent(), 943 fn->containsUnexpandedParameterPack()), 944 NumArgs(numargs) { 945 946 SubExprs = new (C) Stmt*[numargs+PREARGS_START]; 947 SubExprs[FN] = fn; 948 for (unsigned i = 0; i != numargs; ++i) { 949 if (args[i]->isTypeDependent()) 950 ExprBits.TypeDependent = true; 951 if (args[i]->isValueDependent()) 952 ExprBits.ValueDependent = true; 953 if (args[i]->isInstantiationDependent()) 954 ExprBits.InstantiationDependent = true; 955 if (args[i]->containsUnexpandedParameterPack()) 956 ExprBits.ContainsUnexpandedParameterPack = true; 957 958 SubExprs[i+PREARGS_START] = args[i]; 959 } 960 961 CallExprBits.NumPreArgs = 0; 962 RParenLoc = rparenloc; 963} 964 965CallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty) 966 : Expr(SC, Empty), SubExprs(0), NumArgs(0) { 967 // FIXME: Why do we allocate this? 968 SubExprs = new (C) Stmt*[PREARGS_START]; 969 CallExprBits.NumPreArgs = 0; 970} 971 972CallExpr::CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs, 973 EmptyShell Empty) 974 : Expr(SC, Empty), SubExprs(0), NumArgs(0) { 975 // FIXME: Why do we allocate this? 976 SubExprs = new (C) Stmt*[PREARGS_START+NumPreArgs]; 977 CallExprBits.NumPreArgs = NumPreArgs; 978} 979 980Decl *CallExpr::getCalleeDecl() { 981 Expr *CEE = getCallee()->IgnoreParenImpCasts(); 982 983 while (SubstNonTypeTemplateParmExpr *NTTP 984 = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE)) { 985 CEE = NTTP->getReplacement()->IgnoreParenCasts(); 986 } 987 988 // If we're calling a dereference, look at the pointer instead. 989 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) { 990 if (BO->isPtrMemOp()) 991 CEE = BO->getRHS()->IgnoreParenCasts(); 992 } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) { 993 if (UO->getOpcode() == UO_Deref) 994 CEE = UO->getSubExpr()->IgnoreParenCasts(); 995 } 996 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) 997 return DRE->getDecl(); 998 if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE)) 999 return ME->getMemberDecl(); 1000 1001 return 0; 1002} 1003 1004FunctionDecl *CallExpr::getDirectCallee() { 1005 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); 1006} 1007 1008/// setNumArgs - This changes the number of arguments present in this call. 1009/// Any orphaned expressions are deleted by this, and any new operands are set 1010/// to null. 1011void CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) { 1012 // No change, just return. 1013 if (NumArgs == getNumArgs()) return; 1014 1015 // If shrinking # arguments, just delete the extras and forgot them. 1016 if (NumArgs < getNumArgs()) { 1017 this->NumArgs = NumArgs; 1018 return; 1019 } 1020 1021 // Otherwise, we are growing the # arguments. New an bigger argument array. 1022 unsigned NumPreArgs = getNumPreArgs(); 1023 Stmt **NewSubExprs = new (C) Stmt*[NumArgs+PREARGS_START+NumPreArgs]; 1024 // Copy over args. 1025 for (unsigned i = 0; i != getNumArgs()+PREARGS_START+NumPreArgs; ++i) 1026 NewSubExprs[i] = SubExprs[i]; 1027 // Null out new args. 1028 for (unsigned i = getNumArgs()+PREARGS_START+NumPreArgs; 1029 i != NumArgs+PREARGS_START+NumPreArgs; ++i) 1030 NewSubExprs[i] = 0; 1031 1032 if (SubExprs) C.Deallocate(SubExprs); 1033 SubExprs = NewSubExprs; 1034 this->NumArgs = NumArgs; 1035} 1036 1037/// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 1038/// not, return 0. 1039unsigned CallExpr::isBuiltinCall() const { 1040 // All simple function calls (e.g. func()) are implicitly cast to pointer to 1041 // function. As a result, we try and obtain the DeclRefExpr from the 1042 // ImplicitCastExpr. 1043 const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee()); 1044 if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()). 1045 return 0; 1046 1047 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()); 1048 if (!DRE) 1049 return 0; 1050 1051 const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 1052 if (!FDecl) 1053 return 0; 1054 1055 if (!FDecl->getIdentifier()) 1056 return 0; 1057 1058 return FDecl->getBuiltinID(); 1059} 1060 1061QualType CallExpr::getCallReturnType() const { 1062 QualType CalleeType = getCallee()->getType(); 1063 if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>()) 1064 CalleeType = FnTypePtr->getPointeeType(); 1065 else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>()) 1066 CalleeType = BPT->getPointeeType(); 1067 else if (CalleeType->isSpecificPlaceholderType(BuiltinType::BoundMember)) 1068 // This should never be overloaded and so should never return null. 1069 CalleeType = Expr::findBoundMemberType(getCallee()); 1070 1071 const FunctionType *FnType = CalleeType->castAs<FunctionType>(); 1072 return FnType->getResultType(); 1073} 1074 1075SourceRange CallExpr::getSourceRange() const { 1076 if (isa<CXXOperatorCallExpr>(this)) 1077 return cast<CXXOperatorCallExpr>(this)->getSourceRange(); 1078 1079 SourceLocation begin = getCallee()->getLocStart(); 1080 if (begin.isInvalid() && getNumArgs() > 0) 1081 begin = getArg(0)->getLocStart(); 1082 SourceLocation end = getRParenLoc(); 1083 if (end.isInvalid() && getNumArgs() > 0) 1084 end = getArg(getNumArgs() - 1)->getLocEnd(); 1085 return SourceRange(begin, end); 1086} 1087SourceLocation CallExpr::getLocStart() const { 1088 if (isa<CXXOperatorCallExpr>(this)) 1089 return cast<CXXOperatorCallExpr>(this)->getSourceRange().getBegin(); 1090 1091 SourceLocation begin = getCallee()->getLocStart(); 1092 if (begin.isInvalid() && getNumArgs() > 0) 1093 begin = getArg(0)->getLocStart(); 1094 return begin; 1095} 1096SourceLocation CallExpr::getLocEnd() const { 1097 if (isa<CXXOperatorCallExpr>(this)) 1098 return cast<CXXOperatorCallExpr>(this)->getSourceRange().getEnd(); 1099 1100 SourceLocation end = getRParenLoc(); 1101 if (end.isInvalid() && getNumArgs() > 0) 1102 end = getArg(getNumArgs() - 1)->getLocEnd(); 1103 return end; 1104} 1105 1106OffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type, 1107 SourceLocation OperatorLoc, 1108 TypeSourceInfo *tsi, 1109 OffsetOfNode* compsPtr, unsigned numComps, 1110 Expr** exprsPtr, unsigned numExprs, 1111 SourceLocation RParenLoc) { 1112 void *Mem = C.Allocate(sizeof(OffsetOfExpr) + 1113 sizeof(OffsetOfNode) * numComps + 1114 sizeof(Expr*) * numExprs); 1115 1116 return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps, 1117 exprsPtr, numExprs, RParenLoc); 1118} 1119 1120OffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C, 1121 unsigned numComps, unsigned numExprs) { 1122 void *Mem = C.Allocate(sizeof(OffsetOfExpr) + 1123 sizeof(OffsetOfNode) * numComps + 1124 sizeof(Expr*) * numExprs); 1125 return new (Mem) OffsetOfExpr(numComps, numExprs); 1126} 1127 1128OffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type, 1129 SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1130 OffsetOfNode* compsPtr, unsigned numComps, 1131 Expr** exprsPtr, unsigned numExprs, 1132 SourceLocation RParenLoc) 1133 : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary, 1134 /*TypeDependent=*/false, 1135 /*ValueDependent=*/tsi->getType()->isDependentType(), 1136 tsi->getType()->isInstantiationDependentType(), 1137 tsi->getType()->containsUnexpandedParameterPack()), 1138 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi), 1139 NumComps(numComps), NumExprs(numExprs) 1140{ 1141 for(unsigned i = 0; i < numComps; ++i) { 1142 setComponent(i, compsPtr[i]); 1143 } 1144 1145 for(unsigned i = 0; i < numExprs; ++i) { 1146 if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent()) 1147 ExprBits.ValueDependent = true; 1148 if (exprsPtr[i]->containsUnexpandedParameterPack()) 1149 ExprBits.ContainsUnexpandedParameterPack = true; 1150 1151 setIndexExpr(i, exprsPtr[i]); 1152 } 1153} 1154 1155IdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const { 1156 assert(getKind() == Field || getKind() == Identifier); 1157 if (getKind() == Field) 1158 return getField()->getIdentifier(); 1159 1160 return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask); 1161} 1162 1163MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow, 1164 NestedNameSpecifierLoc QualifierLoc, 1165 SourceLocation TemplateKWLoc, 1166 ValueDecl *memberdecl, 1167 DeclAccessPair founddecl, 1168 DeclarationNameInfo nameinfo, 1169 const TemplateArgumentListInfo *targs, 1170 QualType ty, 1171 ExprValueKind vk, 1172 ExprObjectKind ok) { 1173 std::size_t Size = sizeof(MemberExpr); 1174 1175 bool hasQualOrFound = (QualifierLoc || 1176 founddecl.getDecl() != memberdecl || 1177 founddecl.getAccess() != memberdecl->getAccess()); 1178 if (hasQualOrFound) 1179 Size += sizeof(MemberNameQualifier); 1180 1181 if (targs) 1182 Size += ASTTemplateKWAndArgsInfo::sizeFor(targs->size()); 1183 else if (TemplateKWLoc.isValid()) 1184 Size += ASTTemplateKWAndArgsInfo::sizeFor(0); 1185 1186 void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>()); 1187 MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo, 1188 ty, vk, ok); 1189 1190 if (hasQualOrFound) { 1191 // FIXME: Wrong. We should be looking at the member declaration we found. 1192 if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1193 E->setValueDependent(true); 1194 E->setTypeDependent(true); 1195 E->setInstantiationDependent(true); 1196 } 1197 else if (QualifierLoc && 1198 QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) 1199 E->setInstantiationDependent(true); 1200 1201 E->HasQualifierOrFoundDecl = true; 1202 1203 MemberNameQualifier *NQ = E->getMemberQualifier(); 1204 NQ->QualifierLoc = QualifierLoc; 1205 NQ->FoundDecl = founddecl; 1206 } 1207 1208 E->HasTemplateKWAndArgsInfo = (targs || TemplateKWLoc.isValid()); 1209 1210 if (targs) { 1211 bool Dependent = false; 1212 bool InstantiationDependent = false; 1213 bool ContainsUnexpandedParameterPack = false; 1214 E->getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *targs, 1215 Dependent, 1216 InstantiationDependent, 1217 ContainsUnexpandedParameterPack); 1218 if (InstantiationDependent) 1219 E->setInstantiationDependent(true); 1220 } else if (TemplateKWLoc.isValid()) { 1221 E->getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc); 1222 } 1223 1224 return E; 1225} 1226 1227SourceRange MemberExpr::getSourceRange() const { 1228 return SourceRange(getLocStart(), getLocEnd()); 1229} 1230SourceLocation MemberExpr::getLocStart() const { 1231 if (isImplicitAccess()) { 1232 if (hasQualifier()) 1233 return getQualifierLoc().getBeginLoc(); 1234 return MemberLoc; 1235 } 1236 1237 // FIXME: We don't want this to happen. Rather, we should be able to 1238 // detect all kinds of implicit accesses more cleanly. 1239 SourceLocation BaseStartLoc = getBase()->getLocStart(); 1240 if (BaseStartLoc.isValid()) 1241 return BaseStartLoc; 1242 return MemberLoc; 1243} 1244SourceLocation MemberExpr::getLocEnd() const { 1245 if (hasExplicitTemplateArgs()) 1246 return getRAngleLoc(); 1247 return getMemberNameInfo().getEndLoc(); 1248} 1249 1250void CastExpr::CheckCastConsistency() const { 1251 switch (getCastKind()) { 1252 case CK_DerivedToBase: 1253 case CK_UncheckedDerivedToBase: 1254 case CK_DerivedToBaseMemberPointer: 1255 case CK_BaseToDerived: 1256 case CK_BaseToDerivedMemberPointer: 1257 assert(!path_empty() && "Cast kind should have a base path!"); 1258 break; 1259 1260 case CK_CPointerToObjCPointerCast: 1261 assert(getType()->isObjCObjectPointerType()); 1262 assert(getSubExpr()->getType()->isPointerType()); 1263 goto CheckNoBasePath; 1264 1265 case CK_BlockPointerToObjCPointerCast: 1266 assert(getType()->isObjCObjectPointerType()); 1267 assert(getSubExpr()->getType()->isBlockPointerType()); 1268 goto CheckNoBasePath; 1269 1270 case CK_ReinterpretMemberPointer: 1271 assert(getType()->isMemberPointerType()); 1272 assert(getSubExpr()->getType()->isMemberPointerType()); 1273 goto CheckNoBasePath; 1274 1275 case CK_BitCast: 1276 // Arbitrary casts to C pointer types count as bitcasts. 1277 // Otherwise, we should only have block and ObjC pointer casts 1278 // here if they stay within the type kind. 1279 if (!getType()->isPointerType()) { 1280 assert(getType()->isObjCObjectPointerType() == 1281 getSubExpr()->getType()->isObjCObjectPointerType()); 1282 assert(getType()->isBlockPointerType() == 1283 getSubExpr()->getType()->isBlockPointerType()); 1284 } 1285 goto CheckNoBasePath; 1286 1287 case CK_AnyPointerToBlockPointerCast: 1288 assert(getType()->isBlockPointerType()); 1289 assert(getSubExpr()->getType()->isAnyPointerType() && 1290 !getSubExpr()->getType()->isBlockPointerType()); 1291 goto CheckNoBasePath; 1292 1293 case CK_CopyAndAutoreleaseBlockObject: 1294 assert(getType()->isBlockPointerType()); 1295 assert(getSubExpr()->getType()->isBlockPointerType()); 1296 goto CheckNoBasePath; 1297 1298 // These should not have an inheritance path. 1299 case CK_Dynamic: 1300 case CK_ToUnion: 1301 case CK_ArrayToPointerDecay: 1302 case CK_FunctionToPointerDecay: 1303 case CK_NullToMemberPointer: 1304 case CK_NullToPointer: 1305 case CK_ConstructorConversion: 1306 case CK_IntegralToPointer: 1307 case CK_PointerToIntegral: 1308 case CK_ToVoid: 1309 case CK_VectorSplat: 1310 case CK_IntegralCast: 1311 case CK_IntegralToFloating: 1312 case CK_FloatingToIntegral: 1313 case CK_FloatingCast: 1314 case CK_ObjCObjectLValueCast: 1315 case CK_FloatingRealToComplex: 1316 case CK_FloatingComplexToReal: 1317 case CK_FloatingComplexCast: 1318 case CK_FloatingComplexToIntegralComplex: 1319 case CK_IntegralRealToComplex: 1320 case CK_IntegralComplexToReal: 1321 case CK_IntegralComplexCast: 1322 case CK_IntegralComplexToFloatingComplex: 1323 case CK_ARCProduceObject: 1324 case CK_ARCConsumeObject: 1325 case CK_ARCReclaimReturnedObject: 1326 case CK_ARCExtendBlockObject: 1327 assert(!getType()->isBooleanType() && "unheralded conversion to bool"); 1328 goto CheckNoBasePath; 1329 1330 case CK_Dependent: 1331 case CK_LValueToRValue: 1332 case CK_NoOp: 1333 case CK_AtomicToNonAtomic: 1334 case CK_NonAtomicToAtomic: 1335 case CK_PointerToBoolean: 1336 case CK_IntegralToBoolean: 1337 case CK_FloatingToBoolean: 1338 case CK_MemberPointerToBoolean: 1339 case CK_FloatingComplexToBoolean: 1340 case CK_IntegralComplexToBoolean: 1341 case CK_LValueBitCast: // -> bool& 1342 case CK_UserDefinedConversion: // operator bool() 1343 CheckNoBasePath: 1344 assert(path_empty() && "Cast kind should not have a base path!"); 1345 break; 1346 } 1347} 1348 1349const char *CastExpr::getCastKindName() const { 1350 switch (getCastKind()) { 1351 case CK_Dependent: 1352 return "Dependent"; 1353 case CK_BitCast: 1354 return "BitCast"; 1355 case CK_LValueBitCast: 1356 return "LValueBitCast"; 1357 case CK_LValueToRValue: 1358 return "LValueToRValue"; 1359 case CK_NoOp: 1360 return "NoOp"; 1361 case CK_BaseToDerived: 1362 return "BaseToDerived"; 1363 case CK_DerivedToBase: 1364 return "DerivedToBase"; 1365 case CK_UncheckedDerivedToBase: 1366 return "UncheckedDerivedToBase"; 1367 case CK_Dynamic: 1368 return "Dynamic"; 1369 case CK_ToUnion: 1370 return "ToUnion"; 1371 case CK_ArrayToPointerDecay: 1372 return "ArrayToPointerDecay"; 1373 case CK_FunctionToPointerDecay: 1374 return "FunctionToPointerDecay"; 1375 case CK_NullToMemberPointer: 1376 return "NullToMemberPointer"; 1377 case CK_NullToPointer: 1378 return "NullToPointer"; 1379 case CK_BaseToDerivedMemberPointer: 1380 return "BaseToDerivedMemberPointer"; 1381 case CK_DerivedToBaseMemberPointer: 1382 return "DerivedToBaseMemberPointer"; 1383 case CK_ReinterpretMemberPointer: 1384 return "ReinterpretMemberPointer"; 1385 case CK_UserDefinedConversion: 1386 return "UserDefinedConversion"; 1387 case CK_ConstructorConversion: 1388 return "ConstructorConversion"; 1389 case CK_IntegralToPointer: 1390 return "IntegralToPointer"; 1391 case CK_PointerToIntegral: 1392 return "PointerToIntegral"; 1393 case CK_PointerToBoolean: 1394 return "PointerToBoolean"; 1395 case CK_ToVoid: 1396 return "ToVoid"; 1397 case CK_VectorSplat: 1398 return "VectorSplat"; 1399 case CK_IntegralCast: 1400 return "IntegralCast"; 1401 case CK_IntegralToBoolean: 1402 return "IntegralToBoolean"; 1403 case CK_IntegralToFloating: 1404 return "IntegralToFloating"; 1405 case CK_FloatingToIntegral: 1406 return "FloatingToIntegral"; 1407 case CK_FloatingCast: 1408 return "FloatingCast"; 1409 case CK_FloatingToBoolean: 1410 return "FloatingToBoolean"; 1411 case CK_MemberPointerToBoolean: 1412 return "MemberPointerToBoolean"; 1413 case CK_CPointerToObjCPointerCast: 1414 return "CPointerToObjCPointerCast"; 1415 case CK_BlockPointerToObjCPointerCast: 1416 return "BlockPointerToObjCPointerCast"; 1417 case CK_AnyPointerToBlockPointerCast: 1418 return "AnyPointerToBlockPointerCast"; 1419 case CK_ObjCObjectLValueCast: 1420 return "ObjCObjectLValueCast"; 1421 case CK_FloatingRealToComplex: 1422 return "FloatingRealToComplex"; 1423 case CK_FloatingComplexToReal: 1424 return "FloatingComplexToReal"; 1425 case CK_FloatingComplexToBoolean: 1426 return "FloatingComplexToBoolean"; 1427 case CK_FloatingComplexCast: 1428 return "FloatingComplexCast"; 1429 case CK_FloatingComplexToIntegralComplex: 1430 return "FloatingComplexToIntegralComplex"; 1431 case CK_IntegralRealToComplex: 1432 return "IntegralRealToComplex"; 1433 case CK_IntegralComplexToReal: 1434 return "IntegralComplexToReal"; 1435 case CK_IntegralComplexToBoolean: 1436 return "IntegralComplexToBoolean"; 1437 case CK_IntegralComplexCast: 1438 return "IntegralComplexCast"; 1439 case CK_IntegralComplexToFloatingComplex: 1440 return "IntegralComplexToFloatingComplex"; 1441 case CK_ARCConsumeObject: 1442 return "ARCConsumeObject"; 1443 case CK_ARCProduceObject: 1444 return "ARCProduceObject"; 1445 case CK_ARCReclaimReturnedObject: 1446 return "ARCReclaimReturnedObject"; 1447 case CK_ARCExtendBlockObject: 1448 return "ARCCExtendBlockObject"; 1449 case CK_AtomicToNonAtomic: 1450 return "AtomicToNonAtomic"; 1451 case CK_NonAtomicToAtomic: 1452 return "NonAtomicToAtomic"; 1453 case CK_CopyAndAutoreleaseBlockObject: 1454 return "CopyAndAutoreleaseBlockObject"; 1455 } 1456 1457 llvm_unreachable("Unhandled cast kind!"); 1458} 1459 1460Expr *CastExpr::getSubExprAsWritten() { 1461 Expr *SubExpr = 0; 1462 CastExpr *E = this; 1463 do { 1464 SubExpr = E->getSubExpr(); 1465 1466 // Skip through reference binding to temporary. 1467 if (MaterializeTemporaryExpr *Materialize 1468 = dyn_cast<MaterializeTemporaryExpr>(SubExpr)) 1469 SubExpr = Materialize->GetTemporaryExpr(); 1470 1471 // Skip any temporary bindings; they're implicit. 1472 if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr)) 1473 SubExpr = Binder->getSubExpr(); 1474 1475 // Conversions by constructor and conversion functions have a 1476 // subexpression describing the call; strip it off. 1477 if (E->getCastKind() == CK_ConstructorConversion) 1478 SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0); 1479 else if (E->getCastKind() == CK_UserDefinedConversion) 1480 SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument(); 1481 1482 // If the subexpression we're left with is an implicit cast, look 1483 // through that, too. 1484 } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr))); 1485 1486 return SubExpr; 1487} 1488 1489CXXBaseSpecifier **CastExpr::path_buffer() { 1490 switch (getStmtClass()) { 1491#define ABSTRACT_STMT(x) 1492#define CASTEXPR(Type, Base) \ 1493 case Stmt::Type##Class: \ 1494 return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1); 1495#define STMT(Type, Base) 1496#include "clang/AST/StmtNodes.inc" 1497 default: 1498 llvm_unreachable("non-cast expressions not possible here"); 1499 } 1500} 1501 1502void CastExpr::setCastPath(const CXXCastPath &Path) { 1503 assert(Path.size() == path_size()); 1504 memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*)); 1505} 1506 1507ImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T, 1508 CastKind Kind, Expr *Operand, 1509 const CXXCastPath *BasePath, 1510 ExprValueKind VK) { 1511 unsigned PathSize = (BasePath ? BasePath->size() : 0); 1512 void *Buffer = 1513 C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1514 ImplicitCastExpr *E = 1515 new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK); 1516 if (PathSize) E->setCastPath(*BasePath); 1517 return E; 1518} 1519 1520ImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C, 1521 unsigned PathSize) { 1522 void *Buffer = 1523 C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1524 return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize); 1525} 1526 1527 1528CStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T, 1529 ExprValueKind VK, CastKind K, Expr *Op, 1530 const CXXCastPath *BasePath, 1531 TypeSourceInfo *WrittenTy, 1532 SourceLocation L, SourceLocation R) { 1533 unsigned PathSize = (BasePath ? BasePath->size() : 0); 1534 void *Buffer = 1535 C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1536 CStyleCastExpr *E = 1537 new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R); 1538 if (PathSize) E->setCastPath(*BasePath); 1539 return E; 1540} 1541 1542CStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) { 1543 void *Buffer = 1544 C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*)); 1545 return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize); 1546} 1547 1548/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 1549/// corresponds to, e.g. "<<=". 1550const char *BinaryOperator::getOpcodeStr(Opcode Op) { 1551 switch (Op) { 1552 case BO_PtrMemD: return ".*"; 1553 case BO_PtrMemI: return "->*"; 1554 case BO_Mul: return "*"; 1555 case BO_Div: return "/"; 1556 case BO_Rem: return "%"; 1557 case BO_Add: return "+"; 1558 case BO_Sub: return "-"; 1559 case BO_Shl: return "<<"; 1560 case BO_Shr: return ">>"; 1561 case BO_LT: return "<"; 1562 case BO_GT: return ">"; 1563 case BO_LE: return "<="; 1564 case BO_GE: return ">="; 1565 case BO_EQ: return "=="; 1566 case BO_NE: return "!="; 1567 case BO_And: return "&"; 1568 case BO_Xor: return "^"; 1569 case BO_Or: return "|"; 1570 case BO_LAnd: return "&&"; 1571 case BO_LOr: return "||"; 1572 case BO_Assign: return "="; 1573 case BO_MulAssign: return "*="; 1574 case BO_DivAssign: return "/="; 1575 case BO_RemAssign: return "%="; 1576 case BO_AddAssign: return "+="; 1577 case BO_SubAssign: return "-="; 1578 case BO_ShlAssign: return "<<="; 1579 case BO_ShrAssign: return ">>="; 1580 case BO_AndAssign: return "&="; 1581 case BO_XorAssign: return "^="; 1582 case BO_OrAssign: return "|="; 1583 case BO_Comma: return ","; 1584 } 1585 1586 llvm_unreachable("Invalid OpCode!"); 1587} 1588 1589BinaryOperatorKind 1590BinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) { 1591 switch (OO) { 1592 default: llvm_unreachable("Not an overloadable binary operator"); 1593 case OO_Plus: return BO_Add; 1594 case OO_Minus: return BO_Sub; 1595 case OO_Star: return BO_Mul; 1596 case OO_Slash: return BO_Div; 1597 case OO_Percent: return BO_Rem; 1598 case OO_Caret: return BO_Xor; 1599 case OO_Amp: return BO_And; 1600 case OO_Pipe: return BO_Or; 1601 case OO_Equal: return BO_Assign; 1602 case OO_Less: return BO_LT; 1603 case OO_Greater: return BO_GT; 1604 case OO_PlusEqual: return BO_AddAssign; 1605 case OO_MinusEqual: return BO_SubAssign; 1606 case OO_StarEqual: return BO_MulAssign; 1607 case OO_SlashEqual: return BO_DivAssign; 1608 case OO_PercentEqual: return BO_RemAssign; 1609 case OO_CaretEqual: return BO_XorAssign; 1610 case OO_AmpEqual: return BO_AndAssign; 1611 case OO_PipeEqual: return BO_OrAssign; 1612 case OO_LessLess: return BO_Shl; 1613 case OO_GreaterGreater: return BO_Shr; 1614 case OO_LessLessEqual: return BO_ShlAssign; 1615 case OO_GreaterGreaterEqual: return BO_ShrAssign; 1616 case OO_EqualEqual: return BO_EQ; 1617 case OO_ExclaimEqual: return BO_NE; 1618 case OO_LessEqual: return BO_LE; 1619 case OO_GreaterEqual: return BO_GE; 1620 case OO_AmpAmp: return BO_LAnd; 1621 case OO_PipePipe: return BO_LOr; 1622 case OO_Comma: return BO_Comma; 1623 case OO_ArrowStar: return BO_PtrMemI; 1624 } 1625} 1626 1627OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) { 1628 static const OverloadedOperatorKind OverOps[] = { 1629 /* .* Cannot be overloaded */OO_None, OO_ArrowStar, 1630 OO_Star, OO_Slash, OO_Percent, 1631 OO_Plus, OO_Minus, 1632 OO_LessLess, OO_GreaterGreater, 1633 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual, 1634 OO_EqualEqual, OO_ExclaimEqual, 1635 OO_Amp, 1636 OO_Caret, 1637 OO_Pipe, 1638 OO_AmpAmp, 1639 OO_PipePipe, 1640 OO_Equal, OO_StarEqual, 1641 OO_SlashEqual, OO_PercentEqual, 1642 OO_PlusEqual, OO_MinusEqual, 1643 OO_LessLessEqual, OO_GreaterGreaterEqual, 1644 OO_AmpEqual, OO_CaretEqual, 1645 OO_PipeEqual, 1646 OO_Comma 1647 }; 1648 return OverOps[Opc]; 1649} 1650 1651InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc, 1652 Expr **initExprs, unsigned numInits, 1653 SourceLocation rbraceloc) 1654 : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false, 1655 false, false), 1656 InitExprs(C, numInits), 1657 LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0) 1658{ 1659 sawArrayRangeDesignator(false); 1660 setInitializesStdInitializerList(false); 1661 for (unsigned I = 0; I != numInits; ++I) { 1662 if (initExprs[I]->isTypeDependent()) 1663 ExprBits.TypeDependent = true; 1664 if (initExprs[I]->isValueDependent()) 1665 ExprBits.ValueDependent = true; 1666 if (initExprs[I]->isInstantiationDependent()) 1667 ExprBits.InstantiationDependent = true; 1668 if (initExprs[I]->containsUnexpandedParameterPack()) 1669 ExprBits.ContainsUnexpandedParameterPack = true; 1670 } 1671 1672 InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits); 1673} 1674 1675void InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) { 1676 if (NumInits > InitExprs.size()) 1677 InitExprs.reserve(C, NumInits); 1678} 1679 1680void InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) { 1681 InitExprs.resize(C, NumInits, 0); 1682} 1683 1684Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) { 1685 if (Init >= InitExprs.size()) { 1686 InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0); 1687 InitExprs.back() = expr; 1688 return 0; 1689 } 1690 1691 Expr *Result = cast_or_null<Expr>(InitExprs[Init]); 1692 InitExprs[Init] = expr; 1693 return Result; 1694} 1695 1696void InitListExpr::setArrayFiller(Expr *filler) { 1697 assert(!hasArrayFiller() && "Filler already set!"); 1698 ArrayFillerOrUnionFieldInit = filler; 1699 // Fill out any "holes" in the array due to designated initializers. 1700 Expr **inits = getInits(); 1701 for (unsigned i = 0, e = getNumInits(); i != e; ++i) 1702 if (inits[i] == 0) 1703 inits[i] = filler; 1704} 1705 1706bool InitListExpr::isStringLiteralInit() const { 1707 if (getNumInits() != 1) 1708 return false; 1709 const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(getType()); 1710 if (!CAT || !CAT->getElementType()->isIntegerType()) 1711 return false; 1712 const Expr *Init = getInit(0)->IgnoreParenImpCasts(); 1713 return isa<StringLiteral>(Init) || isa<ObjCEncodeExpr>(Init); 1714} 1715 1716SourceRange InitListExpr::getSourceRange() const { 1717 if (SyntacticForm) 1718 return SyntacticForm->getSourceRange(); 1719 SourceLocation Beg = LBraceLoc, End = RBraceLoc; 1720 if (Beg.isInvalid()) { 1721 // Find the first non-null initializer. 1722 for (InitExprsTy::const_iterator I = InitExprs.begin(), 1723 E = InitExprs.end(); 1724 I != E; ++I) { 1725 if (Stmt *S = *I) { 1726 Beg = S->getLocStart(); 1727 break; 1728 } 1729 } 1730 } 1731 if (End.isInvalid()) { 1732 // Find the first non-null initializer from the end. 1733 for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(), 1734 E = InitExprs.rend(); 1735 I != E; ++I) { 1736 if (Stmt *S = *I) { 1737 End = S->getSourceRange().getEnd(); 1738 break; 1739 } 1740 } 1741 } 1742 return SourceRange(Beg, End); 1743} 1744 1745/// getFunctionType - Return the underlying function type for this block. 1746/// 1747const FunctionProtoType *BlockExpr::getFunctionType() const { 1748 // The block pointer is never sugared, but the function type might be. 1749 return cast<BlockPointerType>(getType()) 1750 ->getPointeeType()->castAs<FunctionProtoType>(); 1751} 1752 1753SourceLocation BlockExpr::getCaretLocation() const { 1754 return TheBlock->getCaretLocation(); 1755} 1756const Stmt *BlockExpr::getBody() const { 1757 return TheBlock->getBody(); 1758} 1759Stmt *BlockExpr::getBody() { 1760 return TheBlock->getBody(); 1761} 1762 1763 1764//===----------------------------------------------------------------------===// 1765// Generic Expression Routines 1766//===----------------------------------------------------------------------===// 1767 1768/// isUnusedResultAWarning - Return true if this immediate expression should 1769/// be warned about if the result is unused. If so, fill in Loc and Ranges 1770/// with location to warn on and the source range[s] to report with the 1771/// warning. 1772bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc, 1773 SourceRange &R1, SourceRange &R2, 1774 ASTContext &Ctx) const { 1775 // Don't warn if the expr is type dependent. The type could end up 1776 // instantiating to void. 1777 if (isTypeDependent()) 1778 return false; 1779 1780 switch (getStmtClass()) { 1781 default: 1782 if (getType()->isVoidType()) 1783 return false; 1784 WarnE = this; 1785 Loc = getExprLoc(); 1786 R1 = getSourceRange(); 1787 return true; 1788 case ParenExprClass: 1789 return cast<ParenExpr>(this)->getSubExpr()-> 1790 isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1791 case GenericSelectionExprClass: 1792 return cast<GenericSelectionExpr>(this)->getResultExpr()-> 1793 isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1794 case UnaryOperatorClass: { 1795 const UnaryOperator *UO = cast<UnaryOperator>(this); 1796 1797 switch (UO->getOpcode()) { 1798 case UO_Plus: 1799 case UO_Minus: 1800 case UO_AddrOf: 1801 case UO_Not: 1802 case UO_LNot: 1803 case UO_Deref: 1804 break; 1805 case UO_PostInc: 1806 case UO_PostDec: 1807 case UO_PreInc: 1808 case UO_PreDec: // ++/-- 1809 return false; // Not a warning. 1810 case UO_Real: 1811 case UO_Imag: 1812 // accessing a piece of a volatile complex is a side-effect. 1813 if (Ctx.getCanonicalType(UO->getSubExpr()->getType()) 1814 .isVolatileQualified()) 1815 return false; 1816 break; 1817 case UO_Extension: 1818 return UO->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1819 } 1820 WarnE = this; 1821 Loc = UO->getOperatorLoc(); 1822 R1 = UO->getSubExpr()->getSourceRange(); 1823 return true; 1824 } 1825 case BinaryOperatorClass: { 1826 const BinaryOperator *BO = cast<BinaryOperator>(this); 1827 switch (BO->getOpcode()) { 1828 default: 1829 break; 1830 // Consider the RHS of comma for side effects. LHS was checked by 1831 // Sema::CheckCommaOperands. 1832 case BO_Comma: 1833 // ((foo = <blah>), 0) is an idiom for hiding the result (and 1834 // lvalue-ness) of an assignment written in a macro. 1835 if (IntegerLiteral *IE = 1836 dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens())) 1837 if (IE->getValue() == 0) 1838 return false; 1839 return BO->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1840 // Consider '||', '&&' to have side effects if the LHS or RHS does. 1841 case BO_LAnd: 1842 case BO_LOr: 1843 if (!BO->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) || 1844 !BO->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx)) 1845 return false; 1846 break; 1847 } 1848 if (BO->isAssignmentOp()) 1849 return false; 1850 WarnE = this; 1851 Loc = BO->getOperatorLoc(); 1852 R1 = BO->getLHS()->getSourceRange(); 1853 R2 = BO->getRHS()->getSourceRange(); 1854 return true; 1855 } 1856 case CompoundAssignOperatorClass: 1857 case VAArgExprClass: 1858 case AtomicExprClass: 1859 return false; 1860 1861 case ConditionalOperatorClass: { 1862 // If only one of the LHS or RHS is a warning, the operator might 1863 // be being used for control flow. Only warn if both the LHS and 1864 // RHS are warnings. 1865 const ConditionalOperator *Exp = cast<ConditionalOperator>(this); 1866 if (!Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx)) 1867 return false; 1868 if (!Exp->getLHS()) 1869 return true; 1870 return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1871 } 1872 1873 case MemberExprClass: 1874 WarnE = this; 1875 Loc = cast<MemberExpr>(this)->getMemberLoc(); 1876 R1 = SourceRange(Loc, Loc); 1877 R2 = cast<MemberExpr>(this)->getBase()->getSourceRange(); 1878 return true; 1879 1880 case ArraySubscriptExprClass: 1881 WarnE = this; 1882 Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc(); 1883 R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange(); 1884 R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange(); 1885 return true; 1886 1887 case CXXOperatorCallExprClass: { 1888 // We warn about operator== and operator!= even when user-defined operator 1889 // overloads as there is no reasonable way to define these such that they 1890 // have non-trivial, desirable side-effects. See the -Wunused-comparison 1891 // warning: these operators are commonly typo'ed, and so warning on them 1892 // provides additional value as well. If this list is updated, 1893 // DiagnoseUnusedComparison should be as well. 1894 const CXXOperatorCallExpr *Op = cast<CXXOperatorCallExpr>(this); 1895 if (Op->getOperator() == OO_EqualEqual || 1896 Op->getOperator() == OO_ExclaimEqual) { 1897 WarnE = this; 1898 Loc = Op->getOperatorLoc(); 1899 R1 = Op->getSourceRange(); 1900 return true; 1901 } 1902 1903 // Fallthrough for generic call handling. 1904 } 1905 case CallExprClass: 1906 case CXXMemberCallExprClass: 1907 case UserDefinedLiteralClass: { 1908 // If this is a direct call, get the callee. 1909 const CallExpr *CE = cast<CallExpr>(this); 1910 if (const Decl *FD = CE->getCalleeDecl()) { 1911 // If the callee has attribute pure, const, or warn_unused_result, warn 1912 // about it. void foo() { strlen("bar"); } should warn. 1913 // 1914 // Note: If new cases are added here, DiagnoseUnusedExprResult should be 1915 // updated to match for QoI. 1916 if (FD->getAttr<WarnUnusedResultAttr>() || 1917 FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) { 1918 WarnE = this; 1919 Loc = CE->getCallee()->getLocStart(); 1920 R1 = CE->getCallee()->getSourceRange(); 1921 1922 if (unsigned NumArgs = CE->getNumArgs()) 1923 R2 = SourceRange(CE->getArg(0)->getLocStart(), 1924 CE->getArg(NumArgs-1)->getLocEnd()); 1925 return true; 1926 } 1927 } 1928 return false; 1929 } 1930 1931 case CXXTemporaryObjectExprClass: 1932 case CXXConstructExprClass: 1933 return false; 1934 1935 case ObjCMessageExprClass: { 1936 const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this); 1937 if (Ctx.getLangOpts().ObjCAutoRefCount && 1938 ME->isInstanceMessage() && 1939 !ME->getType()->isVoidType() && 1940 ME->getSelector().getIdentifierInfoForSlot(0) && 1941 ME->getSelector().getIdentifierInfoForSlot(0) 1942 ->getName().startswith("init")) { 1943 WarnE = this; 1944 Loc = getExprLoc(); 1945 R1 = ME->getSourceRange(); 1946 return true; 1947 } 1948 1949 const ObjCMethodDecl *MD = ME->getMethodDecl(); 1950 if (MD && MD->getAttr<WarnUnusedResultAttr>()) { 1951 WarnE = this; 1952 Loc = getExprLoc(); 1953 return true; 1954 } 1955 return false; 1956 } 1957 1958 case ObjCPropertyRefExprClass: 1959 WarnE = this; 1960 Loc = getExprLoc(); 1961 R1 = getSourceRange(); 1962 return true; 1963 1964 case PseudoObjectExprClass: { 1965 const PseudoObjectExpr *PO = cast<PseudoObjectExpr>(this); 1966 1967 // Only complain about things that have the form of a getter. 1968 if (isa<UnaryOperator>(PO->getSyntacticForm()) || 1969 isa<BinaryOperator>(PO->getSyntacticForm())) 1970 return false; 1971 1972 WarnE = this; 1973 Loc = getExprLoc(); 1974 R1 = getSourceRange(); 1975 return true; 1976 } 1977 1978 case StmtExprClass: { 1979 // Statement exprs don't logically have side effects themselves, but are 1980 // sometimes used in macros in ways that give them a type that is unused. 1981 // For example ({ blah; foo(); }) will end up with a type if foo has a type. 1982 // however, if the result of the stmt expr is dead, we don't want to emit a 1983 // warning. 1984 const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt(); 1985 if (!CS->body_empty()) { 1986 if (const Expr *E = dyn_cast<Expr>(CS->body_back())) 1987 return E->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1988 if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back())) 1989 if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt())) 1990 return E->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 1991 } 1992 1993 if (getType()->isVoidType()) 1994 return false; 1995 WarnE = this; 1996 Loc = cast<StmtExpr>(this)->getLParenLoc(); 1997 R1 = getSourceRange(); 1998 return true; 1999 } 2000 case CStyleCastExprClass: { 2001 // Ignore an explicit cast to void unless the operand is a non-trivial 2002 // volatile lvalue. 2003 const CastExpr *CE = cast<CastExpr>(this); 2004 if (CE->getCastKind() == CK_ToVoid) { 2005 if (CE->getSubExpr()->isGLValue() && 2006 CE->getSubExpr()->getType().isVolatileQualified()) { 2007 const DeclRefExpr *DRE = 2008 dyn_cast<DeclRefExpr>(CE->getSubExpr()->IgnoreParens()); 2009 if (!(DRE && isa<VarDecl>(DRE->getDecl()) && 2010 cast<VarDecl>(DRE->getDecl())->hasLocalStorage())) { 2011 return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, 2012 R1, R2, Ctx); 2013 } 2014 } 2015 return false; 2016 } 2017 2018 // If this is a cast to a constructor conversion, check the operand. 2019 // Otherwise, the result of the cast is unused. 2020 if (CE->getCastKind() == CK_ConstructorConversion) 2021 return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 2022 2023 WarnE = this; 2024 if (const CXXFunctionalCastExpr *CXXCE = 2025 dyn_cast<CXXFunctionalCastExpr>(this)) { 2026 Loc = CXXCE->getTypeBeginLoc(); 2027 R1 = CXXCE->getSubExpr()->getSourceRange(); 2028 } else { 2029 const CStyleCastExpr *CStyleCE = cast<CStyleCastExpr>(this); 2030 Loc = CStyleCE->getLParenLoc(); 2031 R1 = CStyleCE->getSubExpr()->getSourceRange(); 2032 } 2033 return true; 2034 } 2035 case ImplicitCastExprClass: { 2036 const CastExpr *ICE = cast<ImplicitCastExpr>(this); 2037 2038 // lvalue-to-rvalue conversion on a volatile lvalue is a side-effect. 2039 if (ICE->getCastKind() == CK_LValueToRValue && 2040 ICE->getSubExpr()->getType().isVolatileQualified()) 2041 return false; 2042 2043 return ICE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx); 2044 } 2045 case CXXDefaultArgExprClass: 2046 return (cast<CXXDefaultArgExpr>(this) 2047 ->getExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx)); 2048 2049 case CXXNewExprClass: 2050 // FIXME: In theory, there might be new expressions that don't have side 2051 // effects (e.g. a placement new with an uninitialized POD). 2052 case CXXDeleteExprClass: 2053 return false; 2054 case CXXBindTemporaryExprClass: 2055 return (cast<CXXBindTemporaryExpr>(this) 2056 ->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx)); 2057 case ExprWithCleanupsClass: 2058 return (cast<ExprWithCleanups>(this) 2059 ->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx)); 2060 } 2061} 2062 2063/// isOBJCGCCandidate - Check if an expression is objc gc'able. 2064/// returns true, if it is; false otherwise. 2065bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { 2066 const Expr *E = IgnoreParens(); 2067 switch (E->getStmtClass()) { 2068 default: 2069 return false; 2070 case ObjCIvarRefExprClass: 2071 return true; 2072 case Expr::UnaryOperatorClass: 2073 return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx); 2074 case ImplicitCastExprClass: 2075 return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx); 2076 case MaterializeTemporaryExprClass: 2077 return cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr() 2078 ->isOBJCGCCandidate(Ctx); 2079 case CStyleCastExprClass: 2080 return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx); 2081 case DeclRefExprClass: { 2082 const Decl *D = cast<DeclRefExpr>(E)->getDecl(); 2083 2084 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 2085 if (VD->hasGlobalStorage()) 2086 return true; 2087 QualType T = VD->getType(); 2088 // dereferencing to a pointer is always a gc'able candidate, 2089 // unless it is __weak. 2090 return T->isPointerType() && 2091 (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak); 2092 } 2093 return false; 2094 } 2095 case MemberExprClass: { 2096 const MemberExpr *M = cast<MemberExpr>(E); 2097 return M->getBase()->isOBJCGCCandidate(Ctx); 2098 } 2099 case ArraySubscriptExprClass: 2100 return cast<ArraySubscriptExpr>(E)->getBase()->isOBJCGCCandidate(Ctx); 2101 } 2102} 2103 2104bool Expr::isBoundMemberFunction(ASTContext &Ctx) const { 2105 if (isTypeDependent()) 2106 return false; 2107 return ClassifyLValue(Ctx) == Expr::LV_MemberFunction; 2108} 2109 2110QualType Expr::findBoundMemberType(const Expr *expr) { 2111 assert(expr->hasPlaceholderType(BuiltinType::BoundMember)); 2112 2113 // Bound member expressions are always one of these possibilities: 2114 // x->m x.m x->*y x.*y 2115 // (possibly parenthesized) 2116 2117 expr = expr->IgnoreParens(); 2118 if (const MemberExpr *mem = dyn_cast<MemberExpr>(expr)) { 2119 assert(isa<CXXMethodDecl>(mem->getMemberDecl())); 2120 return mem->getMemberDecl()->getType(); 2121 } 2122 2123 if (const BinaryOperator *op = dyn_cast<BinaryOperator>(expr)) { 2124 QualType type = op->getRHS()->getType()->castAs<MemberPointerType>() 2125 ->getPointeeType(); 2126 assert(type->isFunctionType()); 2127 return type; 2128 } 2129 2130 assert(isa<UnresolvedMemberExpr>(expr)); 2131 return QualType(); 2132} 2133 2134Expr* Expr::IgnoreParens() { 2135 Expr* E = this; 2136 while (true) { 2137 if (ParenExpr* P = dyn_cast<ParenExpr>(E)) { 2138 E = P->getSubExpr(); 2139 continue; 2140 } 2141 if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 2142 if (P->getOpcode() == UO_Extension) { 2143 E = P->getSubExpr(); 2144 continue; 2145 } 2146 } 2147 if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 2148 if (!P->isResultDependent()) { 2149 E = P->getResultExpr(); 2150 continue; 2151 } 2152 } 2153 return E; 2154 } 2155} 2156 2157/// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 2158/// or CastExprs or ImplicitCastExprs, returning their operand. 2159Expr *Expr::IgnoreParenCasts() { 2160 Expr *E = this; 2161 while (true) { 2162 if (ParenExpr* P = dyn_cast<ParenExpr>(E)) { 2163 E = P->getSubExpr(); 2164 continue; 2165 } 2166 if (CastExpr *P = dyn_cast<CastExpr>(E)) { 2167 E = P->getSubExpr(); 2168 continue; 2169 } 2170 if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 2171 if (P->getOpcode() == UO_Extension) { 2172 E = P->getSubExpr(); 2173 continue; 2174 } 2175 } 2176 if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 2177 if (!P->isResultDependent()) { 2178 E = P->getResultExpr(); 2179 continue; 2180 } 2181 } 2182 if (MaterializeTemporaryExpr *Materialize 2183 = dyn_cast<MaterializeTemporaryExpr>(E)) { 2184 E = Materialize->GetTemporaryExpr(); 2185 continue; 2186 } 2187 if (SubstNonTypeTemplateParmExpr *NTTP 2188 = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) { 2189 E = NTTP->getReplacement(); 2190 continue; 2191 } 2192 return E; 2193 } 2194} 2195 2196/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue 2197/// casts. This is intended purely as a temporary workaround for code 2198/// that hasn't yet been rewritten to do the right thing about those 2199/// casts, and may disappear along with the last internal use. 2200Expr *Expr::IgnoreParenLValueCasts() { 2201 Expr *E = this; 2202 while (true) { 2203 if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 2204 E = P->getSubExpr(); 2205 continue; 2206 } else if (CastExpr *P = dyn_cast<CastExpr>(E)) { 2207 if (P->getCastKind() == CK_LValueToRValue) { 2208 E = P->getSubExpr(); 2209 continue; 2210 } 2211 } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 2212 if (P->getOpcode() == UO_Extension) { 2213 E = P->getSubExpr(); 2214 continue; 2215 } 2216 } else if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 2217 if (!P->isResultDependent()) { 2218 E = P->getResultExpr(); 2219 continue; 2220 } 2221 } else if (MaterializeTemporaryExpr *Materialize 2222 = dyn_cast<MaterializeTemporaryExpr>(E)) { 2223 E = Materialize->GetTemporaryExpr(); 2224 continue; 2225 } else if (SubstNonTypeTemplateParmExpr *NTTP 2226 = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) { 2227 E = NTTP->getReplacement(); 2228 continue; 2229 } 2230 break; 2231 } 2232 return E; 2233} 2234 2235Expr *Expr::IgnoreParenImpCasts() { 2236 Expr *E = this; 2237 while (true) { 2238 if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 2239 E = P->getSubExpr(); 2240 continue; 2241 } 2242 if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) { 2243 E = P->getSubExpr(); 2244 continue; 2245 } 2246 if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 2247 if (P->getOpcode() == UO_Extension) { 2248 E = P->getSubExpr(); 2249 continue; 2250 } 2251 } 2252 if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 2253 if (!P->isResultDependent()) { 2254 E = P->getResultExpr(); 2255 continue; 2256 } 2257 } 2258 if (MaterializeTemporaryExpr *Materialize 2259 = dyn_cast<MaterializeTemporaryExpr>(E)) { 2260 E = Materialize->GetTemporaryExpr(); 2261 continue; 2262 } 2263 if (SubstNonTypeTemplateParmExpr *NTTP 2264 = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) { 2265 E = NTTP->getReplacement(); 2266 continue; 2267 } 2268 return E; 2269 } 2270} 2271 2272Expr *Expr::IgnoreConversionOperator() { 2273 if (CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(this)) { 2274 if (MCE->getMethodDecl() && isa<CXXConversionDecl>(MCE->getMethodDecl())) 2275 return MCE->getImplicitObjectArgument(); 2276 } 2277 return this; 2278} 2279 2280/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 2281/// value (including ptr->int casts of the same size). Strip off any 2282/// ParenExpr or CastExprs, returning their operand. 2283Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) { 2284 Expr *E = this; 2285 while (true) { 2286 if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 2287 E = P->getSubExpr(); 2288 continue; 2289 } 2290 2291 if (CastExpr *P = dyn_cast<CastExpr>(E)) { 2292 // We ignore integer <-> casts that are of the same width, ptr<->ptr and 2293 // ptr<->int casts of the same width. We also ignore all identity casts. 2294 Expr *SE = P->getSubExpr(); 2295 2296 if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) { 2297 E = SE; 2298 continue; 2299 } 2300 2301 if ((E->getType()->isPointerType() || 2302 E->getType()->isIntegralType(Ctx)) && 2303 (SE->getType()->isPointerType() || 2304 SE->getType()->isIntegralType(Ctx)) && 2305 Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) { 2306 E = SE; 2307 continue; 2308 } 2309 } 2310 2311 if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) { 2312 if (P->getOpcode() == UO_Extension) { 2313 E = P->getSubExpr(); 2314 continue; 2315 } 2316 } 2317 2318 if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) { 2319 if (!P->isResultDependent()) { 2320 E = P->getResultExpr(); 2321 continue; 2322 } 2323 } 2324 2325 if (SubstNonTypeTemplateParmExpr *NTTP 2326 = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) { 2327 E = NTTP->getReplacement(); 2328 continue; 2329 } 2330 2331 return E; 2332 } 2333} 2334 2335bool Expr::isDefaultArgument() const { 2336 const Expr *E = this; 2337 if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E)) 2338 E = M->GetTemporaryExpr(); 2339 2340 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) 2341 E = ICE->getSubExprAsWritten(); 2342 2343 return isa<CXXDefaultArgExpr>(E); 2344} 2345 2346/// \brief Skip over any no-op casts and any temporary-binding 2347/// expressions. 2348static const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) { 2349 if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E)) 2350 E = M->GetTemporaryExpr(); 2351 2352 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2353 if (ICE->getCastKind() == CK_NoOp) 2354 E = ICE->getSubExpr(); 2355 else 2356 break; 2357 } 2358 2359 while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E)) 2360 E = BE->getSubExpr(); 2361 2362 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2363 if (ICE->getCastKind() == CK_NoOp) 2364 E = ICE->getSubExpr(); 2365 else 2366 break; 2367 } 2368 2369 return E->IgnoreParens(); 2370} 2371 2372/// isTemporaryObject - Determines if this expression produces a 2373/// temporary of the given class type. 2374bool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const { 2375 if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy))) 2376 return false; 2377 2378 const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this); 2379 2380 // Temporaries are by definition pr-values of class type. 2381 if (!E->Classify(C).isPRValue()) { 2382 // In this context, property reference is a message call and is pr-value. 2383 if (!isa<ObjCPropertyRefExpr>(E)) 2384 return false; 2385 } 2386 2387 // Black-list a few cases which yield pr-values of class type that don't 2388 // refer to temporaries of that type: 2389 2390 // - implicit derived-to-base conversions 2391 if (isa<ImplicitCastExpr>(E)) { 2392 switch (cast<ImplicitCastExpr>(E)->getCastKind()) { 2393 case CK_DerivedToBase: 2394 case CK_UncheckedDerivedToBase: 2395 return false; 2396 default: 2397 break; 2398 } 2399 } 2400 2401 // - member expressions (all) 2402 if (isa<MemberExpr>(E)) 2403 return false; 2404 2405 if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) 2406 if (BO->isPtrMemOp()) 2407 return false; 2408 2409 // - opaque values (all) 2410 if (isa<OpaqueValueExpr>(E)) 2411 return false; 2412 2413 return true; 2414} 2415 2416bool Expr::isImplicitCXXThis() const { 2417 const Expr *E = this; 2418 2419 // Strip away parentheses and casts we don't care about. 2420 while (true) { 2421 if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) { 2422 E = Paren->getSubExpr(); 2423 continue; 2424 } 2425 2426 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2427 if (ICE->getCastKind() == CK_NoOp || 2428 ICE->getCastKind() == CK_LValueToRValue || 2429 ICE->getCastKind() == CK_DerivedToBase || 2430 ICE->getCastKind() == CK_UncheckedDerivedToBase) { 2431 E = ICE->getSubExpr(); 2432 continue; 2433 } 2434 } 2435 2436 if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) { 2437 if (UnOp->getOpcode() == UO_Extension) { 2438 E = UnOp->getSubExpr(); 2439 continue; 2440 } 2441 } 2442 2443 if (const MaterializeTemporaryExpr *M 2444 = dyn_cast<MaterializeTemporaryExpr>(E)) { 2445 E = M->GetTemporaryExpr(); 2446 continue; 2447 } 2448 2449 break; 2450 } 2451 2452 if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E)) 2453 return This->isImplicit(); 2454 2455 return false; 2456} 2457 2458/// hasAnyTypeDependentArguments - Determines if any of the expressions 2459/// in Exprs is type-dependent. 2460bool Expr::hasAnyTypeDependentArguments(llvm::ArrayRef<Expr *> Exprs) { 2461 for (unsigned I = 0; I < Exprs.size(); ++I) 2462 if (Exprs[I]->isTypeDependent()) 2463 return true; 2464 2465 return false; 2466} 2467 2468bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const { 2469 // This function is attempting whether an expression is an initializer 2470 // which can be evaluated at compile-time. isEvaluatable handles most 2471 // of the cases, but it can't deal with some initializer-specific 2472 // expressions, and it can't deal with aggregates; we deal with those here, 2473 // and fall back to isEvaluatable for the other cases. 2474 2475 // If we ever capture reference-binding directly in the AST, we can 2476 // kill the second parameter. 2477 2478 if (IsForRef) { 2479 EvalResult Result; 2480 return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects; 2481 } 2482 2483 switch (getStmtClass()) { 2484 default: break; 2485 case IntegerLiteralClass: 2486 case FloatingLiteralClass: 2487 case StringLiteralClass: 2488 case ObjCStringLiteralClass: 2489 case ObjCEncodeExprClass: 2490 return true; 2491 case CXXTemporaryObjectExprClass: 2492 case CXXConstructExprClass: { 2493 const CXXConstructExpr *CE = cast<CXXConstructExpr>(this); 2494 2495 // Only if it's 2496 if (CE->getConstructor()->isTrivial()) { 2497 // 1) an application of the trivial default constructor or 2498 if (!CE->getNumArgs()) return true; 2499 2500 // 2) an elidable trivial copy construction of an operand which is 2501 // itself a constant initializer. Note that we consider the 2502 // operand on its own, *not* as a reference binding. 2503 if (CE->isElidable() && 2504 CE->getArg(0)->isConstantInitializer(Ctx, false)) 2505 return true; 2506 } 2507 2508 // 3) a foldable constexpr constructor. 2509 break; 2510 } 2511 case CompoundLiteralExprClass: { 2512 // This handles gcc's extension that allows global initializers like 2513 // "struct x {int x;} x = (struct x) {};". 2514 // FIXME: This accepts other cases it shouldn't! 2515 const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer(); 2516 return Exp->isConstantInitializer(Ctx, false); 2517 } 2518 case InitListExprClass: { 2519 // FIXME: This doesn't deal with fields with reference types correctly. 2520 // FIXME: This incorrectly allows pointers cast to integers to be assigned 2521 // to bitfields. 2522 const InitListExpr *Exp = cast<InitListExpr>(this); 2523 unsigned numInits = Exp->getNumInits(); 2524 for (unsigned i = 0; i < numInits; i++) { 2525 if (!Exp->getInit(i)->isConstantInitializer(Ctx, false)) 2526 return false; 2527 } 2528 return true; 2529 } 2530 case ImplicitValueInitExprClass: 2531 return true; 2532 case ParenExprClass: 2533 return cast<ParenExpr>(this)->getSubExpr() 2534 ->isConstantInitializer(Ctx, IsForRef); 2535 case GenericSelectionExprClass: 2536 if (cast<GenericSelectionExpr>(this)->isResultDependent()) 2537 return false; 2538 return cast<GenericSelectionExpr>(this)->getResultExpr() 2539 ->isConstantInitializer(Ctx, IsForRef); 2540 case ChooseExprClass: 2541 return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx) 2542 ->isConstantInitializer(Ctx, IsForRef); 2543 case UnaryOperatorClass: { 2544 const UnaryOperator* Exp = cast<UnaryOperator>(this); 2545 if (Exp->getOpcode() == UO_Extension) 2546 return Exp->getSubExpr()->isConstantInitializer(Ctx, false); 2547 break; 2548 } 2549 case CXXFunctionalCastExprClass: 2550 case CXXStaticCastExprClass: 2551 case ImplicitCastExprClass: 2552 case CStyleCastExprClass: { 2553 const CastExpr *CE = cast<CastExpr>(this); 2554 2555 // If we're promoting an integer to an _Atomic type then this is constant 2556 // if the integer is constant. We also need to check the converse in case 2557 // someone does something like: 2558 // 2559 // int a = (_Atomic(int))42; 2560 // 2561 // I doubt anyone would write code like this directly, but it's quite 2562 // possible as the result of macro expansions. 2563 if (CE->getCastKind() == CK_NonAtomicToAtomic || 2564 CE->getCastKind() == CK_AtomicToNonAtomic) 2565 return CE->getSubExpr()->isConstantInitializer(Ctx, false); 2566 2567 // Handle bitcasts of vector constants. 2568 if (getType()->isVectorType() && CE->getCastKind() == CK_BitCast) 2569 return CE->getSubExpr()->isConstantInitializer(Ctx, false); 2570 2571 // Handle misc casts we want to ignore. 2572 // FIXME: Is it really safe to ignore all these? 2573 if (CE->getCastKind() == CK_NoOp || 2574 CE->getCastKind() == CK_LValueToRValue || 2575 CE->getCastKind() == CK_ToUnion || 2576 CE->getCastKind() == CK_ConstructorConversion) 2577 return CE->getSubExpr()->isConstantInitializer(Ctx, false); 2578 2579 break; 2580 } 2581 case MaterializeTemporaryExprClass: 2582 return cast<MaterializeTemporaryExpr>(this)->GetTemporaryExpr() 2583 ->isConstantInitializer(Ctx, false); 2584 } 2585 return isEvaluatable(Ctx); 2586} 2587 2588namespace { 2589 /// \brief Look for a call to a non-trivial function within an expression. 2590 class NonTrivialCallFinder : public EvaluatedExprVisitor<NonTrivialCallFinder> 2591 { 2592 typedef EvaluatedExprVisitor<NonTrivialCallFinder> Inherited; 2593 2594 bool NonTrivial; 2595 2596 public: 2597 explicit NonTrivialCallFinder(ASTContext &Context) 2598 : Inherited(Context), NonTrivial(false) { } 2599 2600 bool hasNonTrivialCall() const { return NonTrivial; } 2601 2602 void VisitCallExpr(CallExpr *E) { 2603 if (CXXMethodDecl *Method 2604 = dyn_cast_or_null<CXXMethodDecl>(E->getCalleeDecl())) { 2605 if (Method->isTrivial()) { 2606 // Recurse to children of the call. 2607 Inherited::VisitStmt(E); 2608 return; 2609 } 2610 } 2611 2612 NonTrivial = true; 2613 } 2614 2615 void VisitCXXConstructExpr(CXXConstructExpr *E) { 2616 if (E->getConstructor()->isTrivial()) { 2617 // Recurse to children of the call. 2618 Inherited::VisitStmt(E); 2619 return; 2620 } 2621 2622 NonTrivial = true; 2623 } 2624 2625 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 2626 if (E->getTemporary()->getDestructor()->isTrivial()) { 2627 Inherited::VisitStmt(E); 2628 return; 2629 } 2630 2631 NonTrivial = true; 2632 } 2633 }; 2634} 2635 2636bool Expr::hasNonTrivialCall(ASTContext &Ctx) { 2637 NonTrivialCallFinder Finder(Ctx); 2638 Finder.Visit(this); 2639 return Finder.hasNonTrivialCall(); 2640} 2641 2642/// isNullPointerConstant - C99 6.3.2.3p3 - Return whether this is a null 2643/// pointer constant or not, as well as the specific kind of constant detected. 2644/// Null pointer constants can be integer constant expressions with the 2645/// value zero, casts of zero to void*, nullptr (C++0X), or __null 2646/// (a GNU extension). 2647Expr::NullPointerConstantKind 2648Expr::isNullPointerConstant(ASTContext &Ctx, 2649 NullPointerConstantValueDependence NPC) const { 2650 if (isValueDependent()) { 2651 switch (NPC) { 2652 case NPC_NeverValueDependent: 2653 llvm_unreachable("Unexpected value dependent expression!"); 2654 case NPC_ValueDependentIsNull: 2655 if (isTypeDependent() || getType()->isIntegralType(Ctx)) 2656 return NPCK_ZeroInteger; 2657 else 2658 return NPCK_NotNull; 2659 2660 case NPC_ValueDependentIsNotNull: 2661 return NPCK_NotNull; 2662 } 2663 } 2664 2665 // Strip off a cast to void*, if it exists. Except in C++. 2666 if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) { 2667 if (!Ctx.getLangOpts().CPlusPlus) { 2668 // Check that it is a cast to void*. 2669 if (const PointerType *PT = CE->getType()->getAs<PointerType>()) { 2670 QualType Pointee = PT->getPointeeType(); 2671 if (!Pointee.hasQualifiers() && 2672 Pointee->isVoidType() && // to void* 2673 CE->getSubExpr()->getType()->isIntegerType()) // from int. 2674 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2675 } 2676 } 2677 } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) { 2678 // Ignore the ImplicitCastExpr type entirely. 2679 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2680 } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) { 2681 // Accept ((void*)0) as a null pointer constant, as many other 2682 // implementations do. 2683 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC); 2684 } else if (const GenericSelectionExpr *GE = 2685 dyn_cast<GenericSelectionExpr>(this)) { 2686 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC); 2687 } else if (const CXXDefaultArgExpr *DefaultArg 2688 = dyn_cast<CXXDefaultArgExpr>(this)) { 2689 // See through default argument expressions 2690 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC); 2691 } else if (isa<GNUNullExpr>(this)) { 2692 // The GNU __null extension is always a null pointer constant. 2693 return NPCK_GNUNull; 2694 } else if (const MaterializeTemporaryExpr *M 2695 = dyn_cast<MaterializeTemporaryExpr>(this)) { 2696 return M->GetTemporaryExpr()->isNullPointerConstant(Ctx, NPC); 2697 } else if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(this)) { 2698 if (const Expr *Source = OVE->getSourceExpr()) 2699 return Source->isNullPointerConstant(Ctx, NPC); 2700 } 2701 2702 // C++0x nullptr_t is always a null pointer constant. 2703 if (getType()->isNullPtrType()) 2704 return NPCK_CXX0X_nullptr; 2705 2706 if (const RecordType *UT = getType()->getAsUnionType()) 2707 if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) 2708 if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){ 2709 const Expr *InitExpr = CLE->getInitializer(); 2710 if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr)) 2711 return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC); 2712 } 2713 // This expression must be an integer type. 2714 if (!getType()->isIntegerType() || 2715 (Ctx.getLangOpts().CPlusPlus && getType()->isEnumeralType())) 2716 return NPCK_NotNull; 2717 2718 // If we have an integer constant expression, we need to *evaluate* it and 2719 // test for the value 0. Don't use the C++11 constant expression semantics 2720 // for this, for now; once the dust settles on core issue 903, we might only 2721 // allow a literal 0 here in C++11 mode. 2722 if (Ctx.getLangOpts().CPlusPlus0x) { 2723 if (!isCXX98IntegralConstantExpr(Ctx)) 2724 return NPCK_NotNull; 2725 } else { 2726 if (!isIntegerConstantExpr(Ctx)) 2727 return NPCK_NotNull; 2728 } 2729 2730 return (EvaluateKnownConstInt(Ctx) == 0) ? NPCK_ZeroInteger : NPCK_NotNull; 2731} 2732 2733/// \brief If this expression is an l-value for an Objective C 2734/// property, find the underlying property reference expression. 2735const ObjCPropertyRefExpr *Expr::getObjCProperty() const { 2736 const Expr *E = this; 2737 while (true) { 2738 assert((E->getValueKind() == VK_LValue && 2739 E->getObjectKind() == OK_ObjCProperty) && 2740 "expression is not a property reference"); 2741 E = E->IgnoreParenCasts(); 2742 if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { 2743 if (BO->getOpcode() == BO_Comma) { 2744 E = BO->getRHS(); 2745 continue; 2746 } 2747 } 2748 2749 break; 2750 } 2751 2752 return cast<ObjCPropertyRefExpr>(E); 2753} 2754 2755FieldDecl *Expr::getBitField() { 2756 Expr *E = this->IgnoreParens(); 2757 2758 while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2759 if (ICE->getCastKind() == CK_LValueToRValue || 2760 (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp)) 2761 E = ICE->getSubExpr()->IgnoreParens(); 2762 else 2763 break; 2764 } 2765 2766 if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E)) 2767 if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl())) 2768 if (Field->isBitField()) 2769 return Field; 2770 2771 if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) 2772 if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl())) 2773 if (Field->isBitField()) 2774 return Field; 2775 2776 if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) { 2777 if (BinOp->isAssignmentOp() && BinOp->getLHS()) 2778 return BinOp->getLHS()->getBitField(); 2779 2780 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS()) 2781 return BinOp->getRHS()->getBitField(); 2782 } 2783 2784 return 0; 2785} 2786 2787bool Expr::refersToVectorElement() const { 2788 const Expr *E = this->IgnoreParens(); 2789 2790 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { 2791 if (ICE->getValueKind() != VK_RValue && 2792 ICE->getCastKind() == CK_NoOp) 2793 E = ICE->getSubExpr()->IgnoreParens(); 2794 else 2795 break; 2796 } 2797 2798 if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) 2799 return ASE->getBase()->getType()->isVectorType(); 2800 2801 if (isa<ExtVectorElementExpr>(E)) 2802 return true; 2803 2804 return false; 2805} 2806 2807/// isArrow - Return true if the base expression is a pointer to vector, 2808/// return false if the base expression is a vector. 2809bool ExtVectorElementExpr::isArrow() const { 2810 return getBase()->getType()->isPointerType(); 2811} 2812 2813unsigned ExtVectorElementExpr::getNumElements() const { 2814 if (const VectorType *VT = getType()->getAs<VectorType>()) 2815 return VT->getNumElements(); 2816 return 1; 2817} 2818 2819/// containsDuplicateElements - Return true if any element access is repeated. 2820bool ExtVectorElementExpr::containsDuplicateElements() const { 2821 // FIXME: Refactor this code to an accessor on the AST node which returns the 2822 // "type" of component access, and share with code below and in Sema. 2823 StringRef Comp = Accessor->getName(); 2824 2825 // Halving swizzles do not contain duplicate elements. 2826 if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd") 2827 return false; 2828 2829 // Advance past s-char prefix on hex swizzles. 2830 if (Comp[0] == 's' || Comp[0] == 'S') 2831 Comp = Comp.substr(1); 2832 2833 for (unsigned i = 0, e = Comp.size(); i != e; ++i) 2834 if (Comp.substr(i + 1).find(Comp[i]) != StringRef::npos) 2835 return true; 2836 2837 return false; 2838} 2839 2840/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. 2841void ExtVectorElementExpr::getEncodedElementAccess( 2842 SmallVectorImpl<unsigned> &Elts) const { 2843 StringRef Comp = Accessor->getName(); 2844 if (Comp[0] == 's' || Comp[0] == 'S') 2845 Comp = Comp.substr(1); 2846 2847 bool isHi = Comp == "hi"; 2848 bool isLo = Comp == "lo"; 2849 bool isEven = Comp == "even"; 2850 bool isOdd = Comp == "odd"; 2851 2852 for (unsigned i = 0, e = getNumElements(); i != e; ++i) { 2853 uint64_t Index; 2854 2855 if (isHi) 2856 Index = e + i; 2857 else if (isLo) 2858 Index = i; 2859 else if (isEven) 2860 Index = 2 * i; 2861 else if (isOdd) 2862 Index = 2 * i + 1; 2863 else 2864 Index = ExtVectorType::getAccessorIdx(Comp[i]); 2865 2866 Elts.push_back(Index); 2867 } 2868} 2869 2870ObjCMessageExpr::ObjCMessageExpr(QualType T, 2871 ExprValueKind VK, 2872 SourceLocation LBracLoc, 2873 SourceLocation SuperLoc, 2874 bool IsInstanceSuper, 2875 QualType SuperType, 2876 Selector Sel, 2877 ArrayRef<SourceLocation> SelLocs, 2878 SelectorLocationsKind SelLocsK, 2879 ObjCMethodDecl *Method, 2880 ArrayRef<Expr *> Args, 2881 SourceLocation RBracLoc, 2882 bool isImplicit) 2883 : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, 2884 /*TypeDependent=*/false, /*ValueDependent=*/false, 2885 /*InstantiationDependent=*/false, 2886 /*ContainsUnexpandedParameterPack=*/false), 2887 SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 2888 : Sel.getAsOpaquePtr())), 2889 Kind(IsInstanceSuper? SuperInstance : SuperClass), 2890 HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit), 2891 SuperLoc(SuperLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2892{ 2893 initArgsAndSelLocs(Args, SelLocs, SelLocsK); 2894 setReceiverPointer(SuperType.getAsOpaquePtr()); 2895} 2896 2897ObjCMessageExpr::ObjCMessageExpr(QualType T, 2898 ExprValueKind VK, 2899 SourceLocation LBracLoc, 2900 TypeSourceInfo *Receiver, 2901 Selector Sel, 2902 ArrayRef<SourceLocation> SelLocs, 2903 SelectorLocationsKind SelLocsK, 2904 ObjCMethodDecl *Method, 2905 ArrayRef<Expr *> Args, 2906 SourceLocation RBracLoc, 2907 bool isImplicit) 2908 : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(), 2909 T->isDependentType(), T->isInstantiationDependentType(), 2910 T->containsUnexpandedParameterPack()), 2911 SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 2912 : Sel.getAsOpaquePtr())), 2913 Kind(Class), 2914 HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit), 2915 LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2916{ 2917 initArgsAndSelLocs(Args, SelLocs, SelLocsK); 2918 setReceiverPointer(Receiver); 2919} 2920 2921ObjCMessageExpr::ObjCMessageExpr(QualType T, 2922 ExprValueKind VK, 2923 SourceLocation LBracLoc, 2924 Expr *Receiver, 2925 Selector Sel, 2926 ArrayRef<SourceLocation> SelLocs, 2927 SelectorLocationsKind SelLocsK, 2928 ObjCMethodDecl *Method, 2929 ArrayRef<Expr *> Args, 2930 SourceLocation RBracLoc, 2931 bool isImplicit) 2932 : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(), 2933 Receiver->isTypeDependent(), 2934 Receiver->isInstantiationDependent(), 2935 Receiver->containsUnexpandedParameterPack()), 2936 SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method 2937 : Sel.getAsOpaquePtr())), 2938 Kind(Instance), 2939 HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit), 2940 LBracLoc(LBracLoc), RBracLoc(RBracLoc) 2941{ 2942 initArgsAndSelLocs(Args, SelLocs, SelLocsK); 2943 setReceiverPointer(Receiver); 2944} 2945 2946void ObjCMessageExpr::initArgsAndSelLocs(ArrayRef<Expr *> Args, 2947 ArrayRef<SourceLocation> SelLocs, 2948 SelectorLocationsKind SelLocsK) { 2949 setNumArgs(Args.size()); 2950 Expr **MyArgs = getArgs(); 2951 for (unsigned I = 0; I != Args.size(); ++I) { 2952 if (Args[I]->isTypeDependent()) 2953 ExprBits.TypeDependent = true; 2954 if (Args[I]->isValueDependent()) 2955 ExprBits.ValueDependent = true; 2956 if (Args[I]->isInstantiationDependent()) 2957 ExprBits.InstantiationDependent = true; 2958 if (Args[I]->containsUnexpandedParameterPack()) 2959 ExprBits.ContainsUnexpandedParameterPack = true; 2960 2961 MyArgs[I] = Args[I]; 2962 } 2963 2964 SelLocsKind = SelLocsK; 2965 if (!isImplicit()) { 2966 if (SelLocsK == SelLoc_NonStandard) 2967 std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs()); 2968 } 2969} 2970 2971ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2972 ExprValueKind VK, 2973 SourceLocation LBracLoc, 2974 SourceLocation SuperLoc, 2975 bool IsInstanceSuper, 2976 QualType SuperType, 2977 Selector Sel, 2978 ArrayRef<SourceLocation> SelLocs, 2979 ObjCMethodDecl *Method, 2980 ArrayRef<Expr *> Args, 2981 SourceLocation RBracLoc, 2982 bool isImplicit) { 2983 assert((!SelLocs.empty() || isImplicit) && 2984 "No selector locs for non-implicit message"); 2985 ObjCMessageExpr *Mem; 2986 SelectorLocationsKind SelLocsK = SelectorLocationsKind(); 2987 if (isImplicit) 2988 Mem = alloc(Context, Args.size(), 0); 2989 else 2990 Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); 2991 return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper, 2992 SuperType, Sel, SelLocs, SelLocsK, 2993 Method, Args, RBracLoc, isImplicit); 2994} 2995 2996ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 2997 ExprValueKind VK, 2998 SourceLocation LBracLoc, 2999 TypeSourceInfo *Receiver, 3000 Selector Sel, 3001 ArrayRef<SourceLocation> SelLocs, 3002 ObjCMethodDecl *Method, 3003 ArrayRef<Expr *> Args, 3004 SourceLocation RBracLoc, 3005 bool isImplicit) { 3006 assert((!SelLocs.empty() || isImplicit) && 3007 "No selector locs for non-implicit message"); 3008 ObjCMessageExpr *Mem; 3009 SelectorLocationsKind SelLocsK = SelectorLocationsKind(); 3010 if (isImplicit) 3011 Mem = alloc(Context, Args.size(), 0); 3012 else 3013 Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); 3014 return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, 3015 SelLocs, SelLocsK, Method, Args, RBracLoc, 3016 isImplicit); 3017} 3018 3019ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, 3020 ExprValueKind VK, 3021 SourceLocation LBracLoc, 3022 Expr *Receiver, 3023 Selector Sel, 3024 ArrayRef<SourceLocation> SelLocs, 3025 ObjCMethodDecl *Method, 3026 ArrayRef<Expr *> Args, 3027 SourceLocation RBracLoc, 3028 bool isImplicit) { 3029 assert((!SelLocs.empty() || isImplicit) && 3030 "No selector locs for non-implicit message"); 3031 ObjCMessageExpr *Mem; 3032 SelectorLocationsKind SelLocsK = SelectorLocationsKind(); 3033 if (isImplicit) 3034 Mem = alloc(Context, Args.size(), 0); 3035 else 3036 Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); 3037 return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, 3038 SelLocs, SelLocsK, Method, Args, RBracLoc, 3039 isImplicit); 3040} 3041 3042ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context, 3043 unsigned NumArgs, 3044 unsigned NumStoredSelLocs) { 3045 ObjCMessageExpr *Mem = alloc(Context, NumArgs, NumStoredSelLocs); 3046 return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs); 3047} 3048 3049ObjCMessageExpr *ObjCMessageExpr::alloc(ASTContext &C, 3050 ArrayRef<Expr *> Args, 3051 SourceLocation RBraceLoc, 3052 ArrayRef<SourceLocation> SelLocs, 3053 Selector Sel, 3054 SelectorLocationsKind &SelLocsK) { 3055 SelLocsK = hasStandardSelectorLocs(Sel, SelLocs, Args, RBraceLoc); 3056 unsigned NumStoredSelLocs = (SelLocsK == SelLoc_NonStandard) ? SelLocs.size() 3057 : 0; 3058 return alloc(C, Args.size(), NumStoredSelLocs); 3059} 3060 3061ObjCMessageExpr *ObjCMessageExpr::alloc(ASTContext &C, 3062 unsigned NumArgs, 3063 unsigned NumStoredSelLocs) { 3064 unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) + 3065 NumArgs * sizeof(Expr *) + NumStoredSelLocs * sizeof(SourceLocation); 3066 return (ObjCMessageExpr *)C.Allocate(Size, 3067 llvm::AlignOf<ObjCMessageExpr>::Alignment); 3068} 3069 3070void ObjCMessageExpr::getSelectorLocs( 3071 SmallVectorImpl<SourceLocation> &SelLocs) const { 3072 for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i) 3073 SelLocs.push_back(getSelectorLoc(i)); 3074} 3075 3076SourceRange ObjCMessageExpr::getReceiverRange() const { 3077 switch (getReceiverKind()) { 3078 case Instance: 3079 return getInstanceReceiver()->getSourceRange(); 3080 3081 case Class: 3082 return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange(); 3083 3084 case SuperInstance: 3085 case SuperClass: 3086 return getSuperLoc(); 3087 } 3088 3089 llvm_unreachable("Invalid ReceiverKind!"); 3090} 3091 3092Selector ObjCMessageExpr::getSelector() const { 3093 if (HasMethod) 3094 return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod) 3095 ->getSelector(); 3096 return Selector(SelectorOrMethod); 3097} 3098 3099ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const { 3100 switch (getReceiverKind()) { 3101 case Instance: 3102 if (const ObjCObjectPointerType *Ptr 3103 = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>()) 3104 return Ptr->getInterfaceDecl(); 3105 break; 3106 3107 case Class: 3108 if (const ObjCObjectType *Ty 3109 = getClassReceiver()->getAs<ObjCObjectType>()) 3110 return Ty->getInterface(); 3111 break; 3112 3113 case SuperInstance: 3114 if (const ObjCObjectPointerType *Ptr 3115 = getSuperType()->getAs<ObjCObjectPointerType>()) 3116 return Ptr->getInterfaceDecl(); 3117 break; 3118 3119 case SuperClass: 3120 if (const ObjCObjectType *Iface 3121 = getSuperType()->getAs<ObjCObjectType>()) 3122 return Iface->getInterface(); 3123 break; 3124 } 3125 3126 return 0; 3127} 3128 3129StringRef ObjCBridgedCastExpr::getBridgeKindName() const { 3130 switch (getBridgeKind()) { 3131 case OBC_Bridge: 3132 return "__bridge"; 3133 case OBC_BridgeTransfer: 3134 return "__bridge_transfer"; 3135 case OBC_BridgeRetained: 3136 return "__bridge_retained"; 3137 } 3138 3139 llvm_unreachable("Invalid BridgeKind!"); 3140} 3141 3142bool ChooseExpr::isConditionTrue(const ASTContext &C) const { 3143 return getCond()->EvaluateKnownConstInt(C) != 0; 3144} 3145 3146ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr, 3147 QualType Type, SourceLocation BLoc, 3148 SourceLocation RP) 3149 : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary, 3150 Type->isDependentType(), Type->isDependentType(), 3151 Type->isInstantiationDependentType(), 3152 Type->containsUnexpandedParameterPack()), 3153 BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr) 3154{ 3155 SubExprs = new (C) Stmt*[nexpr]; 3156 for (unsigned i = 0; i < nexpr; i++) { 3157 if (args[i]->isTypeDependent()) 3158 ExprBits.TypeDependent = true; 3159 if (args[i]->isValueDependent()) 3160 ExprBits.ValueDependent = true; 3161 if (args[i]->isInstantiationDependent()) 3162 ExprBits.InstantiationDependent = true; 3163 if (args[i]->containsUnexpandedParameterPack()) 3164 ExprBits.ContainsUnexpandedParameterPack = true; 3165 3166 SubExprs[i] = args[i]; 3167 } 3168} 3169 3170void ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs, 3171 unsigned NumExprs) { 3172 if (SubExprs) C.Deallocate(SubExprs); 3173 3174 SubExprs = new (C) Stmt* [NumExprs]; 3175 this->NumExprs = NumExprs; 3176 memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs); 3177} 3178 3179GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context, 3180 SourceLocation GenericLoc, Expr *ControllingExpr, 3181 TypeSourceInfo **AssocTypes, Expr **AssocExprs, 3182 unsigned NumAssocs, SourceLocation DefaultLoc, 3183 SourceLocation RParenLoc, 3184 bool ContainsUnexpandedParameterPack, 3185 unsigned ResultIndex) 3186 : Expr(GenericSelectionExprClass, 3187 AssocExprs[ResultIndex]->getType(), 3188 AssocExprs[ResultIndex]->getValueKind(), 3189 AssocExprs[ResultIndex]->getObjectKind(), 3190 AssocExprs[ResultIndex]->isTypeDependent(), 3191 AssocExprs[ResultIndex]->isValueDependent(), 3192 AssocExprs[ResultIndex]->isInstantiationDependent(), 3193 ContainsUnexpandedParameterPack), 3194 AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]), 3195 SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs), 3196 ResultIndex(ResultIndex), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc), 3197 RParenLoc(RParenLoc) { 3198 SubExprs[CONTROLLING] = ControllingExpr; 3199 std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes); 3200 std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR); 3201} 3202 3203GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context, 3204 SourceLocation GenericLoc, Expr *ControllingExpr, 3205 TypeSourceInfo **AssocTypes, Expr **AssocExprs, 3206 unsigned NumAssocs, SourceLocation DefaultLoc, 3207 SourceLocation RParenLoc, 3208 bool ContainsUnexpandedParameterPack) 3209 : Expr(GenericSelectionExprClass, 3210 Context.DependentTy, 3211 VK_RValue, 3212 OK_Ordinary, 3213 /*isTypeDependent=*/true, 3214 /*isValueDependent=*/true, 3215 /*isInstantiationDependent=*/true, 3216 ContainsUnexpandedParameterPack), 3217 AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]), 3218 SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs), 3219 ResultIndex(-1U), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc), 3220 RParenLoc(RParenLoc) { 3221 SubExprs[CONTROLLING] = ControllingExpr; 3222 std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes); 3223 std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR); 3224} 3225 3226//===----------------------------------------------------------------------===// 3227// DesignatedInitExpr 3228//===----------------------------------------------------------------------===// 3229 3230IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() const { 3231 assert(Kind == FieldDesignator && "Only valid on a field designator"); 3232 if (Field.NameOrField & 0x01) 3233 return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01); 3234 else 3235 return getField()->getIdentifier(); 3236} 3237 3238DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty, 3239 unsigned NumDesignators, 3240 const Designator *Designators, 3241 SourceLocation EqualOrColonLoc, 3242 bool GNUSyntax, 3243 Expr **IndexExprs, 3244 unsigned NumIndexExprs, 3245 Expr *Init) 3246 : Expr(DesignatedInitExprClass, Ty, 3247 Init->getValueKind(), Init->getObjectKind(), 3248 Init->isTypeDependent(), Init->isValueDependent(), 3249 Init->isInstantiationDependent(), 3250 Init->containsUnexpandedParameterPack()), 3251 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax), 3252 NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) { 3253 this->Designators = new (C) Designator[NumDesignators]; 3254 3255 // Record the initializer itself. 3256 child_range Child = children(); 3257 *Child++ = Init; 3258 3259 // Copy the designators and their subexpressions, computing 3260 // value-dependence along the way. 3261 unsigned IndexIdx = 0; 3262 for (unsigned I = 0; I != NumDesignators; ++I) { 3263 this->Designators[I] = Designators[I]; 3264 3265 if (this->Designators[I].isArrayDesignator()) { 3266 // Compute type- and value-dependence. 3267 Expr *Index = IndexExprs[IndexIdx]; 3268 if (Index->isTypeDependent() || Index->isValueDependent()) 3269 ExprBits.ValueDependent = true; 3270 if (Index->isInstantiationDependent()) 3271 ExprBits.InstantiationDependent = true; 3272 // Propagate unexpanded parameter packs. 3273 if (Index->containsUnexpandedParameterPack()) 3274 ExprBits.ContainsUnexpandedParameterPack = true; 3275 3276 // Copy the index expressions into permanent storage. 3277 *Child++ = IndexExprs[IndexIdx++]; 3278 } else if (this->Designators[I].isArrayRangeDesignator()) { 3279 // Compute type- and value-dependence. 3280 Expr *Start = IndexExprs[IndexIdx]; 3281 Expr *End = IndexExprs[IndexIdx + 1]; 3282 if (Start->isTypeDependent() || Start->isValueDependent() || 3283 End->isTypeDependent() || End->isValueDependent()) { 3284 ExprBits.ValueDependent = true; 3285 ExprBits.InstantiationDependent = true; 3286 } else if (Start->isInstantiationDependent() || 3287 End->isInstantiationDependent()) { 3288 ExprBits.InstantiationDependent = true; 3289 } 3290 3291 // Propagate unexpanded parameter packs. 3292 if (Start->containsUnexpandedParameterPack() || 3293 End->containsUnexpandedParameterPack()) 3294 ExprBits.ContainsUnexpandedParameterPack = true; 3295 3296 // Copy the start/end expressions into permanent storage. 3297 *Child++ = IndexExprs[IndexIdx++]; 3298 *Child++ = IndexExprs[IndexIdx++]; 3299 } 3300 } 3301 3302 assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions"); 3303} 3304 3305DesignatedInitExpr * 3306DesignatedInitExpr::Create(ASTContext &C, Designator *Designators, 3307 unsigned NumDesignators, 3308 Expr **IndexExprs, unsigned NumIndexExprs, 3309 SourceLocation ColonOrEqualLoc, 3310 bool UsesColonSyntax, Expr *Init) { 3311 void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 3312 sizeof(Stmt *) * (NumIndexExprs + 1), 8); 3313 return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators, 3314 ColonOrEqualLoc, UsesColonSyntax, 3315 IndexExprs, NumIndexExprs, Init); 3316} 3317 3318DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C, 3319 unsigned NumIndexExprs) { 3320 void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 3321 sizeof(Stmt *) * (NumIndexExprs + 1), 8); 3322 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1); 3323} 3324 3325void DesignatedInitExpr::setDesignators(ASTContext &C, 3326 const Designator *Desigs, 3327 unsigned NumDesigs) { 3328 Designators = new (C) Designator[NumDesigs]; 3329 NumDesignators = NumDesigs; 3330 for (unsigned I = 0; I != NumDesigs; ++I) 3331 Designators[I] = Desigs[I]; 3332} 3333 3334SourceRange DesignatedInitExpr::getDesignatorsSourceRange() const { 3335 DesignatedInitExpr *DIE = const_cast<DesignatedInitExpr*>(this); 3336 if (size() == 1) 3337 return DIE->getDesignator(0)->getSourceRange(); 3338 return SourceRange(DIE->getDesignator(0)->getStartLocation(), 3339 DIE->getDesignator(size()-1)->getEndLocation()); 3340} 3341 3342SourceRange DesignatedInitExpr::getSourceRange() const { 3343 SourceLocation StartLoc; 3344 Designator &First = 3345 *const_cast<DesignatedInitExpr*>(this)->designators_begin(); 3346 if (First.isFieldDesignator()) { 3347 if (GNUSyntax) 3348 StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc); 3349 else 3350 StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc); 3351 } else 3352 StartLoc = 3353 SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc); 3354 return SourceRange(StartLoc, getInit()->getSourceRange().getEnd()); 3355} 3356 3357Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) { 3358 assert(D.Kind == Designator::ArrayDesignator && "Requires array designator"); 3359 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3360 Ptr += sizeof(DesignatedInitExpr); 3361 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 3362 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 3363} 3364 3365Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) { 3366 assert(D.Kind == Designator::ArrayRangeDesignator && 3367 "Requires array range designator"); 3368 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3369 Ptr += sizeof(DesignatedInitExpr); 3370 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 3371 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 3372} 3373 3374Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) { 3375 assert(D.Kind == Designator::ArrayRangeDesignator && 3376 "Requires array range designator"); 3377 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3378 Ptr += sizeof(DesignatedInitExpr); 3379 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 3380 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2)); 3381} 3382 3383/// \brief Replaces the designator at index @p Idx with the series 3384/// of designators in [First, Last). 3385void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx, 3386 const Designator *First, 3387 const Designator *Last) { 3388 unsigned NumNewDesignators = Last - First; 3389 if (NumNewDesignators == 0) { 3390 std::copy_backward(Designators + Idx + 1, 3391 Designators + NumDesignators, 3392 Designators + Idx); 3393 --NumNewDesignators; 3394 return; 3395 } else if (NumNewDesignators == 1) { 3396 Designators[Idx] = *First; 3397 return; 3398 } 3399 3400 Designator *NewDesignators 3401 = new (C) Designator[NumDesignators - 1 + NumNewDesignators]; 3402 std::copy(Designators, Designators + Idx, NewDesignators); 3403 std::copy(First, Last, NewDesignators + Idx); 3404 std::copy(Designators + Idx + 1, Designators + NumDesignators, 3405 NewDesignators + Idx + NumNewDesignators); 3406 Designators = NewDesignators; 3407 NumDesignators = NumDesignators - 1 + NumNewDesignators; 3408} 3409 3410ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc, 3411 Expr **exprs, unsigned nexprs, 3412 SourceLocation rparenloc) 3413 : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary, 3414 false, false, false, false), 3415 NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) { 3416 Exprs = new (C) Stmt*[nexprs]; 3417 for (unsigned i = 0; i != nexprs; ++i) { 3418 if (exprs[i]->isTypeDependent()) 3419 ExprBits.TypeDependent = true; 3420 if (exprs[i]->isValueDependent()) 3421 ExprBits.ValueDependent = true; 3422 if (exprs[i]->isInstantiationDependent()) 3423 ExprBits.InstantiationDependent = true; 3424 if (exprs[i]->containsUnexpandedParameterPack()) 3425 ExprBits.ContainsUnexpandedParameterPack = true; 3426 3427 Exprs[i] = exprs[i]; 3428 } 3429} 3430 3431const OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) { 3432 if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e)) 3433 e = ewc->getSubExpr(); 3434 if (const MaterializeTemporaryExpr *m = dyn_cast<MaterializeTemporaryExpr>(e)) 3435 e = m->GetTemporaryExpr(); 3436 e = cast<CXXConstructExpr>(e)->getArg(0); 3437 while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e)) 3438 e = ice->getSubExpr(); 3439 return cast<OpaqueValueExpr>(e); 3440} 3441 3442PseudoObjectExpr *PseudoObjectExpr::Create(ASTContext &Context, EmptyShell sh, 3443 unsigned numSemanticExprs) { 3444 void *buffer = Context.Allocate(sizeof(PseudoObjectExpr) + 3445 (1 + numSemanticExprs) * sizeof(Expr*), 3446 llvm::alignOf<PseudoObjectExpr>()); 3447 return new(buffer) PseudoObjectExpr(sh, numSemanticExprs); 3448} 3449 3450PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs) 3451 : Expr(PseudoObjectExprClass, shell) { 3452 PseudoObjectExprBits.NumSubExprs = numSemanticExprs + 1; 3453} 3454 3455PseudoObjectExpr *PseudoObjectExpr::Create(ASTContext &C, Expr *syntax, 3456 ArrayRef<Expr*> semantics, 3457 unsigned resultIndex) { 3458 assert(syntax && "no syntactic expression!"); 3459 assert(semantics.size() && "no semantic expressions!"); 3460 3461 QualType type; 3462 ExprValueKind VK; 3463 if (resultIndex == NoResult) { 3464 type = C.VoidTy; 3465 VK = VK_RValue; 3466 } else { 3467 assert(resultIndex < semantics.size()); 3468 type = semantics[resultIndex]->getType(); 3469 VK = semantics[resultIndex]->getValueKind(); 3470 assert(semantics[resultIndex]->getObjectKind() == OK_Ordinary); 3471 } 3472 3473 void *buffer = C.Allocate(sizeof(PseudoObjectExpr) + 3474 (1 + semantics.size()) * sizeof(Expr*), 3475 llvm::alignOf<PseudoObjectExpr>()); 3476 return new(buffer) PseudoObjectExpr(type, VK, syntax, semantics, 3477 resultIndex); 3478} 3479 3480PseudoObjectExpr::PseudoObjectExpr(QualType type, ExprValueKind VK, 3481 Expr *syntax, ArrayRef<Expr*> semantics, 3482 unsigned resultIndex) 3483 : Expr(PseudoObjectExprClass, type, VK, OK_Ordinary, 3484 /*filled in at end of ctor*/ false, false, false, false) { 3485 PseudoObjectExprBits.NumSubExprs = semantics.size() + 1; 3486 PseudoObjectExprBits.ResultIndex = resultIndex + 1; 3487 3488 for (unsigned i = 0, e = semantics.size() + 1; i != e; ++i) { 3489 Expr *E = (i == 0 ? syntax : semantics[i-1]); 3490 getSubExprsBuffer()[i] = E; 3491 3492 if (E->isTypeDependent()) 3493 ExprBits.TypeDependent = true; 3494 if (E->isValueDependent()) 3495 ExprBits.ValueDependent = true; 3496 if (E->isInstantiationDependent()) 3497 ExprBits.InstantiationDependent = true; 3498 if (E->containsUnexpandedParameterPack()) 3499 ExprBits.ContainsUnexpandedParameterPack = true; 3500 3501 if (isa<OpaqueValueExpr>(E)) 3502 assert(cast<OpaqueValueExpr>(E)->getSourceExpr() != 0 && 3503 "opaque-value semantic expressions for pseudo-object " 3504 "operations must have sources"); 3505 } 3506} 3507 3508//===----------------------------------------------------------------------===// 3509// ExprIterator. 3510//===----------------------------------------------------------------------===// 3511 3512Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); } 3513Expr* ExprIterator::operator*() const { return cast<Expr>(*I); } 3514Expr* ExprIterator::operator->() const { return cast<Expr>(*I); } 3515const Expr* ConstExprIterator::operator[](size_t idx) const { 3516 return cast<Expr>(I[idx]); 3517} 3518const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); } 3519const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); } 3520 3521//===----------------------------------------------------------------------===// 3522// Child Iterators for iterating over subexpressions/substatements 3523//===----------------------------------------------------------------------===// 3524 3525// UnaryExprOrTypeTraitExpr 3526Stmt::child_range UnaryExprOrTypeTraitExpr::children() { 3527 // If this is of a type and the type is a VLA type (and not a typedef), the 3528 // size expression of the VLA needs to be treated as an executable expression. 3529 // Why isn't this weirdness documented better in StmtIterator? 3530 if (isArgumentType()) { 3531 if (const VariableArrayType* T = dyn_cast<VariableArrayType>( 3532 getArgumentType().getTypePtr())) 3533 return child_range(child_iterator(T), child_iterator()); 3534 return child_range(); 3535 } 3536 return child_range(&Argument.Ex, &Argument.Ex + 1); 3537} 3538 3539// ObjCMessageExpr 3540Stmt::child_range ObjCMessageExpr::children() { 3541 Stmt **begin; 3542 if (getReceiverKind() == Instance) 3543 begin = reinterpret_cast<Stmt **>(this + 1); 3544 else 3545 begin = reinterpret_cast<Stmt **>(getArgs()); 3546 return child_range(begin, 3547 reinterpret_cast<Stmt **>(getArgs() + getNumArgs())); 3548} 3549 3550ObjCArrayLiteral::ObjCArrayLiteral(llvm::ArrayRef<Expr *> Elements, 3551 QualType T, ObjCMethodDecl *Method, 3552 SourceRange SR) 3553 : Expr(ObjCArrayLiteralClass, T, VK_RValue, OK_Ordinary, 3554 false, false, false, false), 3555 NumElements(Elements.size()), Range(SR), ArrayWithObjectsMethod(Method) 3556{ 3557 Expr **SaveElements = getElements(); 3558 for (unsigned I = 0, N = Elements.size(); I != N; ++I) { 3559 if (Elements[I]->isTypeDependent() || Elements[I]->isValueDependent()) 3560 ExprBits.ValueDependent = true; 3561 if (Elements[I]->isInstantiationDependent()) 3562 ExprBits.InstantiationDependent = true; 3563 if (Elements[I]->containsUnexpandedParameterPack()) 3564 ExprBits.ContainsUnexpandedParameterPack = true; 3565 3566 SaveElements[I] = Elements[I]; 3567 } 3568} 3569 3570ObjCArrayLiteral *ObjCArrayLiteral::Create(ASTContext &C, 3571 llvm::ArrayRef<Expr *> Elements, 3572 QualType T, ObjCMethodDecl * Method, 3573 SourceRange SR) { 3574 void *Mem = C.Allocate(sizeof(ObjCArrayLiteral) 3575 + Elements.size() * sizeof(Expr *)); 3576 return new (Mem) ObjCArrayLiteral(Elements, T, Method, SR); 3577} 3578 3579ObjCArrayLiteral *ObjCArrayLiteral::CreateEmpty(ASTContext &C, 3580 unsigned NumElements) { 3581 3582 void *Mem = C.Allocate(sizeof(ObjCArrayLiteral) 3583 + NumElements * sizeof(Expr *)); 3584 return new (Mem) ObjCArrayLiteral(EmptyShell(), NumElements); 3585} 3586 3587ObjCDictionaryLiteral::ObjCDictionaryLiteral( 3588 ArrayRef<ObjCDictionaryElement> VK, 3589 bool HasPackExpansions, 3590 QualType T, ObjCMethodDecl *method, 3591 SourceRange SR) 3592 : Expr(ObjCDictionaryLiteralClass, T, VK_RValue, OK_Ordinary, false, false, 3593 false, false), 3594 NumElements(VK.size()), HasPackExpansions(HasPackExpansions), Range(SR), 3595 DictWithObjectsMethod(method) 3596{ 3597 KeyValuePair *KeyValues = getKeyValues(); 3598 ExpansionData *Expansions = getExpansionData(); 3599 for (unsigned I = 0; I < NumElements; I++) { 3600 if (VK[I].Key->isTypeDependent() || VK[I].Key->isValueDependent() || 3601 VK[I].Value->isTypeDependent() || VK[I].Value->isValueDependent()) 3602 ExprBits.ValueDependent = true; 3603 if (VK[I].Key->isInstantiationDependent() || 3604 VK[I].Value->isInstantiationDependent()) 3605 ExprBits.InstantiationDependent = true; 3606 if (VK[I].EllipsisLoc.isInvalid() && 3607 (VK[I].Key->containsUnexpandedParameterPack() || 3608 VK[I].Value->containsUnexpandedParameterPack())) 3609 ExprBits.ContainsUnexpandedParameterPack = true; 3610 3611 KeyValues[I].Key = VK[I].Key; 3612 KeyValues[I].Value = VK[I].Value; 3613 if (Expansions) { 3614 Expansions[I].EllipsisLoc = VK[I].EllipsisLoc; 3615 if (VK[I].NumExpansions) 3616 Expansions[I].NumExpansionsPlusOne = *VK[I].NumExpansions + 1; 3617 else 3618 Expansions[I].NumExpansionsPlusOne = 0; 3619 } 3620 } 3621} 3622 3623ObjCDictionaryLiteral * 3624ObjCDictionaryLiteral::Create(ASTContext &C, 3625 ArrayRef<ObjCDictionaryElement> VK, 3626 bool HasPackExpansions, 3627 QualType T, ObjCMethodDecl *method, 3628 SourceRange SR) { 3629 unsigned ExpansionsSize = 0; 3630 if (HasPackExpansions) 3631 ExpansionsSize = sizeof(ExpansionData) * VK.size(); 3632 3633 void *Mem = C.Allocate(sizeof(ObjCDictionaryLiteral) + 3634 sizeof(KeyValuePair) * VK.size() + ExpansionsSize); 3635 return new (Mem) ObjCDictionaryLiteral(VK, HasPackExpansions, T, method, SR); 3636} 3637 3638ObjCDictionaryLiteral * 3639ObjCDictionaryLiteral::CreateEmpty(ASTContext &C, unsigned NumElements, 3640 bool HasPackExpansions) { 3641 unsigned ExpansionsSize = 0; 3642 if (HasPackExpansions) 3643 ExpansionsSize = sizeof(ExpansionData) * NumElements; 3644 void *Mem = C.Allocate(sizeof(ObjCDictionaryLiteral) + 3645 sizeof(KeyValuePair) * NumElements + ExpansionsSize); 3646 return new (Mem) ObjCDictionaryLiteral(EmptyShell(), NumElements, 3647 HasPackExpansions); 3648} 3649 3650ObjCSubscriptRefExpr *ObjCSubscriptRefExpr::Create(ASTContext &C, 3651 Expr *base, 3652 Expr *key, QualType T, 3653 ObjCMethodDecl *getMethod, 3654 ObjCMethodDecl *setMethod, 3655 SourceLocation RB) { 3656 void *Mem = C.Allocate(sizeof(ObjCSubscriptRefExpr)); 3657 return new (Mem) ObjCSubscriptRefExpr(base, key, T, VK_LValue, 3658 OK_ObjCSubscript, 3659 getMethod, setMethod, RB); 3660} 3661 3662AtomicExpr::AtomicExpr(SourceLocation BLoc, Expr **args, unsigned nexpr, 3663 QualType t, AtomicOp op, SourceLocation RP) 3664 : Expr(AtomicExprClass, t, VK_RValue, OK_Ordinary, 3665 false, false, false, false), 3666 NumSubExprs(nexpr), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) 3667{ 3668 assert(nexpr == getNumSubExprs(op) && "wrong number of subexpressions"); 3669 for (unsigned i = 0; i < nexpr; i++) { 3670 if (args[i]->isTypeDependent()) 3671 ExprBits.TypeDependent = true; 3672 if (args[i]->isValueDependent()) 3673 ExprBits.ValueDependent = true; 3674 if (args[i]->isInstantiationDependent()) 3675 ExprBits.InstantiationDependent = true; 3676 if (args[i]->containsUnexpandedParameterPack()) 3677 ExprBits.ContainsUnexpandedParameterPack = true; 3678 3679 SubExprs[i] = args[i]; 3680 } 3681} 3682 3683unsigned AtomicExpr::getNumSubExprs(AtomicOp Op) { 3684 switch (Op) { 3685 case AO__c11_atomic_init: 3686 case AO__c11_atomic_load: 3687 case AO__atomic_load_n: 3688 return 2; 3689 3690 case AO__c11_atomic_store: 3691 case AO__c11_atomic_exchange: 3692 case AO__atomic_load: 3693 case AO__atomic_store: 3694 case AO__atomic_store_n: 3695 case AO__atomic_exchange_n: 3696 case AO__c11_atomic_fetch_add: 3697 case AO__c11_atomic_fetch_sub: 3698 case AO__c11_atomic_fetch_and: 3699 case AO__c11_atomic_fetch_or: 3700 case AO__c11_atomic_fetch_xor: 3701 case AO__atomic_fetch_add: 3702 case AO__atomic_fetch_sub: 3703 case AO__atomic_fetch_and: 3704 case AO__atomic_fetch_or: 3705 case AO__atomic_fetch_xor: 3706 case AO__atomic_fetch_nand: 3707 case AO__atomic_add_fetch: 3708 case AO__atomic_sub_fetch: 3709 case AO__atomic_and_fetch: 3710 case AO__atomic_or_fetch: 3711 case AO__atomic_xor_fetch: 3712 case AO__atomic_nand_fetch: 3713 return 3; 3714 3715 case AO__atomic_exchange: 3716 return 4; 3717 3718 case AO__c11_atomic_compare_exchange_strong: 3719 case AO__c11_atomic_compare_exchange_weak: 3720 return 5; 3721 3722 case AO__atomic_compare_exchange: 3723 case AO__atomic_compare_exchange_n: 3724 return 6; 3725 } 3726 llvm_unreachable("unknown atomic op"); 3727} 3728