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