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/APValue.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/DeclObjC.h" 18 #include "clang/AST/DeclCXX.h" 19 #include "clang/AST/DeclTemplate.h" 20 #include "clang/AST/RecordLayout.h" 21 #include "clang/AST/StmtVisitor.h" 22 #include "clang/Basic/TargetInfo.h" 23 #include <algorithm> 24 using namespace clang; 25 26 //===----------------------------------------------------------------------===// 27 // Primary Expressions. 28 //===----------------------------------------------------------------------===// 29 30 PredefinedExpr* PredefinedExpr::Clone(ASTContext &C) const { 31 return new (C) PredefinedExpr(Loc, getType(), Type); 32 } 33 34 IntegerLiteral* IntegerLiteral::Clone(ASTContext &C) const { 35 return new (C) IntegerLiteral(Value, getType(), Loc); 36 } 37 38 CharacterLiteral* CharacterLiteral::Clone(ASTContext &C) const { 39 return new (C) CharacterLiteral(Value, IsWide, getType(), Loc); 40 } 41 42 FloatingLiteral* FloatingLiteral::Clone(ASTContext &C) const { 43 bool exact = IsExact; 44 return new (C) FloatingLiteral(Value, &exact, getType(), Loc); 45 } 46 47 ImaginaryLiteral* ImaginaryLiteral::Clone(ASTContext &C) const { 48 // FIXME: Use virtual Clone(), once it is available 49 Expr *ClonedVal = 0; 50 if (const IntegerLiteral *IntLit = dyn_cast<IntegerLiteral>(Val)) 51 ClonedVal = IntLit->Clone(C); 52 else 53 ClonedVal = cast<FloatingLiteral>(Val)->Clone(C); 54 return new (C) ImaginaryLiteral(ClonedVal, getType()); 55 } 56 57 GNUNullExpr* GNUNullExpr::Clone(ASTContext &C) const { 58 return new (C) GNUNullExpr(getType(), TokenLoc); 59 } 60 61 /// getValueAsApproximateDouble - This returns the value as an inaccurate 62 /// double. Note that this may cause loss of precision, but is useful for 63 /// debugging dumps, etc. 64 double FloatingLiteral::getValueAsApproximateDouble() const { 65 llvm::APFloat V = getValue(); 66 bool ignored; 67 V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, 68 &ignored); 69 return V.convertToDouble(); 70 } 71 72 StringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData, 73 unsigned ByteLength, bool Wide, 74 QualType Ty, 75 const SourceLocation *Loc, 76 unsigned NumStrs) { 77 // Allocate enough space for the StringLiteral plus an array of locations for 78 // any concatenated string tokens. 79 void *Mem = C.Allocate(sizeof(StringLiteral)+ 80 sizeof(SourceLocation)*(NumStrs-1), 81 llvm::alignof<StringLiteral>()); 82 StringLiteral *SL = new (Mem) StringLiteral(Ty); 83 84 // OPTIMIZE: could allocate this appended to the StringLiteral. 85 char *AStrData = new (C, 1) char[ByteLength]; 86 memcpy(AStrData, StrData, ByteLength); 87 SL->StrData = AStrData; 88 SL->ByteLength = ByteLength; 89 SL->IsWide = Wide; 90 SL->TokLocs[0] = Loc[0]; 91 SL->NumConcatenated = NumStrs; 92 93 if (NumStrs != 1) 94 memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1)); 95 return SL; 96 } 97 98 StringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) { 99 void *Mem = C.Allocate(sizeof(StringLiteral)+ 100 sizeof(SourceLocation)*(NumStrs-1), 101 llvm::alignof<StringLiteral>()); 102 StringLiteral *SL = new (Mem) StringLiteral(QualType()); 103 SL->StrData = 0; 104 SL->ByteLength = 0; 105 SL->NumConcatenated = NumStrs; 106 return SL; 107 } 108 109 StringLiteral* StringLiteral::Clone(ASTContext &C) const { 110 return Create(C, StrData, ByteLength, IsWide, getType(), 111 TokLocs, NumConcatenated); 112 } 113 114 void StringLiteral::Destroy(ASTContext &C) { 115 C.Deallocate(const_cast<char*>(StrData)); 116 this->~StringLiteral(); 117 C.Deallocate(this); 118 } 119 120 void StringLiteral::setStrData(ASTContext &C, const char *Str, unsigned Len) { 121 if (StrData) 122 C.Deallocate(const_cast<char*>(StrData)); 123 124 char *AStrData = new (C, 1) char[Len]; 125 memcpy(AStrData, Str, Len); 126 StrData = AStrData; 127 ByteLength = Len; 128 } 129 130 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 131 /// corresponds to, e.g. "sizeof" or "[pre]++". 132 const char *UnaryOperator::getOpcodeStr(Opcode Op) { 133 switch (Op) { 134 default: assert(0 && "Unknown unary operator"); 135 case PostInc: return "++"; 136 case PostDec: return "--"; 137 case PreInc: return "++"; 138 case PreDec: return "--"; 139 case AddrOf: return "&"; 140 case Deref: return "*"; 141 case Plus: return "+"; 142 case Minus: return "-"; 143 case Not: return "~"; 144 case LNot: return "!"; 145 case Real: return "__real"; 146 case Imag: return "__imag"; 147 case Extension: return "__extension__"; 148 case OffsetOf: return "__builtin_offsetof"; 149 } 150 } 151 152 UnaryOperator::Opcode 153 UnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) { 154 switch (OO) { 155 default: assert(false && "No unary operator for overloaded function"); 156 case OO_PlusPlus: return Postfix ? PostInc : PreInc; 157 case OO_MinusMinus: return Postfix ? PostDec : PreDec; 158 case OO_Amp: return AddrOf; 159 case OO_Star: return Deref; 160 case OO_Plus: return Plus; 161 case OO_Minus: return Minus; 162 case OO_Tilde: return Not; 163 case OO_Exclaim: return LNot; 164 } 165 } 166 167 OverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) { 168 switch (Opc) { 169 case PostInc: case PreInc: return OO_PlusPlus; 170 case PostDec: case PreDec: return OO_MinusMinus; 171 case AddrOf: return OO_Amp; 172 case Deref: return OO_Star; 173 case Plus: return OO_Plus; 174 case Minus: return OO_Minus; 175 case Not: return OO_Tilde; 176 case LNot: return OO_Exclaim; 177 default: return OO_None; 178 } 179 } 180 181 182 //===----------------------------------------------------------------------===// 183 // Postfix Operators. 184 //===----------------------------------------------------------------------===// 185 186 CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args, 187 unsigned numargs, QualType t, SourceLocation rparenloc) 188 : Expr(SC, t, 189 fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs), 190 fn->isValueDependent() || hasAnyValueDependentArguments(args,numargs)), 191 NumArgs(numargs) { 192 193 SubExprs = new (C) Stmt*[numargs+1]; 194 SubExprs[FN] = fn; 195 for (unsigned i = 0; i != numargs; ++i) 196 SubExprs[i+ARGS_START] = args[i]; 197 198 RParenLoc = rparenloc; 199 } 200 201 CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, 202 QualType t, SourceLocation rparenloc) 203 : Expr(CallExprClass, t, 204 fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs), 205 fn->isValueDependent() || hasAnyValueDependentArguments(args,numargs)), 206 NumArgs(numargs) { 207 208 SubExprs = new (C) Stmt*[numargs+1]; 209 SubExprs[FN] = fn; 210 for (unsigned i = 0; i != numargs; ++i) 211 SubExprs[i+ARGS_START] = args[i]; 212 213 RParenLoc = rparenloc; 214 } 215 216 CallExpr::CallExpr(ASTContext &C, EmptyShell Empty) 217 : Expr(CallExprClass, Empty), SubExprs(0), NumArgs(0) { 218 SubExprs = new (C) Stmt*[1]; 219 } 220 221 void CallExpr::Destroy(ASTContext& C) { 222 DestroyChildren(C); 223 if (SubExprs) C.Deallocate(SubExprs); 224 this->~CallExpr(); 225 C.Deallocate(this); 226 } 227 228 /// setNumArgs - This changes the number of arguments present in this call. 229 /// Any orphaned expressions are deleted by this, and any new operands are set 230 /// to null. 231 void CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) { 232 // No change, just return. 233 if (NumArgs == getNumArgs()) return; 234 235 // If shrinking # arguments, just delete the extras and forgot them. 236 if (NumArgs < getNumArgs()) { 237 for (unsigned i = NumArgs, e = getNumArgs(); i != e; ++i) 238 getArg(i)->Destroy(C); 239 this->NumArgs = NumArgs; 240 return; 241 } 242 243 // Otherwise, we are growing the # arguments. New an bigger argument array. 244 Stmt **NewSubExprs = new Stmt*[NumArgs+1]; 245 // Copy over args. 246 for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i) 247 NewSubExprs[i] = SubExprs[i]; 248 // Null out new args. 249 for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i) 250 NewSubExprs[i] = 0; 251 252 if (SubExprs) C.Deallocate(SubExprs); 253 SubExprs = NewSubExprs; 254 this->NumArgs = NumArgs; 255 } 256 257 /// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 258 /// not, return 0. 259 unsigned CallExpr::isBuiltinCall(ASTContext &Context) const { 260 // All simple function calls (e.g. func()) are implicitly cast to pointer to 261 // function. As a result, we try and obtain the DeclRefExpr from the 262 // ImplicitCastExpr. 263 const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee()); 264 if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()). 265 return 0; 266 267 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()); 268 if (!DRE) 269 return 0; 270 271 const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl()); 272 if (!FDecl) 273 return 0; 274 275 if (!FDecl->getIdentifier()) 276 return 0; 277 278 return FDecl->getBuiltinID(Context); 279 } 280 281 QualType CallExpr::getCallReturnType() const { 282 QualType CalleeType = getCallee()->getType(); 283 if (const PointerType *FnTypePtr = CalleeType->getAsPointerType()) 284 CalleeType = FnTypePtr->getPointeeType(); 285 else if (const BlockPointerType *BPT = CalleeType->getAsBlockPointerType()) 286 CalleeType = BPT->getPointeeType(); 287 288 const FunctionType *FnType = CalleeType->getAsFunctionType(); 289 return FnType->getResultType(); 290 } 291 292 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 293 /// corresponds to, e.g. "<<=". 294 const char *BinaryOperator::getOpcodeStr(Opcode Op) { 295 switch (Op) { 296 case PtrMemD: return ".*"; 297 case PtrMemI: return "->*"; 298 case Mul: return "*"; 299 case Div: return "/"; 300 case Rem: return "%"; 301 case Add: return "+"; 302 case Sub: return "-"; 303 case Shl: return "<<"; 304 case Shr: return ">>"; 305 case LT: return "<"; 306 case GT: return ">"; 307 case LE: return "<="; 308 case GE: return ">="; 309 case EQ: return "=="; 310 case NE: return "!="; 311 case And: return "&"; 312 case Xor: return "^"; 313 case Or: return "|"; 314 case LAnd: return "&&"; 315 case LOr: return "||"; 316 case Assign: return "="; 317 case MulAssign: return "*="; 318 case DivAssign: return "/="; 319 case RemAssign: return "%="; 320 case AddAssign: return "+="; 321 case SubAssign: return "-="; 322 case ShlAssign: return "<<="; 323 case ShrAssign: return ">>="; 324 case AndAssign: return "&="; 325 case XorAssign: return "^="; 326 case OrAssign: return "|="; 327 case Comma: return ","; 328 } 329 330 return ""; 331 } 332 333 BinaryOperator::Opcode 334 BinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) { 335 switch (OO) { 336 default: assert(false && "Not an overloadable binary operator"); 337 case OO_Plus: return Add; 338 case OO_Minus: return Sub; 339 case OO_Star: return Mul; 340 case OO_Slash: return Div; 341 case OO_Percent: return Rem; 342 case OO_Caret: return Xor; 343 case OO_Amp: return And; 344 case OO_Pipe: return Or; 345 case OO_Equal: return Assign; 346 case OO_Less: return LT; 347 case OO_Greater: return GT; 348 case OO_PlusEqual: return AddAssign; 349 case OO_MinusEqual: return SubAssign; 350 case OO_StarEqual: return MulAssign; 351 case OO_SlashEqual: return DivAssign; 352 case OO_PercentEqual: return RemAssign; 353 case OO_CaretEqual: return XorAssign; 354 case OO_AmpEqual: return AndAssign; 355 case OO_PipeEqual: return OrAssign; 356 case OO_LessLess: return Shl; 357 case OO_GreaterGreater: return Shr; 358 case OO_LessLessEqual: return ShlAssign; 359 case OO_GreaterGreaterEqual: return ShrAssign; 360 case OO_EqualEqual: return EQ; 361 case OO_ExclaimEqual: return NE; 362 case OO_LessEqual: return LE; 363 case OO_GreaterEqual: return GE; 364 case OO_AmpAmp: return LAnd; 365 case OO_PipePipe: return LOr; 366 case OO_Comma: return Comma; 367 case OO_ArrowStar: return PtrMemI; 368 } 369 } 370 371 OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) { 372 static const OverloadedOperatorKind OverOps[] = { 373 /* .* Cannot be overloaded */OO_None, OO_ArrowStar, 374 OO_Star, OO_Slash, OO_Percent, 375 OO_Plus, OO_Minus, 376 OO_LessLess, OO_GreaterGreater, 377 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual, 378 OO_EqualEqual, OO_ExclaimEqual, 379 OO_Amp, 380 OO_Caret, 381 OO_Pipe, 382 OO_AmpAmp, 383 OO_PipePipe, 384 OO_Equal, OO_StarEqual, 385 OO_SlashEqual, OO_PercentEqual, 386 OO_PlusEqual, OO_MinusEqual, 387 OO_LessLessEqual, OO_GreaterGreaterEqual, 388 OO_AmpEqual, OO_CaretEqual, 389 OO_PipeEqual, 390 OO_Comma 391 }; 392 return OverOps[Opc]; 393 } 394 395 InitListExpr::InitListExpr(SourceLocation lbraceloc, 396 Expr **initExprs, unsigned numInits, 397 SourceLocation rbraceloc) 398 : Expr(InitListExprClass, QualType(), 399 hasAnyTypeDependentArguments(initExprs, numInits), 400 hasAnyValueDependentArguments(initExprs, numInits)), 401 LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0), 402 UnionFieldInit(0), HadArrayRangeDesignator(false) { 403 404 InitExprs.insert(InitExprs.end(), initExprs, initExprs+numInits); 405 } 406 407 void InitListExpr::reserveInits(unsigned NumInits) { 408 if (NumInits > InitExprs.size()) 409 InitExprs.reserve(NumInits); 410 } 411 412 void InitListExpr::resizeInits(ASTContext &Context, unsigned NumInits) { 413 for (unsigned Idx = NumInits, LastIdx = InitExprs.size(); 414 Idx < LastIdx; ++Idx) 415 InitExprs[Idx]->Destroy(Context); 416 InitExprs.resize(NumInits, 0); 417 } 418 419 Expr *InitListExpr::updateInit(unsigned Init, Expr *expr) { 420 if (Init >= InitExprs.size()) { 421 InitExprs.insert(InitExprs.end(), Init - InitExprs.size() + 1, 0); 422 InitExprs.back() = expr; 423 return 0; 424 } 425 426 Expr *Result = cast_or_null<Expr>(InitExprs[Init]); 427 InitExprs[Init] = expr; 428 return Result; 429 } 430 431 /// getFunctionType - Return the underlying function type for this block. 432 /// 433 const FunctionType *BlockExpr::getFunctionType() const { 434 return getType()->getAsBlockPointerType()-> 435 getPointeeType()->getAsFunctionType(); 436 } 437 438 SourceLocation BlockExpr::getCaretLocation() const { 439 return TheBlock->getCaretLocation(); 440 } 441 const Stmt *BlockExpr::getBody() const { 442 return TheBlock->getBody(); 443 } 444 Stmt *BlockExpr::getBody() { 445 return TheBlock->getBody(); 446 } 447 448 449 //===----------------------------------------------------------------------===// 450 // Generic Expression Routines 451 //===----------------------------------------------------------------------===// 452 453 /// isUnusedResultAWarning - Return true if this immediate expression should 454 /// be warned about if the result is unused. If so, fill in Loc and Ranges 455 /// with location to warn on and the source range[s] to report with the 456 /// warning. 457 bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1, 458 SourceRange &R2) const { 459 // Don't warn if the expr is type dependent. The type could end up 460 // instantiating to void. 461 if (isTypeDependent()) 462 return false; 463 464 switch (getStmtClass()) { 465 default: 466 Loc = getExprLoc(); 467 R1 = getSourceRange(); 468 return true; 469 case ParenExprClass: 470 return cast<ParenExpr>(this)->getSubExpr()-> 471 isUnusedResultAWarning(Loc, R1, R2); 472 case UnaryOperatorClass: { 473 const UnaryOperator *UO = cast<UnaryOperator>(this); 474 475 switch (UO->getOpcode()) { 476 default: break; 477 case UnaryOperator::PostInc: 478 case UnaryOperator::PostDec: 479 case UnaryOperator::PreInc: 480 case UnaryOperator::PreDec: // ++/-- 481 return false; // Not a warning. 482 case UnaryOperator::Deref: 483 // Dereferencing a volatile pointer is a side-effect. 484 if (getType().isVolatileQualified()) 485 return false; 486 break; 487 case UnaryOperator::Real: 488 case UnaryOperator::Imag: 489 // accessing a piece of a volatile complex is a side-effect. 490 if (UO->getSubExpr()->getType().isVolatileQualified()) 491 return false; 492 break; 493 case UnaryOperator::Extension: 494 return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 495 } 496 Loc = UO->getOperatorLoc(); 497 R1 = UO->getSubExpr()->getSourceRange(); 498 return true; 499 } 500 case BinaryOperatorClass: { 501 const BinaryOperator *BO = cast<BinaryOperator>(this); 502 // Consider comma to have side effects if the LHS or RHS does. 503 if (BO->getOpcode() == BinaryOperator::Comma) 504 return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2) || 505 BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2); 506 507 if (BO->isAssignmentOp()) 508 return false; 509 Loc = BO->getOperatorLoc(); 510 R1 = BO->getLHS()->getSourceRange(); 511 R2 = BO->getRHS()->getSourceRange(); 512 return true; 513 } 514 case CompoundAssignOperatorClass: 515 return false; 516 517 case ConditionalOperatorClass: { 518 // The condition must be evaluated, but if either the LHS or RHS is a 519 // warning, warn about them. 520 const ConditionalOperator *Exp = cast<ConditionalOperator>(this); 521 if (Exp->getLHS() && Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2)) 522 return true; 523 return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2); 524 } 525 526 case MemberExprClass: 527 // If the base pointer or element is to a volatile pointer/field, accessing 528 // it is a side effect. 529 if (getType().isVolatileQualified()) 530 return false; 531 Loc = cast<MemberExpr>(this)->getMemberLoc(); 532 R1 = SourceRange(Loc, Loc); 533 R2 = cast<MemberExpr>(this)->getBase()->getSourceRange(); 534 return true; 535 536 case ArraySubscriptExprClass: 537 // If the base pointer or element is to a volatile pointer/field, accessing 538 // it is a side effect. 539 if (getType().isVolatileQualified()) 540 return false; 541 Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc(); 542 R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange(); 543 R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange(); 544 return true; 545 546 case CallExprClass: 547 case CXXOperatorCallExprClass: 548 case CXXMemberCallExprClass: { 549 // If this is a direct call, get the callee. 550 const CallExpr *CE = cast<CallExpr>(this); 551 const Expr *CalleeExpr = CE->getCallee()->IgnoreParenCasts(); 552 if (const DeclRefExpr *CalleeDRE = dyn_cast<DeclRefExpr>(CalleeExpr)) { 553 // If the callee has attribute pure, const, or warn_unused_result, warn 554 // about it. void foo() { strlen("bar"); } should warn. 555 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CalleeDRE->getDecl())) 556 if (FD->getAttr<WarnUnusedResultAttr>() || 557 FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) { 558 Loc = CE->getCallee()->getLocStart(); 559 R1 = CE->getCallee()->getSourceRange(); 560 561 if (unsigned NumArgs = CE->getNumArgs()) 562 R2 = SourceRange(CE->getArg(0)->getLocStart(), 563 CE->getArg(NumArgs-1)->getLocEnd()); 564 return true; 565 } 566 } 567 return false; 568 } 569 case ObjCMessageExprClass: 570 return false; 571 case StmtExprClass: { 572 // Statement exprs don't logically have side effects themselves, but are 573 // sometimes used in macros in ways that give them a type that is unused. 574 // For example ({ blah; foo(); }) will end up with a type if foo has a type. 575 // however, if the result of the stmt expr is dead, we don't want to emit a 576 // warning. 577 const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt(); 578 if (!CS->body_empty()) 579 if (const Expr *E = dyn_cast<Expr>(CS->body_back())) 580 return E->isUnusedResultAWarning(Loc, R1, R2); 581 582 Loc = cast<StmtExpr>(this)->getLParenLoc(); 583 R1 = getSourceRange(); 584 return true; 585 } 586 case CStyleCastExprClass: 587 // If this is a cast to void, check the operand. Otherwise, the result of 588 // the cast is unused. 589 if (getType()->isVoidType()) 590 return cast<CastExpr>(this)->getSubExpr()->isUnusedResultAWarning(Loc, 591 R1, R2); 592 Loc = cast<CStyleCastExpr>(this)->getLParenLoc(); 593 R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange(); 594 return true; 595 case CXXFunctionalCastExprClass: 596 // If this is a cast to void, check the operand. Otherwise, the result of 597 // the cast is unused. 598 if (getType()->isVoidType()) 599 return cast<CastExpr>(this)->getSubExpr()->isUnusedResultAWarning(Loc, 600 R1, R2); 601 Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc(); 602 R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange(); 603 return true; 604 605 case ImplicitCastExprClass: 606 // Check the operand, since implicit casts are inserted by Sema 607 return cast<ImplicitCastExpr>(this) 608 ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 609 610 case CXXDefaultArgExprClass: 611 return cast<CXXDefaultArgExpr>(this) 612 ->getExpr()->isUnusedResultAWarning(Loc, R1, R2); 613 614 case CXXNewExprClass: 615 // FIXME: In theory, there might be new expressions that don't have side 616 // effects (e.g. a placement new with an uninitialized POD). 617 case CXXDeleteExprClass: 618 return false; 619 case CXXExprWithTemporariesClass: 620 return cast<CXXExprWithTemporaries>(this) 621 ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2); 622 } 623 } 624 625 /// DeclCanBeLvalue - Determine whether the given declaration can be 626 /// an lvalue. This is a helper routine for isLvalue. 627 static bool DeclCanBeLvalue(const NamedDecl *Decl, ASTContext &Ctx) { 628 // C++ [temp.param]p6: 629 // A non-type non-reference template-parameter is not an lvalue. 630 if (const NonTypeTemplateParmDecl *NTTParm 631 = dyn_cast<NonTypeTemplateParmDecl>(Decl)) 632 return NTTParm->getType()->isReferenceType(); 633 634 return isa<VarDecl>(Decl) || isa<FieldDecl>(Decl) || 635 // C++ 3.10p2: An lvalue refers to an object or function. 636 (Ctx.getLangOptions().CPlusPlus && 637 (isa<FunctionDecl>(Decl) || isa<OverloadedFunctionDecl>(Decl))); 638 } 639 640 /// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or an 641 /// incomplete type other than void. Nonarray expressions that can be lvalues: 642 /// - name, where name must be a variable 643 /// - e[i] 644 /// - (e), where e must be an lvalue 645 /// - e.name, where e must be an lvalue 646 /// - e->name 647 /// - *e, the type of e cannot be a function type 648 /// - string-constant 649 /// - (__real__ e) and (__imag__ e) where e is an lvalue [GNU extension] 650 /// - reference type [C++ [expr]] 651 /// 652 Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { 653 assert(!TR->isReferenceType() && "Expressions can't have reference type."); 654 655 isLvalueResult Res = isLvalueInternal(Ctx); 656 if (Res != LV_Valid || Ctx.getLangOptions().CPlusPlus) 657 return Res; 658 659 // first, check the type (C99 6.3.2.1). Expressions with function 660 // type in C are not lvalues, but they can be lvalues in C++. 661 if (TR->isFunctionType()) 662 return LV_NotObjectType; 663 664 // Allow qualified void which is an incomplete type other than void (yuck). 665 if (TR->isVoidType() && !Ctx.getCanonicalType(TR).getCVRQualifiers()) 666 return LV_IncompleteVoidType; 667 668 return LV_Valid; 669 } 670 671 // Check whether the expression can be sanely treated like an l-value 672 Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const { 673 switch (getStmtClass()) { 674 case StringLiteralClass: // C99 6.5.1p4 675 case ObjCEncodeExprClass: // @encode behaves like its string in every way. 676 return LV_Valid; 677 case ArraySubscriptExprClass: // C99 6.5.3p4 (e1[e2] == (*((e1)+(e2)))) 678 // For vectors, make sure base is an lvalue (i.e. not a function call). 679 if (cast<ArraySubscriptExpr>(this)->getBase()->getType()->isVectorType()) 680 return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue(Ctx); 681 return LV_Valid; 682 case DeclRefExprClass: 683 case QualifiedDeclRefExprClass: { // C99 6.5.1p2 684 const NamedDecl *RefdDecl = cast<DeclRefExpr>(this)->getDecl(); 685 if (DeclCanBeLvalue(RefdDecl, Ctx)) 686 return LV_Valid; 687 break; 688 } 689 case BlockDeclRefExprClass: { 690 const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this); 691 if (isa<VarDecl>(BDR->getDecl())) 692 return LV_Valid; 693 break; 694 } 695 case MemberExprClass: { 696 const MemberExpr *m = cast<MemberExpr>(this); 697 if (Ctx.getLangOptions().CPlusPlus) { // C++ [expr.ref]p4: 698 NamedDecl *Member = m->getMemberDecl(); 699 // C++ [expr.ref]p4: 700 // If E2 is declared to have type "reference to T", then E1.E2 701 // is an lvalue. 702 if (ValueDecl *Value = dyn_cast<ValueDecl>(Member)) 703 if (Value->getType()->isReferenceType()) 704 return LV_Valid; 705 706 // -- If E2 is a static data member [...] then E1.E2 is an lvalue. 707 if (isa<VarDecl>(Member) && Member->getDeclContext()->isRecord()) 708 return LV_Valid; 709 710 // -- If E2 is a non-static data member [...]. If E1 is an 711 // lvalue, then E1.E2 is an lvalue. 712 if (isa<FieldDecl>(Member)) 713 return m->isArrow() ? LV_Valid : m->getBase()->isLvalue(Ctx); 714 715 // -- If it refers to a static member function [...], then 716 // E1.E2 is an lvalue. 717 // -- Otherwise, if E1.E2 refers to a non-static member 718 // function [...], then E1.E2 is not an lvalue. 719 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Member)) 720 return Method->isStatic()? LV_Valid : LV_MemberFunction; 721 722 // -- If E2 is a member enumerator [...], the expression E1.E2 723 // is not an lvalue. 724 if (isa<EnumConstantDecl>(Member)) 725 return LV_InvalidExpression; 726 727 // Not an lvalue. 728 return LV_InvalidExpression; 729 } 730 731 // C99 6.5.2.3p4 732 return m->isArrow() ? LV_Valid : m->getBase()->isLvalue(Ctx); 733 } 734 case UnaryOperatorClass: 735 if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref) 736 return LV_Valid; // C99 6.5.3p4 737 738 if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Real || 739 cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Imag || 740 cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Extension) 741 return cast<UnaryOperator>(this)->getSubExpr()->isLvalue(Ctx); // GNU. 742 743 if (Ctx.getLangOptions().CPlusPlus && // C++ [expr.pre.incr]p1 744 (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::PreInc || 745 cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::PreDec)) 746 return LV_Valid; 747 break; 748 case ImplicitCastExprClass: 749 return cast<ImplicitCastExpr>(this)->isLvalueCast()? LV_Valid 750 : LV_InvalidExpression; 751 case ParenExprClass: // C99 6.5.1p5 752 return cast<ParenExpr>(this)->getSubExpr()->isLvalue(Ctx); 753 case BinaryOperatorClass: 754 case CompoundAssignOperatorClass: { 755 const BinaryOperator *BinOp = cast<BinaryOperator>(this); 756 757 if (Ctx.getLangOptions().CPlusPlus && // C++ [expr.comma]p1 758 BinOp->getOpcode() == BinaryOperator::Comma) 759 return BinOp->getRHS()->isLvalue(Ctx); 760 761 // C++ [expr.mptr.oper]p6 762 if ((BinOp->getOpcode() == BinaryOperator::PtrMemD || 763 BinOp->getOpcode() == BinaryOperator::PtrMemI) && 764 !BinOp->getType()->isFunctionType()) 765 return BinOp->getLHS()->isLvalue(Ctx); 766 767 if (!BinOp->isAssignmentOp()) 768 return LV_InvalidExpression; 769 770 if (Ctx.getLangOptions().CPlusPlus) 771 // C++ [expr.ass]p1: 772 // The result of an assignment operation [...] is an lvalue. 773 return LV_Valid; 774 775 776 // C99 6.5.16: 777 // An assignment expression [...] is not an lvalue. 778 return LV_InvalidExpression; 779 } 780 case CallExprClass: 781 case CXXOperatorCallExprClass: 782 case CXXMemberCallExprClass: { 783 // C++0x [expr.call]p10 784 // A function call is an lvalue if and only if the result type 785 // is an lvalue reference. 786 QualType ReturnType = cast<CallExpr>(this)->getCallReturnType(); 787 if (ReturnType->isLValueReferenceType()) 788 return LV_Valid; 789 790 break; 791 } 792 case CompoundLiteralExprClass: // C99 6.5.2.5p5 793 return LV_Valid; 794 case ChooseExprClass: 795 // __builtin_choose_expr is an lvalue if the selected operand is. 796 return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)->isLvalue(Ctx); 797 case ExtVectorElementExprClass: 798 if (cast<ExtVectorElementExpr>(this)->containsDuplicateElements()) 799 return LV_DuplicateVectorComponents; 800 return LV_Valid; 801 case ObjCIvarRefExprClass: // ObjC instance variables are lvalues. 802 return LV_Valid; 803 case ObjCPropertyRefExprClass: // FIXME: check if read-only property. 804 return LV_Valid; 805 case ObjCKVCRefExprClass: // FIXME: check if read-only property. 806 return LV_Valid; 807 case PredefinedExprClass: 808 return LV_Valid; 809 case CXXDefaultArgExprClass: 810 return cast<CXXDefaultArgExpr>(this)->getExpr()->isLvalue(Ctx); 811 case CXXConditionDeclExprClass: 812 return LV_Valid; 813 case CStyleCastExprClass: 814 case CXXFunctionalCastExprClass: 815 case CXXStaticCastExprClass: 816 case CXXDynamicCastExprClass: 817 case CXXReinterpretCastExprClass: 818 case CXXConstCastExprClass: 819 // The result of an explicit cast is an lvalue if the type we are 820 // casting to is an lvalue reference type. See C++ [expr.cast]p1, 821 // C++ [expr.static.cast]p2, C++ [expr.dynamic.cast]p2, 822 // C++ [expr.reinterpret.cast]p1, C++ [expr.const.cast]p1. 823 if (cast<ExplicitCastExpr>(this)->getTypeAsWritten()-> 824 isLValueReferenceType()) 825 return LV_Valid; 826 break; 827 case CXXTypeidExprClass: 828 // C++ 5.2.8p1: The result of a typeid expression is an lvalue of ... 829 return LV_Valid; 830 case ConditionalOperatorClass: { 831 // Complicated handling is only for C++. 832 if (!Ctx.getLangOptions().CPlusPlus) 833 return LV_InvalidExpression; 834 835 // Sema should have taken care to ensure that a CXXTemporaryObjectExpr is 836 // everywhere there's an object converted to an rvalue. Also, any other 837 // casts should be wrapped by ImplicitCastExprs. There's just the special 838 // case involving throws to work out. 839 const ConditionalOperator *Cond = cast<ConditionalOperator>(this); 840 Expr *True = Cond->getTrueExpr(); 841 Expr *False = Cond->getFalseExpr(); 842 // C++0x 5.16p2 843 // If either the second or the third operand has type (cv) void, [...] 844 // the result [...] is an rvalue. 845 if (True->getType()->isVoidType() || False->getType()->isVoidType()) 846 return LV_InvalidExpression; 847 848 // Both sides must be lvalues for the result to be an lvalue. 849 if (True->isLvalue(Ctx) != LV_Valid || False->isLvalue(Ctx) != LV_Valid) 850 return LV_InvalidExpression; 851 852 // That's it. 853 return LV_Valid; 854 } 855 856 default: 857 break; 858 } 859 return LV_InvalidExpression; 860 } 861 862 /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 863 /// does not have an incomplete type, does not have a const-qualified type, and 864 /// if it is a structure or union, does not have any member (including, 865 /// recursively, any member or element of all contained aggregates or unions) 866 /// with a const-qualified type. 867 Expr::isModifiableLvalueResult 868 Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const { 869 isLvalueResult lvalResult = isLvalue(Ctx); 870 871 switch (lvalResult) { 872 case LV_Valid: 873 // C++ 3.10p11: Functions cannot be modified, but pointers to 874 // functions can be modifiable. 875 if (Ctx.getLangOptions().CPlusPlus && TR->isFunctionType()) 876 return MLV_NotObjectType; 877 break; 878 879 case LV_NotObjectType: return MLV_NotObjectType; 880 case LV_IncompleteVoidType: return MLV_IncompleteVoidType; 881 case LV_DuplicateVectorComponents: return MLV_DuplicateVectorComponents; 882 case LV_InvalidExpression: 883 // If the top level is a C-style cast, and the subexpression is a valid 884 // lvalue, then this is probably a use of the old-school "cast as lvalue" 885 // GCC extension. We don't support it, but we want to produce good 886 // diagnostics when it happens so that the user knows why. 887 if (const CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(IgnoreParens())) { 888 if (CE->getSubExpr()->isLvalue(Ctx) == LV_Valid) { 889 if (Loc) 890 *Loc = CE->getLParenLoc(); 891 return MLV_LValueCast; 892 } 893 } 894 return MLV_InvalidExpression; 895 case LV_MemberFunction: return MLV_MemberFunction; 896 } 897 898 // The following is illegal: 899 // void takeclosure(void (^C)(void)); 900 // void func() { int x = 1; takeclosure(^{ x = 7; }); } 901 // 902 if (isa<BlockDeclRefExpr>(this)) { 903 const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this); 904 if (!BDR->isByRef() && isa<VarDecl>(BDR->getDecl())) 905 return MLV_NotBlockQualified; 906 } 907 908 QualType CT = Ctx.getCanonicalType(getType()); 909 910 if (CT.isConstQualified()) 911 return MLV_ConstQualified; 912 if (CT->isArrayType()) 913 return MLV_ArrayType; 914 if (CT->isIncompleteType()) 915 return MLV_IncompleteType; 916 917 if (const RecordType *r = CT->getAsRecordType()) { 918 if (r->hasConstFields()) 919 return MLV_ConstQualified; 920 } 921 922 // Assigning to an 'implicit' property? 923 else if (isa<ObjCKVCRefExpr>(this)) { 924 const ObjCKVCRefExpr* KVCExpr = cast<ObjCKVCRefExpr>(this); 925 if (KVCExpr->getSetterMethod() == 0) 926 return MLV_NoSetterProperty; 927 } 928 return MLV_Valid; 929 } 930 931 /// hasGlobalStorage - Return true if this expression has static storage 932 /// duration. This means that the address of this expression is a link-time 933 /// constant. 934 bool Expr::hasGlobalStorage() const { 935 switch (getStmtClass()) { 936 default: 937 return false; 938 case BlockExprClass: 939 return true; 940 case ParenExprClass: 941 return cast<ParenExpr>(this)->getSubExpr()->hasGlobalStorage(); 942 case ImplicitCastExprClass: 943 return cast<ImplicitCastExpr>(this)->getSubExpr()->hasGlobalStorage(); 944 case CompoundLiteralExprClass: 945 return cast<CompoundLiteralExpr>(this)->isFileScope(); 946 case DeclRefExprClass: 947 case QualifiedDeclRefExprClass: { 948 const Decl *D = cast<DeclRefExpr>(this)->getDecl(); 949 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 950 return VD->hasGlobalStorage(); 951 if (isa<FunctionDecl>(D)) 952 return true; 953 return false; 954 } 955 case MemberExprClass: { 956 const MemberExpr *M = cast<MemberExpr>(this); 957 return !M->isArrow() && M->getBase()->hasGlobalStorage(); 958 } 959 case ArraySubscriptExprClass: 960 return cast<ArraySubscriptExpr>(this)->getBase()->hasGlobalStorage(); 961 case PredefinedExprClass: 962 return true; 963 case CXXDefaultArgExprClass: 964 return cast<CXXDefaultArgExpr>(this)->getExpr()->hasGlobalStorage(); 965 } 966 } 967 968 /// isOBJCGCCandidate - Check if an expression is objc gc'able. 969 /// 970 bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const { 971 switch (getStmtClass()) { 972 default: 973 return false; 974 case ObjCIvarRefExprClass: 975 return true; 976 case Expr::UnaryOperatorClass: 977 return cast<UnaryOperator>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 978 case ParenExprClass: 979 return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 980 case ImplicitCastExprClass: 981 return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 982 case CStyleCastExprClass: 983 return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx); 984 case DeclRefExprClass: 985 case QualifiedDeclRefExprClass: { 986 const Decl *D = cast<DeclRefExpr>(this)->getDecl(); 987 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 988 if (VD->hasGlobalStorage()) 989 return true; 990 QualType T = VD->getType(); 991 // dereferencing to an object pointer is always a gc'able candidate 992 if (T->isPointerType() && 993 Ctx.isObjCObjectPointerType(T->getAsPointerType()->getPointeeType())) 994 return true; 995 996 } 997 return false; 998 } 999 case MemberExprClass: { 1000 const MemberExpr *M = cast<MemberExpr>(this); 1001 return M->getBase()->isOBJCGCCandidate(Ctx); 1002 } 1003 case ArraySubscriptExprClass: 1004 return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(Ctx); 1005 } 1006 } 1007 Expr* Expr::IgnoreParens() { 1008 Expr* E = this; 1009 while (ParenExpr* P = dyn_cast<ParenExpr>(E)) 1010 E = P->getSubExpr(); 1011 1012 return E; 1013 } 1014 1015 /// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 1016 /// or CastExprs or ImplicitCastExprs, returning their operand. 1017 Expr *Expr::IgnoreParenCasts() { 1018 Expr *E = this; 1019 while (true) { 1020 if (ParenExpr *P = dyn_cast<ParenExpr>(E)) 1021 E = P->getSubExpr(); 1022 else if (CastExpr *P = dyn_cast<CastExpr>(E)) 1023 E = P->getSubExpr(); 1024 else 1025 return E; 1026 } 1027 } 1028 1029 /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 1030 /// value (including ptr->int casts of the same size). Strip off any 1031 /// ParenExpr or CastExprs, returning their operand. 1032 Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) { 1033 Expr *E = this; 1034 while (true) { 1035 if (ParenExpr *P = dyn_cast<ParenExpr>(E)) { 1036 E = P->getSubExpr(); 1037 continue; 1038 } 1039 1040 if (CastExpr *P = dyn_cast<CastExpr>(E)) { 1041 // We ignore integer <-> casts that are of the same width, ptr<->ptr and 1042 // ptr<->int casts of the same width. We also ignore all identify casts. 1043 Expr *SE = P->getSubExpr(); 1044 1045 if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) { 1046 E = SE; 1047 continue; 1048 } 1049 1050 if ((E->getType()->isPointerType() || E->getType()->isIntegralType()) && 1051 (SE->getType()->isPointerType() || SE->getType()->isIntegralType()) && 1052 Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) { 1053 E = SE; 1054 continue; 1055 } 1056 } 1057 1058 return E; 1059 } 1060 } 1061 1062 1063 /// hasAnyTypeDependentArguments - Determines if any of the expressions 1064 /// in Exprs is type-dependent. 1065 bool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) { 1066 for (unsigned I = 0; I < NumExprs; ++I) 1067 if (Exprs[I]->isTypeDependent()) 1068 return true; 1069 1070 return false; 1071 } 1072 1073 /// hasAnyValueDependentArguments - Determines if any of the expressions 1074 /// in Exprs is value-dependent. 1075 bool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) { 1076 for (unsigned I = 0; I < NumExprs; ++I) 1077 if (Exprs[I]->isValueDependent()) 1078 return true; 1079 1080 return false; 1081 } 1082 1083 bool Expr::isConstantInitializer(ASTContext &Ctx) const { 1084 // This function is attempting whether an expression is an initializer 1085 // which can be evaluated at compile-time. isEvaluatable handles most 1086 // of the cases, but it can't deal with some initializer-specific 1087 // expressions, and it can't deal with aggregates; we deal with those here, 1088 // and fall back to isEvaluatable for the other cases. 1089 1090 // FIXME: This function assumes the variable being assigned to 1091 // isn't a reference type! 1092 1093 switch (getStmtClass()) { 1094 default: break; 1095 case StringLiteralClass: 1096 case ObjCEncodeExprClass: 1097 return true; 1098 case CompoundLiteralExprClass: { 1099 // This handles gcc's extension that allows global initializers like 1100 // "struct x {int x;} x = (struct x) {};". 1101 // FIXME: This accepts other cases it shouldn't! 1102 const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer(); 1103 return Exp->isConstantInitializer(Ctx); 1104 } 1105 case InitListExprClass: { 1106 // FIXME: This doesn't deal with fields with reference types correctly. 1107 // FIXME: This incorrectly allows pointers cast to integers to be assigned 1108 // to bitfields. 1109 const InitListExpr *Exp = cast<InitListExpr>(this); 1110 unsigned numInits = Exp->getNumInits(); 1111 for (unsigned i = 0; i < numInits; i++) { 1112 if (!Exp->getInit(i)->isConstantInitializer(Ctx)) 1113 return false; 1114 } 1115 return true; 1116 } 1117 case ImplicitValueInitExprClass: 1118 return true; 1119 case ParenExprClass: { 1120 return cast<ParenExpr>(this)->getSubExpr()->isConstantInitializer(Ctx); 1121 } 1122 case UnaryOperatorClass: { 1123 const UnaryOperator* Exp = cast<UnaryOperator>(this); 1124 if (Exp->getOpcode() == UnaryOperator::Extension) 1125 return Exp->getSubExpr()->isConstantInitializer(Ctx); 1126 break; 1127 } 1128 case ImplicitCastExprClass: 1129 case CStyleCastExprClass: 1130 // Handle casts with a destination that's a struct or union; this 1131 // deals with both the gcc no-op struct cast extension and the 1132 // cast-to-union extension. 1133 if (getType()->isRecordType()) 1134 return cast<CastExpr>(this)->getSubExpr()->isConstantInitializer(Ctx); 1135 break; 1136 } 1137 1138 return isEvaluatable(Ctx); 1139 } 1140 1141 /// isIntegerConstantExpr - this recursive routine will test if an expression is 1142 /// an integer constant expression. 1143 1144 /// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero, 1145 /// comma, etc 1146 /// 1147 /// FIXME: Handle offsetof. Two things to do: Handle GCC's __builtin_offsetof 1148 /// to support gcc 4.0+ and handle the idiom GCC recognizes with a null pointer 1149 /// cast+dereference. 1150 1151 // CheckICE - This function does the fundamental ICE checking: the returned 1152 // ICEDiag contains a Val of 0, 1, or 2, and a possibly null SourceLocation. 1153 // Note that to reduce code duplication, this helper does no evaluation 1154 // itself; the caller checks whether the expression is evaluatable, and 1155 // in the rare cases where CheckICE actually cares about the evaluated 1156 // value, it calls into Evalute. 1157 // 1158 // Meanings of Val: 1159 // 0: This expression is an ICE if it can be evaluated by Evaluate. 1160 // 1: This expression is not an ICE, but if it isn't evaluated, it's 1161 // a legal subexpression for an ICE. This return value is used to handle 1162 // the comma operator in C99 mode. 1163 // 2: This expression is not an ICE, and is not a legal subexpression for one. 1164 1165 struct ICEDiag { 1166 unsigned Val; 1167 SourceLocation Loc; 1168 1169 public: 1170 ICEDiag(unsigned v, SourceLocation l) : Val(v), Loc(l) {} 1171 ICEDiag() : Val(0) {} 1172 }; 1173 1174 ICEDiag NoDiag() { return ICEDiag(); } 1175 1176 static ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) { 1177 Expr::EvalResult EVResult; 1178 if (!E->Evaluate(EVResult, Ctx) || EVResult.HasSideEffects || 1179 !EVResult.Val.isInt()) { 1180 return ICEDiag(2, E->getLocStart()); 1181 } 1182 return NoDiag(); 1183 } 1184 1185 static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { 1186 assert(!E->isValueDependent() && "Should not see value dependent exprs!"); 1187 if (!E->getType()->isIntegralType()) { 1188 return ICEDiag(2, E->getLocStart()); 1189 } 1190 1191 switch (E->getStmtClass()) { 1192 default: 1193 return ICEDiag(2, E->getLocStart()); 1194 case Expr::ParenExprClass: 1195 return CheckICE(cast<ParenExpr>(E)->getSubExpr(), Ctx); 1196 case Expr::IntegerLiteralClass: 1197 case Expr::CharacterLiteralClass: 1198 case Expr::CXXBoolLiteralExprClass: 1199 case Expr::CXXZeroInitValueExprClass: 1200 case Expr::TypesCompatibleExprClass: 1201 case Expr::UnaryTypeTraitExprClass: 1202 return NoDiag(); 1203 case Expr::CallExprClass: 1204 case Expr::CXXOperatorCallExprClass: { 1205 const CallExpr *CE = cast<CallExpr>(E); 1206 if (CE->isBuiltinCall(Ctx)) 1207 return CheckEvalInICE(E, Ctx); 1208 return ICEDiag(2, E->getLocStart()); 1209 } 1210 case Expr::DeclRefExprClass: 1211 case Expr::QualifiedDeclRefExprClass: 1212 if (isa<EnumConstantDecl>(cast<DeclRefExpr>(E)->getDecl())) 1213 return NoDiag(); 1214 if (Ctx.getLangOptions().CPlusPlus && 1215 E->getType().getCVRQualifiers() == QualType::Const) { 1216 // C++ 7.1.5.1p2 1217 // A variable of non-volatile const-qualified integral or enumeration 1218 // type initialized by an ICE can be used in ICEs. 1219 if (const VarDecl *Dcl = 1220 dyn_cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl())) { 1221 if (Dcl->isInitKnownICE()) { 1222 // We have already checked whether this subexpression is an 1223 // integral constant expression. 1224 if (Dcl->isInitICE()) 1225 return NoDiag(); 1226 else 1227 return ICEDiag(2, E->getLocStart()); 1228 } 1229 1230 if (const Expr *Init = Dcl->getInit()) { 1231 ICEDiag Result = CheckICE(Init, Ctx); 1232 // Cache the result of the ICE test. 1233 Dcl->setInitKnownICE(Ctx, Result.Val == 0); 1234 return Result; 1235 } 1236 } 1237 } 1238 return ICEDiag(2, E->getLocStart()); 1239 case Expr::UnaryOperatorClass: { 1240 const UnaryOperator *Exp = cast<UnaryOperator>(E); 1241 switch (Exp->getOpcode()) { 1242 default: 1243 return ICEDiag(2, E->getLocStart()); 1244 case UnaryOperator::Extension: 1245 case UnaryOperator::LNot: 1246 case UnaryOperator::Plus: 1247 case UnaryOperator::Minus: 1248 case UnaryOperator::Not: 1249 case UnaryOperator::Real: 1250 case UnaryOperator::Imag: 1251 return CheckICE(Exp->getSubExpr(), Ctx); 1252 case UnaryOperator::OffsetOf: 1253 // Note that per C99, offsetof must be an ICE. And AFAIK, using 1254 // Evaluate matches the proposed gcc behavior for cases like 1255 // "offsetof(struct s{int x[4];}, x[!.0])". This doesn't affect 1256 // compliance: we should warn earlier for offsetof expressions with 1257 // array subscripts that aren't ICEs, and if the array subscripts 1258 // are ICEs, the value of the offsetof must be an integer constant. 1259 return CheckEvalInICE(E, Ctx); 1260 } 1261 } 1262 case Expr::SizeOfAlignOfExprClass: { 1263 const SizeOfAlignOfExpr *Exp = cast<SizeOfAlignOfExpr>(E); 1264 if (Exp->isSizeOf() && Exp->getTypeOfArgument()->isVariableArrayType()) 1265 return ICEDiag(2, E->getLocStart()); 1266 return NoDiag(); 1267 } 1268 case Expr::BinaryOperatorClass: { 1269 const BinaryOperator *Exp = cast<BinaryOperator>(E); 1270 switch (Exp->getOpcode()) { 1271 default: 1272 return ICEDiag(2, E->getLocStart()); 1273 case BinaryOperator::Mul: 1274 case BinaryOperator::Div: 1275 case BinaryOperator::Rem: 1276 case BinaryOperator::Add: 1277 case BinaryOperator::Sub: 1278 case BinaryOperator::Shl: 1279 case BinaryOperator::Shr: 1280 case BinaryOperator::LT: 1281 case BinaryOperator::GT: 1282 case BinaryOperator::LE: 1283 case BinaryOperator::GE: 1284 case BinaryOperator::EQ: 1285 case BinaryOperator::NE: 1286 case BinaryOperator::And: 1287 case BinaryOperator::Xor: 1288 case BinaryOperator::Or: 1289 case BinaryOperator::Comma: { 1290 ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 1291 ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 1292 if (Exp->getOpcode() == BinaryOperator::Div || 1293 Exp->getOpcode() == BinaryOperator::Rem) { 1294 // Evaluate gives an error for undefined Div/Rem, so make sure 1295 // we don't evaluate one. 1296 if (LHSResult.Val != 2 && RHSResult.Val != 2) { 1297 llvm::APSInt REval = Exp->getRHS()->EvaluateAsInt(Ctx); 1298 if (REval == 0) 1299 return ICEDiag(1, E->getLocStart()); 1300 if (REval.isSigned() && REval.isAllOnesValue()) { 1301 llvm::APSInt LEval = Exp->getLHS()->EvaluateAsInt(Ctx); 1302 if (LEval.isMinSignedValue()) 1303 return ICEDiag(1, E->getLocStart()); 1304 } 1305 } 1306 } 1307 if (Exp->getOpcode() == BinaryOperator::Comma) { 1308 if (Ctx.getLangOptions().C99) { 1309 // C99 6.6p3 introduces a strange edge case: comma can be in an ICE 1310 // if it isn't evaluated. 1311 if (LHSResult.Val == 0 && RHSResult.Val == 0) 1312 return ICEDiag(1, E->getLocStart()); 1313 } else { 1314 // In both C89 and C++, commas in ICEs are illegal. 1315 return ICEDiag(2, E->getLocStart()); 1316 } 1317 } 1318 if (LHSResult.Val >= RHSResult.Val) 1319 return LHSResult; 1320 return RHSResult; 1321 } 1322 case BinaryOperator::LAnd: 1323 case BinaryOperator::LOr: { 1324 ICEDiag LHSResult = CheckICE(Exp->getLHS(), Ctx); 1325 ICEDiag RHSResult = CheckICE(Exp->getRHS(), Ctx); 1326 if (LHSResult.Val == 0 && RHSResult.Val == 1) { 1327 // Rare case where the RHS has a comma "side-effect"; we need 1328 // to actually check the condition to see whether the side 1329 // with the comma is evaluated. 1330 if ((Exp->getOpcode() == BinaryOperator::LAnd) != 1331 (Exp->getLHS()->EvaluateAsInt(Ctx) == 0)) 1332 return RHSResult; 1333 return NoDiag(); 1334 } 1335 1336 if (LHSResult.Val >= RHSResult.Val) 1337 return LHSResult; 1338 return RHSResult; 1339 } 1340 } 1341 } 1342 case Expr::ImplicitCastExprClass: 1343 case Expr::CStyleCastExprClass: 1344 case Expr::CXXFunctionalCastExprClass: { 1345 const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr(); 1346 if (SubExpr->getType()->isIntegralType()) 1347 return CheckICE(SubExpr, Ctx); 1348 if (isa<FloatingLiteral>(SubExpr->IgnoreParens())) 1349 return NoDiag(); 1350 return ICEDiag(2, E->getLocStart()); 1351 } 1352 case Expr::ConditionalOperatorClass: { 1353 const ConditionalOperator *Exp = cast<ConditionalOperator>(E); 1354 // If the condition (ignoring parens) is a __builtin_constant_p call, 1355 // then only the true side is actually considered in an integer constant 1356 // expression, and it is fully evaluated. This is an important GNU 1357 // extension. See GCC PR38377 for discussion. 1358 if (const CallExpr *CallCE = dyn_cast<CallExpr>(Exp->getCond()->IgnoreParenCasts())) 1359 if (CallCE->isBuiltinCall(Ctx) == Builtin::BI__builtin_constant_p) { 1360 Expr::EvalResult EVResult; 1361 if (!E->Evaluate(EVResult, Ctx) || EVResult.HasSideEffects || 1362 !EVResult.Val.isInt()) { 1363 return ICEDiag(2, E->getLocStart()); 1364 } 1365 return NoDiag(); 1366 } 1367 ICEDiag CondResult = CheckICE(Exp->getCond(), Ctx); 1368 ICEDiag TrueResult = CheckICE(Exp->getTrueExpr(), Ctx); 1369 ICEDiag FalseResult = CheckICE(Exp->getFalseExpr(), Ctx); 1370 if (CondResult.Val == 2) 1371 return CondResult; 1372 if (TrueResult.Val == 2) 1373 return TrueResult; 1374 if (FalseResult.Val == 2) 1375 return FalseResult; 1376 if (CondResult.Val == 1) 1377 return CondResult; 1378 if (TrueResult.Val == 0 && FalseResult.Val == 0) 1379 return NoDiag(); 1380 // Rare case where the diagnostics depend on which side is evaluated 1381 // Note that if we get here, CondResult is 0, and at least one of 1382 // TrueResult and FalseResult is non-zero. 1383 if (Exp->getCond()->EvaluateAsInt(Ctx) == 0) { 1384 return FalseResult; 1385 } 1386 return TrueResult; 1387 } 1388 case Expr::CXXDefaultArgExprClass: 1389 return CheckICE(cast<CXXDefaultArgExpr>(E)->getExpr(), Ctx); 1390 case Expr::ChooseExprClass: { 1391 return CheckICE(cast<ChooseExpr>(E)->getChosenSubExpr(Ctx), Ctx); 1392 } 1393 } 1394 } 1395 1396 bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 1397 SourceLocation *Loc, bool isEvaluated) const { 1398 ICEDiag d = CheckICE(this, Ctx); 1399 if (d.Val != 0) { 1400 if (Loc) *Loc = d.Loc; 1401 return false; 1402 } 1403 EvalResult EvalResult; 1404 if (!Evaluate(EvalResult, Ctx)) 1405 assert(0 && "ICE cannot be evaluated!"); 1406 assert(!EvalResult.HasSideEffects && "ICE with side effects!"); 1407 assert(EvalResult.Val.isInt() && "ICE that isn't integer!"); 1408 Result = EvalResult.Val.getInt(); 1409 return true; 1410 } 1411 1412 /// isNullPointerConstant - C99 6.3.2.3p3 - Return true if this is either an 1413 /// integer constant expression with the value zero, or if this is one that is 1414 /// cast to void*. 1415 bool Expr::isNullPointerConstant(ASTContext &Ctx) const 1416 { 1417 // Strip off a cast to void*, if it exists. Except in C++. 1418 if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) { 1419 if (!Ctx.getLangOptions().CPlusPlus) { 1420 // Check that it is a cast to void*. 1421 if (const PointerType *PT = CE->getType()->getAsPointerType()) { 1422 QualType Pointee = PT->getPointeeType(); 1423 if (Pointee.getCVRQualifiers() == 0 && 1424 Pointee->isVoidType() && // to void* 1425 CE->getSubExpr()->getType()->isIntegerType()) // from int. 1426 return CE->getSubExpr()->isNullPointerConstant(Ctx); 1427 } 1428 } 1429 } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) { 1430 // Ignore the ImplicitCastExpr type entirely. 1431 return ICE->getSubExpr()->isNullPointerConstant(Ctx); 1432 } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) { 1433 // Accept ((void*)0) as a null pointer constant, as many other 1434 // implementations do. 1435 return PE->getSubExpr()->isNullPointerConstant(Ctx); 1436 } else if (const CXXDefaultArgExpr *DefaultArg 1437 = dyn_cast<CXXDefaultArgExpr>(this)) { 1438 // See through default argument expressions 1439 return DefaultArg->getExpr()->isNullPointerConstant(Ctx); 1440 } else if (isa<GNUNullExpr>(this)) { 1441 // The GNU __null extension is always a null pointer constant. 1442 return true; 1443 } 1444 1445 // C++0x nullptr_t is always a null pointer constant. 1446 if (getType()->isNullPtrType()) 1447 return true; 1448 1449 // This expression must be an integer type. 1450 if (!getType()->isIntegerType()) 1451 return false; 1452 1453 // If we have an integer constant expression, we need to *evaluate* it and 1454 // test for the value 0. 1455 llvm::APSInt Result; 1456 return isIntegerConstantExpr(Result, Ctx) && Result == 0; 1457 } 1458 1459 FieldDecl *Expr::getBitField() { 1460 Expr *E = this->IgnoreParenCasts(); 1461 1462 if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E)) 1463 if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl())) 1464 if (Field->isBitField()) 1465 return Field; 1466 1467 if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) 1468 if (BinOp->isAssignmentOp() && BinOp->getLHS()) 1469 return BinOp->getLHS()->getBitField(); 1470 1471 return 0; 1472 } 1473 1474 /// isArrow - Return true if the base expression is a pointer to vector, 1475 /// return false if the base expression is a vector. 1476 bool ExtVectorElementExpr::isArrow() const { 1477 return getBase()->getType()->isPointerType(); 1478 } 1479 1480 unsigned ExtVectorElementExpr::getNumElements() const { 1481 if (const VectorType *VT = getType()->getAsVectorType()) 1482 return VT->getNumElements(); 1483 return 1; 1484 } 1485 1486 /// containsDuplicateElements - Return true if any element access is repeated. 1487 bool ExtVectorElementExpr::containsDuplicateElements() const { 1488 const char *compStr = Accessor->getName(); 1489 unsigned length = Accessor->getLength(); 1490 1491 // Halving swizzles do not contain duplicate elements. 1492 if (!strcmp(compStr, "hi") || !strcmp(compStr, "lo") || 1493 !strcmp(compStr, "even") || !strcmp(compStr, "odd")) 1494 return false; 1495 1496 // Advance past s-char prefix on hex swizzles. 1497 if (*compStr == 's') { 1498 compStr++; 1499 length--; 1500 } 1501 1502 for (unsigned i = 0; i != length-1; i++) { 1503 const char *s = compStr+i; 1504 for (const char c = *s++; *s; s++) 1505 if (c == *s) 1506 return true; 1507 } 1508 return false; 1509 } 1510 1511 /// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. 1512 void ExtVectorElementExpr::getEncodedElementAccess( 1513 llvm::SmallVectorImpl<unsigned> &Elts) const { 1514 const char *compStr = Accessor->getName(); 1515 if (*compStr == 's') 1516 compStr++; 1517 1518 bool isHi = !strcmp(compStr, "hi"); 1519 bool isLo = !strcmp(compStr, "lo"); 1520 bool isEven = !strcmp(compStr, "even"); 1521 bool isOdd = !strcmp(compStr, "odd"); 1522 1523 for (unsigned i = 0, e = getNumElements(); i != e; ++i) { 1524 uint64_t Index; 1525 1526 if (isHi) 1527 Index = e + i; 1528 else if (isLo) 1529 Index = i; 1530 else if (isEven) 1531 Index = 2 * i; 1532 else if (isOdd) 1533 Index = 2 * i + 1; 1534 else 1535 Index = ExtVectorType::getAccessorIdx(compStr[i]); 1536 1537 Elts.push_back(Index); 1538 } 1539 } 1540 1541 // constructor for instance messages. 1542 ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo, 1543 QualType retType, ObjCMethodDecl *mproto, 1544 SourceLocation LBrac, SourceLocation RBrac, 1545 Expr **ArgExprs, unsigned nargs) 1546 : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 1547 MethodProto(mproto) { 1548 NumArgs = nargs; 1549 SubExprs = new Stmt*[NumArgs+1]; 1550 SubExprs[RECEIVER] = receiver; 1551 if (NumArgs) { 1552 for (unsigned i = 0; i != NumArgs; ++i) 1553 SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]); 1554 } 1555 LBracloc = LBrac; 1556 RBracloc = RBrac; 1557 } 1558 1559 ObjCStringLiteral* ObjCStringLiteral::Clone(ASTContext &C) const { 1560 // Clone the string literal. 1561 StringLiteral *NewString = 1562 String ? cast<StringLiteral>(String)->Clone(C) : 0; 1563 1564 return new (C) ObjCStringLiteral(NewString, getType(), AtLoc); 1565 } 1566 1567 ObjCSelectorExpr *ObjCSelectorExpr::Clone(ASTContext &C) const { 1568 return new (C) ObjCSelectorExpr(getType(), SelName, AtLoc, RParenLoc); 1569 } 1570 1571 ObjCProtocolExpr *ObjCProtocolExpr::Clone(ASTContext &C) const { 1572 return new (C) ObjCProtocolExpr(getType(), Protocol, AtLoc, RParenLoc); 1573 } 1574 1575 // constructor for class messages. 1576 // FIXME: clsName should be typed to ObjCInterfaceType 1577 ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo, 1578 QualType retType, ObjCMethodDecl *mproto, 1579 SourceLocation LBrac, SourceLocation RBrac, 1580 Expr **ArgExprs, unsigned nargs) 1581 : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 1582 MethodProto(mproto) { 1583 NumArgs = nargs; 1584 SubExprs = new Stmt*[NumArgs+1]; 1585 SubExprs[RECEIVER] = (Expr*) ((uintptr_t) clsName | IsClsMethDeclUnknown); 1586 if (NumArgs) { 1587 for (unsigned i = 0; i != NumArgs; ++i) 1588 SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]); 1589 } 1590 LBracloc = LBrac; 1591 RBracloc = RBrac; 1592 } 1593 1594 // constructor for class messages. 1595 ObjCMessageExpr::ObjCMessageExpr(ObjCInterfaceDecl *cls, Selector selInfo, 1596 QualType retType, ObjCMethodDecl *mproto, 1597 SourceLocation LBrac, SourceLocation RBrac, 1598 Expr **ArgExprs, unsigned nargs) 1599 : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 1600 MethodProto(mproto) { 1601 NumArgs = nargs; 1602 SubExprs = new Stmt*[NumArgs+1]; 1603 SubExprs[RECEIVER] = (Expr*) ((uintptr_t) cls | IsClsMethDeclKnown); 1604 if (NumArgs) { 1605 for (unsigned i = 0; i != NumArgs; ++i) 1606 SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]); 1607 } 1608 LBracloc = LBrac; 1609 RBracloc = RBrac; 1610 } 1611 1612 ObjCMessageExpr::ClassInfo ObjCMessageExpr::getClassInfo() const { 1613 uintptr_t x = (uintptr_t) SubExprs[RECEIVER]; 1614 switch (x & Flags) { 1615 default: 1616 assert(false && "Invalid ObjCMessageExpr."); 1617 case IsInstMeth: 1618 return ClassInfo(0, 0); 1619 case IsClsMethDeclUnknown: 1620 return ClassInfo(0, (IdentifierInfo*) (x & ~Flags)); 1621 case IsClsMethDeclKnown: { 1622 ObjCInterfaceDecl* D = (ObjCInterfaceDecl*) (x & ~Flags); 1623 return ClassInfo(D, D->getIdentifier()); 1624 } 1625 } 1626 } 1627 1628 void ObjCMessageExpr::setClassInfo(const ObjCMessageExpr::ClassInfo &CI) { 1629 if (CI.first == 0 && CI.second == 0) 1630 SubExprs[RECEIVER] = (Expr*)((uintptr_t)0 | IsInstMeth); 1631 else if (CI.first == 0) 1632 SubExprs[RECEIVER] = (Expr*)((uintptr_t)CI.second | IsClsMethDeclUnknown); 1633 else 1634 SubExprs[RECEIVER] = (Expr*)((uintptr_t)CI.first | IsClsMethDeclKnown); 1635 } 1636 1637 1638 bool ChooseExpr::isConditionTrue(ASTContext &C) const { 1639 return getCond()->EvaluateAsInt(C) != 0; 1640 } 1641 1642 void ShuffleVectorExpr::setExprs(Expr ** Exprs, unsigned NumExprs) { 1643 if (NumExprs) 1644 delete [] SubExprs; 1645 1646 SubExprs = new Stmt* [NumExprs]; 1647 this->NumExprs = NumExprs; 1648 memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs); 1649 } 1650 1651 void SizeOfAlignOfExpr::Destroy(ASTContext& C) { 1652 // Override default behavior of traversing children. If this has a type 1653 // operand and the type is a variable-length array, the child iteration 1654 // will iterate over the size expression. However, this expression belongs 1655 // to the type, not to this, so we don't want to delete it. 1656 // We still want to delete this expression. 1657 if (isArgumentType()) { 1658 this->~SizeOfAlignOfExpr(); 1659 C.Deallocate(this); 1660 } 1661 else 1662 Expr::Destroy(C); 1663 } 1664 1665 //===----------------------------------------------------------------------===// 1666 // DesignatedInitExpr 1667 //===----------------------------------------------------------------------===// 1668 1669 IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() { 1670 assert(Kind == FieldDesignator && "Only valid on a field designator"); 1671 if (Field.NameOrField & 0x01) 1672 return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01); 1673 else 1674 return getField()->getIdentifier(); 1675 } 1676 1677 DesignatedInitExpr::DesignatedInitExpr(QualType Ty, unsigned NumDesignators, 1678 const Designator *Designators, 1679 SourceLocation EqualOrColonLoc, 1680 bool GNUSyntax, 1681 Expr **IndexExprs, 1682 unsigned NumIndexExprs, 1683 Expr *Init) 1684 : Expr(DesignatedInitExprClass, Ty, 1685 Init->isTypeDependent(), Init->isValueDependent()), 1686 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax), 1687 NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) { 1688 this->Designators = new Designator[NumDesignators]; 1689 1690 // Record the initializer itself. 1691 child_iterator Child = child_begin(); 1692 *Child++ = Init; 1693 1694 // Copy the designators and their subexpressions, computing 1695 // value-dependence along the way. 1696 unsigned IndexIdx = 0; 1697 for (unsigned I = 0; I != NumDesignators; ++I) { 1698 this->Designators[I] = Designators[I]; 1699 1700 if (this->Designators[I].isArrayDesignator()) { 1701 // Compute type- and value-dependence. 1702 Expr *Index = IndexExprs[IndexIdx]; 1703 ValueDependent = ValueDependent || 1704 Index->isTypeDependent() || Index->isValueDependent(); 1705 1706 // Copy the index expressions into permanent storage. 1707 *Child++ = IndexExprs[IndexIdx++]; 1708 } else if (this->Designators[I].isArrayRangeDesignator()) { 1709 // Compute type- and value-dependence. 1710 Expr *Start = IndexExprs[IndexIdx]; 1711 Expr *End = IndexExprs[IndexIdx + 1]; 1712 ValueDependent = ValueDependent || 1713 Start->isTypeDependent() || Start->isValueDependent() || 1714 End->isTypeDependent() || End->isValueDependent(); 1715 1716 // Copy the start/end expressions into permanent storage. 1717 *Child++ = IndexExprs[IndexIdx++]; 1718 *Child++ = IndexExprs[IndexIdx++]; 1719 } 1720 } 1721 1722 assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions"); 1723 } 1724 1725 DesignatedInitExpr * 1726 DesignatedInitExpr::Create(ASTContext &C, Designator *Designators, 1727 unsigned NumDesignators, 1728 Expr **IndexExprs, unsigned NumIndexExprs, 1729 SourceLocation ColonOrEqualLoc, 1730 bool UsesColonSyntax, Expr *Init) { 1731 void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 1732 sizeof(Stmt *) * (NumIndexExprs + 1), 8); 1733 return new (Mem) DesignatedInitExpr(C.VoidTy, NumDesignators, Designators, 1734 ColonOrEqualLoc, UsesColonSyntax, 1735 IndexExprs, NumIndexExprs, Init); 1736 } 1737 1738 DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C, 1739 unsigned NumIndexExprs) { 1740 void *Mem = C.Allocate(sizeof(DesignatedInitExpr) + 1741 sizeof(Stmt *) * (NumIndexExprs + 1), 8); 1742 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1); 1743 } 1744 1745 void DesignatedInitExpr::setDesignators(const Designator *Desigs, 1746 unsigned NumDesigs) { 1747 if (Designators) 1748 delete [] Designators; 1749 1750 Designators = new Designator[NumDesigs]; 1751 NumDesignators = NumDesigs; 1752 for (unsigned I = 0; I != NumDesigs; ++I) 1753 Designators[I] = Desigs[I]; 1754 } 1755 1756 SourceRange DesignatedInitExpr::getSourceRange() const { 1757 SourceLocation StartLoc; 1758 Designator &First = 1759 *const_cast<DesignatedInitExpr*>(this)->designators_begin(); 1760 if (First.isFieldDesignator()) { 1761 if (GNUSyntax) 1762 StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc); 1763 else 1764 StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc); 1765 } else 1766 StartLoc = 1767 SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc); 1768 return SourceRange(StartLoc, getInit()->getSourceRange().getEnd()); 1769 } 1770 1771 Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) { 1772 assert(D.Kind == Designator::ArrayDesignator && "Requires array designator"); 1773 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 1774 Ptr += sizeof(DesignatedInitExpr); 1775 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 1776 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 1777 } 1778 1779 Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) { 1780 assert(D.Kind == Designator::ArrayRangeDesignator && 1781 "Requires array range designator"); 1782 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 1783 Ptr += sizeof(DesignatedInitExpr); 1784 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 1785 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); 1786 } 1787 1788 Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) { 1789 assert(D.Kind == Designator::ArrayRangeDesignator && 1790 "Requires array range designator"); 1791 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 1792 Ptr += sizeof(DesignatedInitExpr); 1793 Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 1794 return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2)); 1795 } 1796 1797 /// \brief Replaces the designator at index @p Idx with the series 1798 /// of designators in [First, Last). 1799 void DesignatedInitExpr::ExpandDesignator(unsigned Idx, 1800 const Designator *First, 1801 const Designator *Last) { 1802 unsigned NumNewDesignators = Last - First; 1803 if (NumNewDesignators == 0) { 1804 std::copy_backward(Designators + Idx + 1, 1805 Designators + NumDesignators, 1806 Designators + Idx); 1807 --NumNewDesignators; 1808 return; 1809 } else if (NumNewDesignators == 1) { 1810 Designators[Idx] = *First; 1811 return; 1812 } 1813 1814 Designator *NewDesignators 1815 = new Designator[NumDesignators - 1 + NumNewDesignators]; 1816 std::copy(Designators, Designators + Idx, NewDesignators); 1817 std::copy(First, Last, NewDesignators + Idx); 1818 std::copy(Designators + Idx + 1, Designators + NumDesignators, 1819 NewDesignators + Idx + NumNewDesignators); 1820 delete [] Designators; 1821 Designators = NewDesignators; 1822 NumDesignators = NumDesignators - 1 + NumNewDesignators; 1823 } 1824 1825 void DesignatedInitExpr::Destroy(ASTContext &C) { 1826 delete [] Designators; 1827 Expr::Destroy(C); 1828 } 1829 1830 ImplicitValueInitExpr *ImplicitValueInitExpr::Clone(ASTContext &C) const { 1831 return new (C) ImplicitValueInitExpr(getType()); 1832 } 1833 1834 //===----------------------------------------------------------------------===// 1835 // ExprIterator. 1836 //===----------------------------------------------------------------------===// 1837 1838 Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); } 1839 Expr* ExprIterator::operator*() const { return cast<Expr>(*I); } 1840 Expr* ExprIterator::operator->() const { return cast<Expr>(*I); } 1841 const Expr* ConstExprIterator::operator[](size_t idx) const { 1842 return cast<Expr>(I[idx]); 1843 } 1844 const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); } 1845 const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); } 1846 1847 //===----------------------------------------------------------------------===// 1848 // Child Iterators for iterating over subexpressions/substatements 1849 //===----------------------------------------------------------------------===// 1850 1851 // DeclRefExpr 1852 Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); } 1853 Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); } 1854 1855 // ObjCIvarRefExpr 1856 Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; } 1857 Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; } 1858 1859 // ObjCPropertyRefExpr 1860 Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; } 1861 Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; } 1862 1863 // ObjCKVCRefExpr 1864 Stmt::child_iterator ObjCKVCRefExpr::child_begin() { return &Base; } 1865 Stmt::child_iterator ObjCKVCRefExpr::child_end() { return &Base+1; } 1866 1867 // ObjCSuperExpr 1868 Stmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); } 1869 Stmt::child_iterator ObjCSuperExpr::child_end() { return child_iterator(); } 1870 1871 // PredefinedExpr 1872 Stmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); } 1873 Stmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); } 1874 1875 // IntegerLiteral 1876 Stmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); } 1877 Stmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); } 1878 1879 // CharacterLiteral 1880 Stmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();} 1881 Stmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); } 1882 1883 // FloatingLiteral 1884 Stmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); } 1885 Stmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); } 1886 1887 // ImaginaryLiteral 1888 Stmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; } 1889 Stmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; } 1890 1891 // StringLiteral 1892 Stmt::child_iterator StringLiteral::child_begin() { return child_iterator(); } 1893 Stmt::child_iterator StringLiteral::child_end() { return child_iterator(); } 1894 1895 // ParenExpr 1896 Stmt::child_iterator ParenExpr::child_begin() { return &Val; } 1897 Stmt::child_iterator ParenExpr::child_end() { return &Val+1; } 1898 1899 // UnaryOperator 1900 Stmt::child_iterator UnaryOperator::child_begin() { return &Val; } 1901 Stmt::child_iterator UnaryOperator::child_end() { return &Val+1; } 1902 1903 // SizeOfAlignOfExpr 1904 Stmt::child_iterator SizeOfAlignOfExpr::child_begin() { 1905 // If this is of a type and the type is a VLA type (and not a typedef), the 1906 // size expression of the VLA needs to be treated as an executable expression. 1907 // Why isn't this weirdness documented better in StmtIterator? 1908 if (isArgumentType()) { 1909 if (VariableArrayType* T = dyn_cast<VariableArrayType>( 1910 getArgumentType().getTypePtr())) 1911 return child_iterator(T); 1912 return child_iterator(); 1913 } 1914 return child_iterator(&Argument.Ex); 1915 } 1916 Stmt::child_iterator SizeOfAlignOfExpr::child_end() { 1917 if (isArgumentType()) 1918 return child_iterator(); 1919 return child_iterator(&Argument.Ex + 1); 1920 } 1921 1922 // ArraySubscriptExpr 1923 Stmt::child_iterator ArraySubscriptExpr::child_begin() { 1924 return &SubExprs[0]; 1925 } 1926 Stmt::child_iterator ArraySubscriptExpr::child_end() { 1927 return &SubExprs[0]+END_EXPR; 1928 } 1929 1930 // CallExpr 1931 Stmt::child_iterator CallExpr::child_begin() { 1932 return &SubExprs[0]; 1933 } 1934 Stmt::child_iterator CallExpr::child_end() { 1935 return &SubExprs[0]+NumArgs+ARGS_START; 1936 } 1937 1938 // MemberExpr 1939 Stmt::child_iterator MemberExpr::child_begin() { return &Base; } 1940 Stmt::child_iterator MemberExpr::child_end() { return &Base+1; } 1941 1942 // ExtVectorElementExpr 1943 Stmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; } 1944 Stmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; } 1945 1946 // CompoundLiteralExpr 1947 Stmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; } 1948 Stmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; } 1949 1950 // CastExpr 1951 Stmt::child_iterator CastExpr::child_begin() { return &Op; } 1952 Stmt::child_iterator CastExpr::child_end() { return &Op+1; } 1953 1954 // BinaryOperator 1955 Stmt::child_iterator BinaryOperator::child_begin() { 1956 return &SubExprs[0]; 1957 } 1958 Stmt::child_iterator BinaryOperator::child_end() { 1959 return &SubExprs[0]+END_EXPR; 1960 } 1961 1962 // ConditionalOperator 1963 Stmt::child_iterator ConditionalOperator::child_begin() { 1964 return &SubExprs[0]; 1965 } 1966 Stmt::child_iterator ConditionalOperator::child_end() { 1967 return &SubExprs[0]+END_EXPR; 1968 } 1969 1970 // AddrLabelExpr 1971 Stmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); } 1972 Stmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); } 1973 1974 // StmtExpr 1975 Stmt::child_iterator StmtExpr::child_begin() { return &SubStmt; } 1976 Stmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; } 1977 1978 // TypesCompatibleExpr 1979 Stmt::child_iterator TypesCompatibleExpr::child_begin() { 1980 return child_iterator(); 1981 } 1982 1983 Stmt::child_iterator TypesCompatibleExpr::child_end() { 1984 return child_iterator(); 1985 } 1986 1987 // ChooseExpr 1988 Stmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; } 1989 Stmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; } 1990 1991 // GNUNullExpr 1992 Stmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); } 1993 Stmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); } 1994 1995 // ShuffleVectorExpr 1996 Stmt::child_iterator ShuffleVectorExpr::child_begin() { 1997 return &SubExprs[0]; 1998 } 1999 Stmt::child_iterator ShuffleVectorExpr::child_end() { 2000 return &SubExprs[0]+NumExprs; 2001 } 2002 2003 // VAArgExpr 2004 Stmt::child_iterator VAArgExpr::child_begin() { return &Val; } 2005 Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; } 2006 2007 // InitListExpr 2008 Stmt::child_iterator InitListExpr::child_begin() { 2009 return InitExprs.size() ? &InitExprs[0] : 0; 2010 } 2011 Stmt::child_iterator InitListExpr::child_end() { 2012 return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0; 2013 } 2014 2015 // DesignatedInitExpr 2016 Stmt::child_iterator DesignatedInitExpr::child_begin() { 2017 char* Ptr = static_cast<char*>(static_cast<void *>(this)); 2018 Ptr += sizeof(DesignatedInitExpr); 2019 return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); 2020 } 2021 Stmt::child_iterator DesignatedInitExpr::child_end() { 2022 return child_iterator(&*child_begin() + NumSubExprs); 2023 } 2024 2025 // ImplicitValueInitExpr 2026 Stmt::child_iterator ImplicitValueInitExpr::child_begin() { 2027 return child_iterator(); 2028 } 2029 2030 Stmt::child_iterator ImplicitValueInitExpr::child_end() { 2031 return child_iterator(); 2032 } 2033 2034 // ObjCStringLiteral 2035 Stmt::child_iterator ObjCStringLiteral::child_begin() { 2036 return &String; 2037 } 2038 Stmt::child_iterator ObjCStringLiteral::child_end() { 2039 return &String+1; 2040 } 2041 2042 // ObjCEncodeExpr 2043 Stmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); } 2044 Stmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); } 2045 2046 // ObjCSelectorExpr 2047 Stmt::child_iterator ObjCSelectorExpr::child_begin() { 2048 return child_iterator(); 2049 } 2050 Stmt::child_iterator ObjCSelectorExpr::child_end() { 2051 return child_iterator(); 2052 } 2053 2054 // ObjCProtocolExpr 2055 Stmt::child_iterator ObjCProtocolExpr::child_begin() { 2056 return child_iterator(); 2057 } 2058 Stmt::child_iterator ObjCProtocolExpr::child_end() { 2059 return child_iterator(); 2060 } 2061 2062 // ObjCMessageExpr 2063 Stmt::child_iterator ObjCMessageExpr::child_begin() { 2064 return getReceiver() ? &SubExprs[0] : &SubExprs[0] + ARGS_START; 2065 } 2066 Stmt::child_iterator ObjCMessageExpr::child_end() { 2067 return &SubExprs[0]+ARGS_START+getNumArgs(); 2068 } 2069 2070 // Blocks 2071 Stmt::child_iterator BlockExpr::child_begin() { return child_iterator(); } 2072 Stmt::child_iterator BlockExpr::child_end() { return child_iterator(); } 2073 2074 Stmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();} 2075 Stmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); } 2076