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