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