1 //===--- SemaExprCXX.cpp - Semantic Analysis for Expressions --------------===// 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 semantic analysis for C++ expressions. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Sema/SemaInternal.h" 15 #include "clang/Sema/DeclSpec.h" 16 #include "clang/Sema/Initialization.h" 17 #include "clang/Sema/Lookup.h" 18 #include "clang/Sema/ParsedTemplate.h" 19 #include "clang/Sema/ScopeInfo.h" 20 #include "clang/Sema/Scope.h" 21 #include "clang/Sema/TemplateDeduction.h" 22 #include "clang/AST/ASTContext.h" 23 #include "clang/AST/CXXInheritance.h" 24 #include "clang/AST/DeclObjC.h" 25 #include "clang/AST/ExprCXX.h" 26 #include "clang/AST/ExprObjC.h" 27 #include "clang/AST/TypeLoc.h" 28 #include "clang/Basic/PartialDiagnostic.h" 29 #include "clang/Basic/TargetInfo.h" 30 #include "clang/Lex/Preprocessor.h" 31 #include "llvm/ADT/STLExtras.h" 32 #include "llvm/Support/ErrorHandling.h" 33 using namespace clang; 34 using namespace sema; 35 36 ParsedType Sema::getDestructorName(SourceLocation TildeLoc, 37 IdentifierInfo &II, 38 SourceLocation NameLoc, 39 Scope *S, CXXScopeSpec &SS, 40 ParsedType ObjectTypePtr, 41 bool EnteringContext) { 42 // Determine where to perform name lookup. 43 44 // FIXME: This area of the standard is very messy, and the current 45 // wording is rather unclear about which scopes we search for the 46 // destructor name; see core issues 399 and 555. Issue 399 in 47 // particular shows where the current description of destructor name 48 // lookup is completely out of line with existing practice, e.g., 49 // this appears to be ill-formed: 50 // 51 // namespace N { 52 // template <typename T> struct S { 53 // ~S(); 54 // }; 55 // } 56 // 57 // void f(N::S<int>* s) { 58 // s->N::S<int>::~S(); 59 // } 60 // 61 // See also PR6358 and PR6359. 62 // For this reason, we're currently only doing the C++03 version of this 63 // code; the C++0x version has to wait until we get a proper spec. 64 QualType SearchType; 65 DeclContext *LookupCtx = 0; 66 bool isDependent = false; 67 bool LookInScope = false; 68 69 // If we have an object type, it's because we are in a 70 // pseudo-destructor-expression or a member access expression, and 71 // we know what type we're looking for. 72 if (ObjectTypePtr) 73 SearchType = GetTypeFromParser(ObjectTypePtr); 74 75 if (SS.isSet()) { 76 NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); 77 78 bool AlreadySearched = false; 79 bool LookAtPrefix = true; 80 // C++ [basic.lookup.qual]p6: 81 // If a pseudo-destructor-name (5.2.4) contains a nested-name-specifier, 82 // the type-names are looked up as types in the scope designated by the 83 // nested-name-specifier. In a qualified-id of the form: 84 // 85 // ::[opt] nested-name-specifier ~ class-name 86 // 87 // where the nested-name-specifier designates a namespace scope, and in 88 // a qualified-id of the form: 89 // 90 // ::opt nested-name-specifier class-name :: ~ class-name 91 // 92 // the class-names are looked up as types in the scope designated by 93 // the nested-name-specifier. 94 // 95 // Here, we check the first case (completely) and determine whether the 96 // code below is permitted to look at the prefix of the 97 // nested-name-specifier. 98 DeclContext *DC = computeDeclContext(SS, EnteringContext); 99 if (DC && DC->isFileContext()) { 100 AlreadySearched = true; 101 LookupCtx = DC; 102 isDependent = false; 103 } else if (DC && isa<CXXRecordDecl>(DC)) 104 LookAtPrefix = false; 105 106 // The second case from the C++03 rules quoted further above. 107 NestedNameSpecifier *Prefix = 0; 108 if (AlreadySearched) { 109 // Nothing left to do. 110 } else if (LookAtPrefix && (Prefix = NNS->getPrefix())) { 111 CXXScopeSpec PrefixSS; 112 PrefixSS.Adopt(NestedNameSpecifierLoc(Prefix, SS.location_data())); 113 LookupCtx = computeDeclContext(PrefixSS, EnteringContext); 114 isDependent = isDependentScopeSpecifier(PrefixSS); 115 } else if (ObjectTypePtr) { 116 LookupCtx = computeDeclContext(SearchType); 117 isDependent = SearchType->isDependentType(); 118 } else { 119 LookupCtx = computeDeclContext(SS, EnteringContext); 120 isDependent = LookupCtx && LookupCtx->isDependentContext(); 121 } 122 123 LookInScope = false; 124 } else if (ObjectTypePtr) { 125 // C++ [basic.lookup.classref]p3: 126 // If the unqualified-id is ~type-name, the type-name is looked up 127 // in the context of the entire postfix-expression. If the type T 128 // of the object expression is of a class type C, the type-name is 129 // also looked up in the scope of class C. At least one of the 130 // lookups shall find a name that refers to (possibly 131 // cv-qualified) T. 132 LookupCtx = computeDeclContext(SearchType); 133 isDependent = SearchType->isDependentType(); 134 assert((isDependent || !SearchType->isIncompleteType()) && 135 "Caller should have completed object type"); 136 137 LookInScope = true; 138 } else { 139 // Perform lookup into the current scope (only). 140 LookInScope = true; 141 } 142 143 TypeDecl *NonMatchingTypeDecl = 0; 144 LookupResult Found(*this, &II, NameLoc, LookupOrdinaryName); 145 for (unsigned Step = 0; Step != 2; ++Step) { 146 // Look for the name first in the computed lookup context (if we 147 // have one) and, if that fails to find a match, in the scope (if 148 // we're allowed to look there). 149 Found.clear(); 150 if (Step == 0 && LookupCtx) 151 LookupQualifiedName(Found, LookupCtx); 152 else if (Step == 1 && LookInScope && S) 153 LookupName(Found, S); 154 else 155 continue; 156 157 // FIXME: Should we be suppressing ambiguities here? 158 if (Found.isAmbiguous()) 159 return ParsedType(); 160 161 if (TypeDecl *Type = Found.getAsSingle<TypeDecl>()) { 162 QualType T = Context.getTypeDeclType(Type); 163 164 if (SearchType.isNull() || SearchType->isDependentType() || 165 Context.hasSameUnqualifiedType(T, SearchType)) { 166 // We found our type! 167 168 return ParsedType::make(T); 169 } 170 171 if (!SearchType.isNull()) 172 NonMatchingTypeDecl = Type; 173 } 174 175 // If the name that we found is a class template name, and it is 176 // the same name as the template name in the last part of the 177 // nested-name-specifier (if present) or the object type, then 178 // this is the destructor for that class. 179 // FIXME: This is a workaround until we get real drafting for core 180 // issue 399, for which there isn't even an obvious direction. 181 if (ClassTemplateDecl *Template = Found.getAsSingle<ClassTemplateDecl>()) { 182 QualType MemberOfType; 183 if (SS.isSet()) { 184 if (DeclContext *Ctx = computeDeclContext(SS, EnteringContext)) { 185 // Figure out the type of the context, if it has one. 186 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Ctx)) 187 MemberOfType = Context.getTypeDeclType(Record); 188 } 189 } 190 if (MemberOfType.isNull()) 191 MemberOfType = SearchType; 192 193 if (MemberOfType.isNull()) 194 continue; 195 196 // We're referring into a class template specialization. If the 197 // class template we found is the same as the template being 198 // specialized, we found what we are looking for. 199 if (const RecordType *Record = MemberOfType->getAs<RecordType>()) { 200 if (ClassTemplateSpecializationDecl *Spec 201 = dyn_cast<ClassTemplateSpecializationDecl>(Record->getDecl())) { 202 if (Spec->getSpecializedTemplate()->getCanonicalDecl() == 203 Template->getCanonicalDecl()) 204 return ParsedType::make(MemberOfType); 205 } 206 207 continue; 208 } 209 210 // We're referring to an unresolved class template 211 // specialization. Determine whether we class template we found 212 // is the same as the template being specialized or, if we don't 213 // know which template is being specialized, that it at least 214 // has the same name. 215 if (const TemplateSpecializationType *SpecType 216 = MemberOfType->getAs<TemplateSpecializationType>()) { 217 TemplateName SpecName = SpecType->getTemplateName(); 218 219 // The class template we found is the same template being 220 // specialized. 221 if (TemplateDecl *SpecTemplate = SpecName.getAsTemplateDecl()) { 222 if (SpecTemplate->getCanonicalDecl() == Template->getCanonicalDecl()) 223 return ParsedType::make(MemberOfType); 224 225 continue; 226 } 227 228 // The class template we found has the same name as the 229 // (dependent) template name being specialized. 230 if (DependentTemplateName *DepTemplate 231 = SpecName.getAsDependentTemplateName()) { 232 if (DepTemplate->isIdentifier() && 233 DepTemplate->getIdentifier() == Template->getIdentifier()) 234 return ParsedType::make(MemberOfType); 235 236 continue; 237 } 238 } 239 } 240 } 241 242 if (isDependent) { 243 // We didn't find our type, but that's okay: it's dependent 244 // anyway. 245 246 // FIXME: What if we have no nested-name-specifier? 247 QualType T = CheckTypenameType(ETK_None, SourceLocation(), 248 SS.getWithLocInContext(Context), 249 II, NameLoc); 250 return ParsedType::make(T); 251 } 252 253 if (NonMatchingTypeDecl) { 254 QualType T = Context.getTypeDeclType(NonMatchingTypeDecl); 255 Diag(NameLoc, diag::err_destructor_expr_type_mismatch) 256 << T << SearchType; 257 Diag(NonMatchingTypeDecl->getLocation(), diag::note_destructor_type_here) 258 << T; 259 } else if (ObjectTypePtr) 260 Diag(NameLoc, diag::err_ident_in_dtor_not_a_type) 261 << &II; 262 else 263 Diag(NameLoc, diag::err_destructor_class_name); 264 265 return ParsedType(); 266 } 267 268 /// \brief Build a C++ typeid expression with a type operand. 269 ExprResult Sema::BuildCXXTypeId(QualType TypeInfoType, 270 SourceLocation TypeidLoc, 271 TypeSourceInfo *Operand, 272 SourceLocation RParenLoc) { 273 // C++ [expr.typeid]p4: 274 // The top-level cv-qualifiers of the lvalue expression or the type-id 275 // that is the operand of typeid are always ignored. 276 // If the type of the type-id is a class type or a reference to a class 277 // type, the class shall be completely-defined. 278 Qualifiers Quals; 279 QualType T 280 = Context.getUnqualifiedArrayType(Operand->getType().getNonReferenceType(), 281 Quals); 282 if (T->getAs<RecordType>() && 283 RequireCompleteType(TypeidLoc, T, diag::err_incomplete_typeid)) 284 return ExprError(); 285 286 return Owned(new (Context) CXXTypeidExpr(TypeInfoType.withConst(), 287 Operand, 288 SourceRange(TypeidLoc, RParenLoc))); 289 } 290 291 /// \brief Build a C++ typeid expression with an expression operand. 292 ExprResult Sema::BuildCXXTypeId(QualType TypeInfoType, 293 SourceLocation TypeidLoc, 294 Expr *E, 295 SourceLocation RParenLoc) { 296 bool isUnevaluatedOperand = true; 297 if (E && !E->isTypeDependent()) { 298 QualType T = E->getType(); 299 if (const RecordType *RecordT = T->getAs<RecordType>()) { 300 CXXRecordDecl *RecordD = cast<CXXRecordDecl>(RecordT->getDecl()); 301 // C++ [expr.typeid]p3: 302 // [...] If the type of the expression is a class type, the class 303 // shall be completely-defined. 304 if (RequireCompleteType(TypeidLoc, T, diag::err_incomplete_typeid)) 305 return ExprError(); 306 307 // C++ [expr.typeid]p3: 308 // When typeid is applied to an expression other than an glvalue of a 309 // polymorphic class type [...] [the] expression is an unevaluated 310 // operand. [...] 311 if (RecordD->isPolymorphic() && E->Classify(Context).isGLValue()) { 312 isUnevaluatedOperand = false; 313 314 // We require a vtable to query the type at run time. 315 MarkVTableUsed(TypeidLoc, RecordD); 316 } 317 } 318 319 // C++ [expr.typeid]p4: 320 // [...] If the type of the type-id is a reference to a possibly 321 // cv-qualified type, the result of the typeid expression refers to a 322 // std::type_info object representing the cv-unqualified referenced 323 // type. 324 Qualifiers Quals; 325 QualType UnqualT = Context.getUnqualifiedArrayType(T, Quals); 326 if (!Context.hasSameType(T, UnqualT)) { 327 T = UnqualT; 328 E = ImpCastExprToType(E, UnqualT, CK_NoOp, E->getValueKind()).take(); 329 } 330 } 331 332 // If this is an unevaluated operand, clear out the set of 333 // declaration references we have been computing and eliminate any 334 // temporaries introduced in its computation. 335 if (isUnevaluatedOperand) 336 ExprEvalContexts.back().Context = Unevaluated; 337 338 return Owned(new (Context) CXXTypeidExpr(TypeInfoType.withConst(), 339 E, 340 SourceRange(TypeidLoc, RParenLoc))); 341 } 342 343 /// ActOnCXXTypeidOfType - Parse typeid( type-id ) or typeid (expression); 344 ExprResult 345 Sema::ActOnCXXTypeid(SourceLocation OpLoc, SourceLocation LParenLoc, 346 bool isType, void *TyOrExpr, SourceLocation RParenLoc) { 347 // Find the std::type_info type. 348 if (!getStdNamespace()) 349 return ExprError(Diag(OpLoc, diag::err_need_header_before_typeid)); 350 351 if (!CXXTypeInfoDecl) { 352 IdentifierInfo *TypeInfoII = &PP.getIdentifierTable().get("type_info"); 353 LookupResult R(*this, TypeInfoII, SourceLocation(), LookupTagName); 354 LookupQualifiedName(R, getStdNamespace()); 355 CXXTypeInfoDecl = R.getAsSingle<RecordDecl>(); 356 if (!CXXTypeInfoDecl) 357 return ExprError(Diag(OpLoc, diag::err_need_header_before_typeid)); 358 } 359 360 QualType TypeInfoType = Context.getTypeDeclType(CXXTypeInfoDecl); 361 362 if (isType) { 363 // The operand is a type; handle it as such. 364 TypeSourceInfo *TInfo = 0; 365 QualType T = GetTypeFromParser(ParsedType::getFromOpaquePtr(TyOrExpr), 366 &TInfo); 367 if (T.isNull()) 368 return ExprError(); 369 370 if (!TInfo) 371 TInfo = Context.getTrivialTypeSourceInfo(T, OpLoc); 372 373 return BuildCXXTypeId(TypeInfoType, OpLoc, TInfo, RParenLoc); 374 } 375 376 // The operand is an expression. 377 return BuildCXXTypeId(TypeInfoType, OpLoc, (Expr*)TyOrExpr, RParenLoc); 378 } 379 380 /// Retrieve the UuidAttr associated with QT. 381 static UuidAttr *GetUuidAttrOfType(QualType QT) { 382 // Optionally remove one level of pointer, reference or array indirection. 383 const Type *Ty = QT.getTypePtr();; 384 if (QT->isPointerType() || QT->isReferenceType()) 385 Ty = QT->getPointeeType().getTypePtr(); 386 else if (QT->isArrayType()) 387 Ty = cast<ArrayType>(QT)->getElementType().getTypePtr(); 388 389 // Loop all record redeclaration looking for an uuid attribute. 390 CXXRecordDecl *RD = Ty->getAsCXXRecordDecl(); 391 for (CXXRecordDecl::redecl_iterator I = RD->redecls_begin(), 392 E = RD->redecls_end(); I != E; ++I) { 393 if (UuidAttr *Uuid = I->getAttr<UuidAttr>()) 394 return Uuid; 395 } 396 397 return 0; 398 } 399 400 /// \brief Build a Microsoft __uuidof expression with a type operand. 401 ExprResult Sema::BuildCXXUuidof(QualType TypeInfoType, 402 SourceLocation TypeidLoc, 403 TypeSourceInfo *Operand, 404 SourceLocation RParenLoc) { 405 if (!Operand->getType()->isDependentType()) { 406 if (!GetUuidAttrOfType(Operand->getType())) 407 return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid)); 408 } 409 410 // FIXME: add __uuidof semantic analysis for type operand. 411 return Owned(new (Context) CXXUuidofExpr(TypeInfoType.withConst(), 412 Operand, 413 SourceRange(TypeidLoc, RParenLoc))); 414 } 415 416 /// \brief Build a Microsoft __uuidof expression with an expression operand. 417 ExprResult Sema::BuildCXXUuidof(QualType TypeInfoType, 418 SourceLocation TypeidLoc, 419 Expr *E, 420 SourceLocation RParenLoc) { 421 if (!E->getType()->isDependentType()) { 422 if (!GetUuidAttrOfType(E->getType()) && 423 !E->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) 424 return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid)); 425 } 426 // FIXME: add __uuidof semantic analysis for type operand. 427 return Owned(new (Context) CXXUuidofExpr(TypeInfoType.withConst(), 428 E, 429 SourceRange(TypeidLoc, RParenLoc))); 430 } 431 432 /// ActOnCXXUuidof - Parse __uuidof( type-id ) or __uuidof (expression); 433 ExprResult 434 Sema::ActOnCXXUuidof(SourceLocation OpLoc, SourceLocation LParenLoc, 435 bool isType, void *TyOrExpr, SourceLocation RParenLoc) { 436 // If MSVCGuidDecl has not been cached, do the lookup. 437 if (!MSVCGuidDecl) { 438 IdentifierInfo *GuidII = &PP.getIdentifierTable().get("_GUID"); 439 LookupResult R(*this, GuidII, SourceLocation(), LookupTagName); 440 LookupQualifiedName(R, Context.getTranslationUnitDecl()); 441 MSVCGuidDecl = R.getAsSingle<RecordDecl>(); 442 if (!MSVCGuidDecl) 443 return ExprError(Diag(OpLoc, diag::err_need_header_before_ms_uuidof)); 444 } 445 446 QualType GuidType = Context.getTypeDeclType(MSVCGuidDecl); 447 448 if (isType) { 449 // The operand is a type; handle it as such. 450 TypeSourceInfo *TInfo = 0; 451 QualType T = GetTypeFromParser(ParsedType::getFromOpaquePtr(TyOrExpr), 452 &TInfo); 453 if (T.isNull()) 454 return ExprError(); 455 456 if (!TInfo) 457 TInfo = Context.getTrivialTypeSourceInfo(T, OpLoc); 458 459 return BuildCXXUuidof(GuidType, OpLoc, TInfo, RParenLoc); 460 } 461 462 // The operand is an expression. 463 return BuildCXXUuidof(GuidType, OpLoc, (Expr*)TyOrExpr, RParenLoc); 464 } 465 466 /// ActOnCXXBoolLiteral - Parse {true,false} literals. 467 ExprResult 468 Sema::ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind) { 469 assert((Kind == tok::kw_true || Kind == tok::kw_false) && 470 "Unknown C++ Boolean value!"); 471 return Owned(new (Context) CXXBoolLiteralExpr(Kind == tok::kw_true, 472 Context.BoolTy, OpLoc)); 473 } 474 475 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'. 476 ExprResult 477 Sema::ActOnCXXNullPtrLiteral(SourceLocation Loc) { 478 return Owned(new (Context) CXXNullPtrLiteralExpr(Context.NullPtrTy, Loc)); 479 } 480 481 /// ActOnCXXThrow - Parse throw expressions. 482 ExprResult 483 Sema::ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *Ex) { 484 bool IsThrownVarInScope = false; 485 if (Ex) { 486 // C++0x [class.copymove]p31: 487 // When certain criteria are met, an implementation is allowed to omit the 488 // copy/move construction of a class object [...] 489 // 490 // - in a throw-expression, when the operand is the name of a 491 // non-volatile automatic object (other than a function or catch- 492 // clause parameter) whose scope does not extend beyond the end of the 493 // innermost enclosing try-block (if there is one), the copy/move 494 // operation from the operand to the exception object (15.1) can be 495 // omitted by constructing the automatic object directly into the 496 // exception object 497 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Ex->IgnoreParens())) 498 if (VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) { 499 if (Var->hasLocalStorage() && !Var->getType().isVolatileQualified()) { 500 for( ; S; S = S->getParent()) { 501 if (S->isDeclScope(Var)) { 502 IsThrownVarInScope = true; 503 break; 504 } 505 506 if (S->getFlags() & 507 (Scope::FnScope | Scope::ClassScope | Scope::BlockScope | 508 Scope::FunctionPrototypeScope | Scope::ObjCMethodScope | 509 Scope::TryScope)) 510 break; 511 } 512 } 513 } 514 } 515 516 return BuildCXXThrow(OpLoc, Ex, IsThrownVarInScope); 517 } 518 519 ExprResult Sema::BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, 520 bool IsThrownVarInScope) { 521 // Don't report an error if 'throw' is used in system headers. 522 if (!getLangOptions().CXXExceptions && 523 !getSourceManager().isInSystemHeader(OpLoc)) 524 Diag(OpLoc, diag::err_exceptions_disabled) << "throw"; 525 526 if (Ex && !Ex->isTypeDependent()) { 527 ExprResult ExRes = CheckCXXThrowOperand(OpLoc, Ex, IsThrownVarInScope); 528 if (ExRes.isInvalid()) 529 return ExprError(); 530 Ex = ExRes.take(); 531 } 532 533 return Owned(new (Context) CXXThrowExpr(Ex, Context.VoidTy, OpLoc, 534 IsThrownVarInScope)); 535 } 536 537 /// CheckCXXThrowOperand - Validate the operand of a throw. 538 ExprResult Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E, 539 bool IsThrownVarInScope) { 540 // C++ [except.throw]p3: 541 // A throw-expression initializes a temporary object, called the exception 542 // object, the type of which is determined by removing any top-level 543 // cv-qualifiers from the static type of the operand of throw and adjusting 544 // the type from "array of T" or "function returning T" to "pointer to T" 545 // or "pointer to function returning T", [...] 546 if (E->getType().hasQualifiers()) 547 E = ImpCastExprToType(E, E->getType().getUnqualifiedType(), CK_NoOp, 548 E->getValueKind()).take(); 549 550 ExprResult Res = DefaultFunctionArrayConversion(E); 551 if (Res.isInvalid()) 552 return ExprError(); 553 E = Res.take(); 554 555 // If the type of the exception would be an incomplete type or a pointer 556 // to an incomplete type other than (cv) void the program is ill-formed. 557 QualType Ty = E->getType(); 558 bool isPointer = false; 559 if (const PointerType* Ptr = Ty->getAs<PointerType>()) { 560 Ty = Ptr->getPointeeType(); 561 isPointer = true; 562 } 563 if (!isPointer || !Ty->isVoidType()) { 564 if (RequireCompleteType(ThrowLoc, Ty, 565 PDiag(isPointer ? diag::err_throw_incomplete_ptr 566 : diag::err_throw_incomplete) 567 << E->getSourceRange())) 568 return ExprError(); 569 570 if (RequireNonAbstractType(ThrowLoc, E->getType(), 571 PDiag(diag::err_throw_abstract_type) 572 << E->getSourceRange())) 573 return ExprError(); 574 } 575 576 // Initialize the exception result. This implicitly weeds out 577 // abstract types or types with inaccessible copy constructors. 578 579 // C++0x [class.copymove]p31: 580 // When certain criteria are met, an implementation is allowed to omit the 581 // copy/move construction of a class object [...] 582 // 583 // - in a throw-expression, when the operand is the name of a 584 // non-volatile automatic object (other than a function or catch-clause 585 // parameter) whose scope does not extend beyond the end of the 586 // innermost enclosing try-block (if there is one), the copy/move 587 // operation from the operand to the exception object (15.1) can be 588 // omitted by constructing the automatic object directly into the 589 // exception object 590 const VarDecl *NRVOVariable = 0; 591 if (IsThrownVarInScope) 592 NRVOVariable = getCopyElisionCandidate(QualType(), E, false); 593 594 InitializedEntity Entity = 595 InitializedEntity::InitializeException(ThrowLoc, E->getType(), 596 /*NRVO=*/NRVOVariable != 0); 597 Res = PerformMoveOrCopyInitialization(Entity, NRVOVariable, 598 QualType(), E, 599 IsThrownVarInScope); 600 if (Res.isInvalid()) 601 return ExprError(); 602 E = Res.take(); 603 604 // If the exception has class type, we need additional handling. 605 const RecordType *RecordTy = Ty->getAs<RecordType>(); 606 if (!RecordTy) 607 return Owned(E); 608 CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl()); 609 610 // If we are throwing a polymorphic class type or pointer thereof, 611 // exception handling will make use of the vtable. 612 MarkVTableUsed(ThrowLoc, RD); 613 614 // If a pointer is thrown, the referenced object will not be destroyed. 615 if (isPointer) 616 return Owned(E); 617 618 // If the class has a non-trivial destructor, we must be able to call it. 619 if (RD->hasTrivialDestructor()) 620 return Owned(E); 621 622 CXXDestructorDecl *Destructor 623 = const_cast<CXXDestructorDecl*>(LookupDestructor(RD)); 624 if (!Destructor) 625 return Owned(E); 626 627 MarkDeclarationReferenced(E->getExprLoc(), Destructor); 628 CheckDestructorAccess(E->getExprLoc(), Destructor, 629 PDiag(diag::err_access_dtor_exception) << Ty); 630 return Owned(E); 631 } 632 633 QualType Sema::getAndCaptureCurrentThisType() { 634 // Ignore block scopes: we can capture through them. 635 // Ignore nested enum scopes: we'll diagnose non-constant expressions 636 // where they're invalid, and other uses are legitimate. 637 // Don't ignore nested class scopes: you can't use 'this' in a local class. 638 DeclContext *DC = CurContext; 639 unsigned NumBlocks = 0; 640 while (true) { 641 if (isa<BlockDecl>(DC)) { 642 DC = cast<BlockDecl>(DC)->getDeclContext(); 643 ++NumBlocks; 644 } else if (isa<EnumDecl>(DC)) 645 DC = cast<EnumDecl>(DC)->getDeclContext(); 646 else break; 647 } 648 649 QualType ThisTy; 650 if (CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(DC)) { 651 if (method && method->isInstance()) 652 ThisTy = method->getThisType(Context); 653 } else if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) { 654 // C++0x [expr.prim]p4: 655 // Otherwise, if a member-declarator declares a non-static data member 656 // of a class X, the expression this is a prvalue of type "pointer to X" 657 // within the optional brace-or-equal-initializer. 658 Scope *S = getScopeForContext(DC); 659 if (!S || S->getFlags() & Scope::ThisScope) 660 ThisTy = Context.getPointerType(Context.getRecordType(RD)); 661 } 662 663 // Mark that we're closing on 'this' in all the block scopes we ignored. 664 if (!ThisTy.isNull()) 665 for (unsigned idx = FunctionScopes.size() - 1; 666 NumBlocks; --idx, --NumBlocks) 667 cast<BlockScopeInfo>(FunctionScopes[idx])->CapturesCXXThis = true; 668 669 return ThisTy; 670 } 671 672 ExprResult Sema::ActOnCXXThis(SourceLocation Loc) { 673 /// C++ 9.3.2: In the body of a non-static member function, the keyword this 674 /// is a non-lvalue expression whose value is the address of the object for 675 /// which the function is called. 676 677 QualType ThisTy = getAndCaptureCurrentThisType(); 678 if (ThisTy.isNull()) return Diag(Loc, diag::err_invalid_this_use); 679 680 return Owned(new (Context) CXXThisExpr(Loc, ThisTy, /*isImplicit=*/false)); 681 } 682 683 ExprResult 684 Sema::ActOnCXXTypeConstructExpr(ParsedType TypeRep, 685 SourceLocation LParenLoc, 686 MultiExprArg exprs, 687 SourceLocation RParenLoc) { 688 if (!TypeRep) 689 return ExprError(); 690 691 TypeSourceInfo *TInfo; 692 QualType Ty = GetTypeFromParser(TypeRep, &TInfo); 693 if (!TInfo) 694 TInfo = Context.getTrivialTypeSourceInfo(Ty, SourceLocation()); 695 696 return BuildCXXTypeConstructExpr(TInfo, LParenLoc, exprs, RParenLoc); 697 } 698 699 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type. 700 /// Can be interpreted either as function-style casting ("int(x)") 701 /// or class type construction ("ClassType(x,y,z)") 702 /// or creation of a value-initialized type ("int()"). 703 ExprResult 704 Sema::BuildCXXTypeConstructExpr(TypeSourceInfo *TInfo, 705 SourceLocation LParenLoc, 706 MultiExprArg exprs, 707 SourceLocation RParenLoc) { 708 QualType Ty = TInfo->getType(); 709 unsigned NumExprs = exprs.size(); 710 Expr **Exprs = (Expr**)exprs.get(); 711 SourceLocation TyBeginLoc = TInfo->getTypeLoc().getBeginLoc(); 712 SourceRange FullRange = SourceRange(TyBeginLoc, RParenLoc); 713 714 if (Ty->isDependentType() || 715 CallExpr::hasAnyTypeDependentArguments(Exprs, NumExprs)) { 716 exprs.release(); 717 718 return Owned(CXXUnresolvedConstructExpr::Create(Context, TInfo, 719 LParenLoc, 720 Exprs, NumExprs, 721 RParenLoc)); 722 } 723 724 if (Ty->isArrayType()) 725 return ExprError(Diag(TyBeginLoc, 726 diag::err_value_init_for_array_type) << FullRange); 727 if (!Ty->isVoidType() && 728 RequireCompleteType(TyBeginLoc, Ty, 729 PDiag(diag::err_invalid_incomplete_type_use) 730 << FullRange)) 731 return ExprError(); 732 733 if (RequireNonAbstractType(TyBeginLoc, Ty, 734 diag::err_allocation_of_abstract_type)) 735 return ExprError(); 736 737 738 // C++ [expr.type.conv]p1: 739 // If the expression list is a single expression, the type conversion 740 // expression is equivalent (in definedness, and if defined in meaning) to the 741 // corresponding cast expression. 742 // 743 if (NumExprs == 1) { 744 CastKind Kind = CK_Invalid; 745 ExprValueKind VK = VK_RValue; 746 CXXCastPath BasePath; 747 ExprResult CastExpr = 748 CheckCastTypes(TInfo->getTypeLoc().getBeginLoc(), 749 TInfo->getTypeLoc().getSourceRange(), Ty, Exprs[0], 750 Kind, VK, BasePath, 751 /*FunctionalStyle=*/true); 752 if (CastExpr.isInvalid()) 753 return ExprError(); 754 Exprs[0] = CastExpr.take(); 755 756 exprs.release(); 757 758 return Owned(CXXFunctionalCastExpr::Create(Context, 759 Ty.getNonLValueExprType(Context), 760 VK, TInfo, TyBeginLoc, Kind, 761 Exprs[0], &BasePath, 762 RParenLoc)); 763 } 764 765 InitializedEntity Entity = InitializedEntity::InitializeTemporary(TInfo); 766 InitializationKind Kind 767 = NumExprs ? InitializationKind::CreateDirect(TyBeginLoc, 768 LParenLoc, RParenLoc) 769 : InitializationKind::CreateValue(TyBeginLoc, 770 LParenLoc, RParenLoc); 771 InitializationSequence InitSeq(*this, Entity, Kind, Exprs, NumExprs); 772 ExprResult Result = InitSeq.Perform(*this, Entity, Kind, move(exprs)); 773 774 // FIXME: Improve AST representation? 775 return move(Result); 776 } 777 778 /// doesUsualArrayDeleteWantSize - Answers whether the usual 779 /// operator delete[] for the given type has a size_t parameter. 780 static bool doesUsualArrayDeleteWantSize(Sema &S, SourceLocation loc, 781 QualType allocType) { 782 const RecordType *record = 783 allocType->getBaseElementTypeUnsafe()->getAs<RecordType>(); 784 if (!record) return false; 785 786 // Try to find an operator delete[] in class scope. 787 788 DeclarationName deleteName = 789 S.Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete); 790 LookupResult ops(S, deleteName, loc, Sema::LookupOrdinaryName); 791 S.LookupQualifiedName(ops, record->getDecl()); 792 793 // We're just doing this for information. 794 ops.suppressDiagnostics(); 795 796 // Very likely: there's no operator delete[]. 797 if (ops.empty()) return false; 798 799 // If it's ambiguous, it should be illegal to call operator delete[] 800 // on this thing, so it doesn't matter if we allocate extra space or not. 801 if (ops.isAmbiguous()) return false; 802 803 LookupResult::Filter filter = ops.makeFilter(); 804 while (filter.hasNext()) { 805 NamedDecl *del = filter.next()->getUnderlyingDecl(); 806 807 // C++0x [basic.stc.dynamic.deallocation]p2: 808 // A template instance is never a usual deallocation function, 809 // regardless of its signature. 810 if (isa<FunctionTemplateDecl>(del)) { 811 filter.erase(); 812 continue; 813 } 814 815 // C++0x [basic.stc.dynamic.deallocation]p2: 816 // If class T does not declare [an operator delete[] with one 817 // parameter] but does declare a member deallocation function 818 // named operator delete[] with exactly two parameters, the 819 // second of which has type std::size_t, then this function 820 // is a usual deallocation function. 821 if (!cast<CXXMethodDecl>(del)->isUsualDeallocationFunction()) { 822 filter.erase(); 823 continue; 824 } 825 } 826 filter.done(); 827 828 if (!ops.isSingleResult()) return false; 829 830 const FunctionDecl *del = cast<FunctionDecl>(ops.getFoundDecl()); 831 return (del->getNumParams() == 2); 832 } 833 834 /// ActOnCXXNew - Parsed a C++ 'new' expression (C++ 5.3.4), as in e.g.: 835 /// @code new (memory) int[size][4] @endcode 836 /// or 837 /// @code ::new Foo(23, "hello") @endcode 838 /// For the interpretation of this heap of arguments, consult the base version. 839 ExprResult 840 Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, 841 SourceLocation PlacementLParen, MultiExprArg PlacementArgs, 842 SourceLocation PlacementRParen, SourceRange TypeIdParens, 843 Declarator &D, SourceLocation ConstructorLParen, 844 MultiExprArg ConstructorArgs, 845 SourceLocation ConstructorRParen) { 846 bool TypeContainsAuto = D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto; 847 848 Expr *ArraySize = 0; 849 // If the specified type is an array, unwrap it and save the expression. 850 if (D.getNumTypeObjects() > 0 && 851 D.getTypeObject(0).Kind == DeclaratorChunk::Array) { 852 DeclaratorChunk &Chunk = D.getTypeObject(0); 853 if (TypeContainsAuto) 854 return ExprError(Diag(Chunk.Loc, diag::err_new_array_of_auto) 855 << D.getSourceRange()); 856 if (Chunk.Arr.hasStatic) 857 return ExprError(Diag(Chunk.Loc, diag::err_static_illegal_in_new) 858 << D.getSourceRange()); 859 if (!Chunk.Arr.NumElts) 860 return ExprError(Diag(Chunk.Loc, diag::err_array_new_needs_size) 861 << D.getSourceRange()); 862 863 ArraySize = static_cast<Expr*>(Chunk.Arr.NumElts); 864 D.DropFirstTypeObject(); 865 } 866 867 // Every dimension shall be of constant size. 868 if (ArraySize) { 869 for (unsigned I = 0, N = D.getNumTypeObjects(); I < N; ++I) { 870 if (D.getTypeObject(I).Kind != DeclaratorChunk::Array) 871 break; 872 873 DeclaratorChunk::ArrayTypeInfo &Array = D.getTypeObject(I).Arr; 874 if (Expr *NumElts = (Expr *)Array.NumElts) { 875 if (!NumElts->isTypeDependent() && !NumElts->isValueDependent() && 876 !NumElts->isIntegerConstantExpr(Context)) { 877 Diag(D.getTypeObject(I).Loc, diag::err_new_array_nonconst) 878 << NumElts->getSourceRange(); 879 return ExprError(); 880 } 881 } 882 } 883 } 884 885 TypeSourceInfo *TInfo = GetTypeForDeclarator(D, /*Scope=*/0); 886 QualType AllocType = TInfo->getType(); 887 if (D.isInvalidType()) 888 return ExprError(); 889 890 return BuildCXXNew(StartLoc, UseGlobal, 891 PlacementLParen, 892 move(PlacementArgs), 893 PlacementRParen, 894 TypeIdParens, 895 AllocType, 896 TInfo, 897 ArraySize, 898 ConstructorLParen, 899 move(ConstructorArgs), 900 ConstructorRParen, 901 TypeContainsAuto); 902 } 903 904 ExprResult 905 Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal, 906 SourceLocation PlacementLParen, 907 MultiExprArg PlacementArgs, 908 SourceLocation PlacementRParen, 909 SourceRange TypeIdParens, 910 QualType AllocType, 911 TypeSourceInfo *AllocTypeInfo, 912 Expr *ArraySize, 913 SourceLocation ConstructorLParen, 914 MultiExprArg ConstructorArgs, 915 SourceLocation ConstructorRParen, 916 bool TypeMayContainAuto) { 917 SourceRange TypeRange = AllocTypeInfo->getTypeLoc().getSourceRange(); 918 919 // C++0x [decl.spec.auto]p6. Deduce the type which 'auto' stands in for. 920 if (TypeMayContainAuto && AllocType->getContainedAutoType()) { 921 if (ConstructorArgs.size() == 0) 922 return ExprError(Diag(StartLoc, diag::err_auto_new_requires_ctor_arg) 923 << AllocType << TypeRange); 924 if (ConstructorArgs.size() != 1) { 925 Expr *FirstBad = ConstructorArgs.get()[1]; 926 return ExprError(Diag(FirstBad->getSourceRange().getBegin(), 927 diag::err_auto_new_ctor_multiple_expressions) 928 << AllocType << TypeRange); 929 } 930 TypeSourceInfo *DeducedType = 0; 931 if (!DeduceAutoType(AllocTypeInfo, ConstructorArgs.get()[0], DeducedType)) 932 return ExprError(Diag(StartLoc, diag::err_auto_new_deduction_failure) 933 << AllocType 934 << ConstructorArgs.get()[0]->getType() 935 << TypeRange 936 << ConstructorArgs.get()[0]->getSourceRange()); 937 if (!DeducedType) 938 return ExprError(); 939 940 AllocTypeInfo = DeducedType; 941 AllocType = AllocTypeInfo->getType(); 942 } 943 944 // Per C++0x [expr.new]p5, the type being constructed may be a 945 // typedef of an array type. 946 if (!ArraySize) { 947 if (const ConstantArrayType *Array 948 = Context.getAsConstantArrayType(AllocType)) { 949 ArraySize = IntegerLiteral::Create(Context, Array->getSize(), 950 Context.getSizeType(), 951 TypeRange.getEnd()); 952 AllocType = Array->getElementType(); 953 } 954 } 955 956 if (CheckAllocatedType(AllocType, TypeRange.getBegin(), TypeRange)) 957 return ExprError(); 958 959 // In ARC, infer 'retaining' for the allocated 960 if (getLangOptions().ObjCAutoRefCount && 961 AllocType.getObjCLifetime() == Qualifiers::OCL_None && 962 AllocType->isObjCLifetimeType()) { 963 AllocType = Context.getLifetimeQualifiedType(AllocType, 964 AllocType->getObjCARCImplicitLifetime()); 965 } 966 967 QualType ResultType = Context.getPointerType(AllocType); 968 969 // C++ 5.3.4p6: "The expression in a direct-new-declarator shall have integral 970 // or enumeration type with a non-negative value." 971 if (ArraySize && !ArraySize->isTypeDependent()) { 972 973 QualType SizeType = ArraySize->getType(); 974 975 ExprResult ConvertedSize 976 = ConvertToIntegralOrEnumerationType(StartLoc, ArraySize, 977 PDiag(diag::err_array_size_not_integral), 978 PDiag(diag::err_array_size_incomplete_type) 979 << ArraySize->getSourceRange(), 980 PDiag(diag::err_array_size_explicit_conversion), 981 PDiag(diag::note_array_size_conversion), 982 PDiag(diag::err_array_size_ambiguous_conversion), 983 PDiag(diag::note_array_size_conversion), 984 PDiag(getLangOptions().CPlusPlus0x? 0 985 : diag::ext_array_size_conversion)); 986 if (ConvertedSize.isInvalid()) 987 return ExprError(); 988 989 ArraySize = ConvertedSize.take(); 990 SizeType = ArraySize->getType(); 991 if (!SizeType->isIntegralOrUnscopedEnumerationType()) 992 return ExprError(); 993 994 // Let's see if this is a constant < 0. If so, we reject it out of hand. 995 // We don't care about special rules, so we tell the machinery it's not 996 // evaluated - it gives us a result in more cases. 997 if (!ArraySize->isValueDependent()) { 998 llvm::APSInt Value; 999 if (ArraySize->isIntegerConstantExpr(Value, Context, 0, false)) { 1000 if (Value < llvm::APSInt( 1001 llvm::APInt::getNullValue(Value.getBitWidth()), 1002 Value.isUnsigned())) 1003 return ExprError(Diag(ArraySize->getSourceRange().getBegin(), 1004 diag::err_typecheck_negative_array_size) 1005 << ArraySize->getSourceRange()); 1006 1007 if (!AllocType->isDependentType()) { 1008 unsigned ActiveSizeBits 1009 = ConstantArrayType::getNumAddressingBits(Context, AllocType, Value); 1010 if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context)) { 1011 Diag(ArraySize->getSourceRange().getBegin(), 1012 diag::err_array_too_large) 1013 << Value.toString(10) 1014 << ArraySize->getSourceRange(); 1015 return ExprError(); 1016 } 1017 } 1018 } else if (TypeIdParens.isValid()) { 1019 // Can't have dynamic array size when the type-id is in parentheses. 1020 Diag(ArraySize->getLocStart(), diag::ext_new_paren_array_nonconst) 1021 << ArraySize->getSourceRange() 1022 << FixItHint::CreateRemoval(TypeIdParens.getBegin()) 1023 << FixItHint::CreateRemoval(TypeIdParens.getEnd()); 1024 1025 TypeIdParens = SourceRange(); 1026 } 1027 } 1028 1029 // ARC: warn about ABI issues. 1030 if (getLangOptions().ObjCAutoRefCount) { 1031 QualType BaseAllocType = Context.getBaseElementType(AllocType); 1032 if (BaseAllocType.hasStrongOrWeakObjCLifetime()) 1033 Diag(StartLoc, diag::warn_err_new_delete_object_array) 1034 << 0 << BaseAllocType; 1035 } 1036 1037 // Note that we do *not* convert the argument in any way. It can 1038 // be signed, larger than size_t, whatever. 1039 } 1040 1041 FunctionDecl *OperatorNew = 0; 1042 FunctionDecl *OperatorDelete = 0; 1043 Expr **PlaceArgs = (Expr**)PlacementArgs.get(); 1044 unsigned NumPlaceArgs = PlacementArgs.size(); 1045 1046 if (!AllocType->isDependentType() && 1047 !Expr::hasAnyTypeDependentArguments(PlaceArgs, NumPlaceArgs) && 1048 FindAllocationFunctions(StartLoc, 1049 SourceRange(PlacementLParen, PlacementRParen), 1050 UseGlobal, AllocType, ArraySize, PlaceArgs, 1051 NumPlaceArgs, OperatorNew, OperatorDelete)) 1052 return ExprError(); 1053 1054 // If this is an array allocation, compute whether the usual array 1055 // deallocation function for the type has a size_t parameter. 1056 bool UsualArrayDeleteWantsSize = false; 1057 if (ArraySize && !AllocType->isDependentType()) 1058 UsualArrayDeleteWantsSize 1059 = doesUsualArrayDeleteWantSize(*this, StartLoc, AllocType); 1060 1061 SmallVector<Expr *, 8> AllPlaceArgs; 1062 if (OperatorNew) { 1063 // Add default arguments, if any. 1064 const FunctionProtoType *Proto = 1065 OperatorNew->getType()->getAs<FunctionProtoType>(); 1066 VariadicCallType CallType = 1067 Proto->isVariadic() ? VariadicFunction : VariadicDoesNotApply; 1068 1069 if (GatherArgumentsForCall(PlacementLParen, OperatorNew, 1070 Proto, 1, PlaceArgs, NumPlaceArgs, 1071 AllPlaceArgs, CallType)) 1072 return ExprError(); 1073 1074 NumPlaceArgs = AllPlaceArgs.size(); 1075 if (NumPlaceArgs > 0) 1076 PlaceArgs = &AllPlaceArgs[0]; 1077 } 1078 1079 bool Init = ConstructorLParen.isValid(); 1080 // --- Choosing a constructor --- 1081 CXXConstructorDecl *Constructor = 0; 1082 Expr **ConsArgs = (Expr**)ConstructorArgs.get(); 1083 unsigned NumConsArgs = ConstructorArgs.size(); 1084 ASTOwningVector<Expr*> ConvertedConstructorArgs(*this); 1085 1086 // Array 'new' can't have any initializers. 1087 if (NumConsArgs && (ResultType->isArrayType() || ArraySize)) { 1088 SourceRange InitRange(ConsArgs[0]->getLocStart(), 1089 ConsArgs[NumConsArgs - 1]->getLocEnd()); 1090 1091 Diag(StartLoc, diag::err_new_array_init_args) << InitRange; 1092 return ExprError(); 1093 } 1094 1095 if (!AllocType->isDependentType() && 1096 !Expr::hasAnyTypeDependentArguments(ConsArgs, NumConsArgs)) { 1097 // C++0x [expr.new]p15: 1098 // A new-expression that creates an object of type T initializes that 1099 // object as follows: 1100 InitializationKind Kind 1101 // - If the new-initializer is omitted, the object is default- 1102 // initialized (8.5); if no initialization is performed, 1103 // the object has indeterminate value 1104 = !Init? InitializationKind::CreateDefault(TypeRange.getBegin()) 1105 // - Otherwise, the new-initializer is interpreted according to the 1106 // initialization rules of 8.5 for direct-initialization. 1107 : InitializationKind::CreateDirect(TypeRange.getBegin(), 1108 ConstructorLParen, 1109 ConstructorRParen); 1110 1111 InitializedEntity Entity 1112 = InitializedEntity::InitializeNew(StartLoc, AllocType); 1113 InitializationSequence InitSeq(*this, Entity, Kind, ConsArgs, NumConsArgs); 1114 ExprResult FullInit = InitSeq.Perform(*this, Entity, Kind, 1115 move(ConstructorArgs)); 1116 if (FullInit.isInvalid()) 1117 return ExprError(); 1118 1119 // FullInit is our initializer; walk through it to determine if it's a 1120 // constructor call, which CXXNewExpr handles directly. 1121 if (Expr *FullInitExpr = (Expr *)FullInit.get()) { 1122 if (CXXBindTemporaryExpr *Binder 1123 = dyn_cast<CXXBindTemporaryExpr>(FullInitExpr)) 1124 FullInitExpr = Binder->getSubExpr(); 1125 if (CXXConstructExpr *Construct 1126 = dyn_cast<CXXConstructExpr>(FullInitExpr)) { 1127 Constructor = Construct->getConstructor(); 1128 for (CXXConstructExpr::arg_iterator A = Construct->arg_begin(), 1129 AEnd = Construct->arg_end(); 1130 A != AEnd; ++A) 1131 ConvertedConstructorArgs.push_back(*A); 1132 } else { 1133 // Take the converted initializer. 1134 ConvertedConstructorArgs.push_back(FullInit.release()); 1135 } 1136 } else { 1137 // No initialization required. 1138 } 1139 1140 // Take the converted arguments and use them for the new expression. 1141 NumConsArgs = ConvertedConstructorArgs.size(); 1142 ConsArgs = (Expr **)ConvertedConstructorArgs.take(); 1143 } 1144 1145 // Mark the new and delete operators as referenced. 1146 if (OperatorNew) 1147 MarkDeclarationReferenced(StartLoc, OperatorNew); 1148 if (OperatorDelete) 1149 MarkDeclarationReferenced(StartLoc, OperatorDelete); 1150 1151 // C++0x [expr.new]p17: 1152 // If the new expression creates an array of objects of class type, 1153 // access and ambiguity control are done for the destructor. 1154 if (ArraySize && Constructor) { 1155 if (CXXDestructorDecl *dtor = LookupDestructor(Constructor->getParent())) { 1156 MarkDeclarationReferenced(StartLoc, dtor); 1157 CheckDestructorAccess(StartLoc, dtor, 1158 PDiag(diag::err_access_dtor) 1159 << Context.getBaseElementType(AllocType)); 1160 } 1161 } 1162 1163 PlacementArgs.release(); 1164 ConstructorArgs.release(); 1165 1166 return Owned(new (Context) CXXNewExpr(Context, UseGlobal, OperatorNew, 1167 PlaceArgs, NumPlaceArgs, TypeIdParens, 1168 ArraySize, Constructor, Init, 1169 ConsArgs, NumConsArgs, OperatorDelete, 1170 UsualArrayDeleteWantsSize, 1171 ResultType, AllocTypeInfo, 1172 StartLoc, 1173 Init ? ConstructorRParen : 1174 TypeRange.getEnd(), 1175 ConstructorLParen, ConstructorRParen)); 1176 } 1177 1178 /// CheckAllocatedType - Checks that a type is suitable as the allocated type 1179 /// in a new-expression. 1180 /// dimension off and stores the size expression in ArraySize. 1181 bool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc, 1182 SourceRange R) { 1183 // C++ 5.3.4p1: "[The] type shall be a complete object type, but not an 1184 // abstract class type or array thereof. 1185 if (AllocType->isFunctionType()) 1186 return Diag(Loc, diag::err_bad_new_type) 1187 << AllocType << 0 << R; 1188 else if (AllocType->isReferenceType()) 1189 return Diag(Loc, diag::err_bad_new_type) 1190 << AllocType << 1 << R; 1191 else if (!AllocType->isDependentType() && 1192 RequireCompleteType(Loc, AllocType, 1193 PDiag(diag::err_new_incomplete_type) 1194 << R)) 1195 return true; 1196 else if (RequireNonAbstractType(Loc, AllocType, 1197 diag::err_allocation_of_abstract_type)) 1198 return true; 1199 else if (AllocType->isVariablyModifiedType()) 1200 return Diag(Loc, diag::err_variably_modified_new_type) 1201 << AllocType; 1202 else if (unsigned AddressSpace = AllocType.getAddressSpace()) 1203 return Diag(Loc, diag::err_address_space_qualified_new) 1204 << AllocType.getUnqualifiedType() << AddressSpace; 1205 else if (getLangOptions().ObjCAutoRefCount) { 1206 if (const ArrayType *AT = Context.getAsArrayType(AllocType)) { 1207 QualType BaseAllocType = Context.getBaseElementType(AT); 1208 if (BaseAllocType.getObjCLifetime() == Qualifiers::OCL_None && 1209 BaseAllocType->isObjCLifetimeType()) 1210 return Diag(Loc, diag::err_arc_new_array_without_ownership) 1211 << BaseAllocType; 1212 } 1213 } 1214 1215 return false; 1216 } 1217 1218 /// \brief Determine whether the given function is a non-placement 1219 /// deallocation function. 1220 static bool isNonPlacementDeallocationFunction(FunctionDecl *FD) { 1221 if (FD->isInvalidDecl()) 1222 return false; 1223 1224 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FD)) 1225 return Method->isUsualDeallocationFunction(); 1226 1227 return ((FD->getOverloadedOperator() == OO_Delete || 1228 FD->getOverloadedOperator() == OO_Array_Delete) && 1229 FD->getNumParams() == 1); 1230 } 1231 1232 /// FindAllocationFunctions - Finds the overloads of operator new and delete 1233 /// that are appropriate for the allocation. 1234 bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, 1235 bool UseGlobal, QualType AllocType, 1236 bool IsArray, Expr **PlaceArgs, 1237 unsigned NumPlaceArgs, 1238 FunctionDecl *&OperatorNew, 1239 FunctionDecl *&OperatorDelete) { 1240 // --- Choosing an allocation function --- 1241 // C++ 5.3.4p8 - 14 & 18 1242 // 1) If UseGlobal is true, only look in the global scope. Else, also look 1243 // in the scope of the allocated class. 1244 // 2) If an array size is given, look for operator new[], else look for 1245 // operator new. 1246 // 3) The first argument is always size_t. Append the arguments from the 1247 // placement form. 1248 1249 SmallVector<Expr*, 8> AllocArgs(1 + NumPlaceArgs); 1250 // We don't care about the actual value of this argument. 1251 // FIXME: Should the Sema create the expression and embed it in the syntax 1252 // tree? Or should the consumer just recalculate the value? 1253 IntegerLiteral Size(Context, llvm::APInt::getNullValue( 1254 Context.getTargetInfo().getPointerWidth(0)), 1255 Context.getSizeType(), 1256 SourceLocation()); 1257 AllocArgs[0] = &Size; 1258 std::copy(PlaceArgs, PlaceArgs + NumPlaceArgs, AllocArgs.begin() + 1); 1259 1260 // C++ [expr.new]p8: 1261 // If the allocated type is a non-array type, the allocation 1262 // function's name is operator new and the deallocation function's 1263 // name is operator delete. If the allocated type is an array 1264 // type, the allocation function's name is operator new[] and the 1265 // deallocation function's name is operator delete[]. 1266 DeclarationName NewName = Context.DeclarationNames.getCXXOperatorName( 1267 IsArray ? OO_Array_New : OO_New); 1268 DeclarationName DeleteName = Context.DeclarationNames.getCXXOperatorName( 1269 IsArray ? OO_Array_Delete : OO_Delete); 1270 1271 QualType AllocElemType = Context.getBaseElementType(AllocType); 1272 1273 if (AllocElemType->isRecordType() && !UseGlobal) { 1274 CXXRecordDecl *Record 1275 = cast<CXXRecordDecl>(AllocElemType->getAs<RecordType>()->getDecl()); 1276 if (FindAllocationOverload(StartLoc, Range, NewName, &AllocArgs[0], 1277 AllocArgs.size(), Record, /*AllowMissing=*/true, 1278 OperatorNew)) 1279 return true; 1280 } 1281 if (!OperatorNew) { 1282 // Didn't find a member overload. Look for a global one. 1283 DeclareGlobalNewDelete(); 1284 DeclContext *TUDecl = Context.getTranslationUnitDecl(); 1285 if (FindAllocationOverload(StartLoc, Range, NewName, &AllocArgs[0], 1286 AllocArgs.size(), TUDecl, /*AllowMissing=*/false, 1287 OperatorNew)) 1288 return true; 1289 } 1290 1291 // We don't need an operator delete if we're running under 1292 // -fno-exceptions. 1293 if (!getLangOptions().Exceptions) { 1294 OperatorDelete = 0; 1295 return false; 1296 } 1297 1298 // FindAllocationOverload can change the passed in arguments, so we need to 1299 // copy them back. 1300 if (NumPlaceArgs > 0) 1301 std::copy(&AllocArgs[1], AllocArgs.end(), PlaceArgs); 1302 1303 // C++ [expr.new]p19: 1304 // 1305 // If the new-expression begins with a unary :: operator, the 1306 // deallocation function's name is looked up in the global 1307 // scope. Otherwise, if the allocated type is a class type T or an 1308 // array thereof, the deallocation function's name is looked up in 1309 // the scope of T. If this lookup fails to find the name, or if 1310 // the allocated type is not a class type or array thereof, the 1311 // deallocation function's name is looked up in the global scope. 1312 LookupResult FoundDelete(*this, DeleteName, StartLoc, LookupOrdinaryName); 1313 if (AllocElemType->isRecordType() && !UseGlobal) { 1314 CXXRecordDecl *RD 1315 = cast<CXXRecordDecl>(AllocElemType->getAs<RecordType>()->getDecl()); 1316 LookupQualifiedName(FoundDelete, RD); 1317 } 1318 if (FoundDelete.isAmbiguous()) 1319 return true; // FIXME: clean up expressions? 1320 1321 if (FoundDelete.empty()) { 1322 DeclareGlobalNewDelete(); 1323 LookupQualifiedName(FoundDelete, Context.getTranslationUnitDecl()); 1324 } 1325 1326 FoundDelete.suppressDiagnostics(); 1327 1328 SmallVector<std::pair<DeclAccessPair,FunctionDecl*>, 2> Matches; 1329 1330 // Whether we're looking for a placement operator delete is dictated 1331 // by whether we selected a placement operator new, not by whether 1332 // we had explicit placement arguments. This matters for things like 1333 // struct A { void *operator new(size_t, int = 0); ... }; 1334 // A *a = new A() 1335 bool isPlacementNew = (NumPlaceArgs > 0 || OperatorNew->param_size() != 1); 1336 1337 if (isPlacementNew) { 1338 // C++ [expr.new]p20: 1339 // A declaration of a placement deallocation function matches the 1340 // declaration of a placement allocation function if it has the 1341 // same number of parameters and, after parameter transformations 1342 // (8.3.5), all parameter types except the first are 1343 // identical. [...] 1344 // 1345 // To perform this comparison, we compute the function type that 1346 // the deallocation function should have, and use that type both 1347 // for template argument deduction and for comparison purposes. 1348 // 1349 // FIXME: this comparison should ignore CC and the like. 1350 QualType ExpectedFunctionType; 1351 { 1352 const FunctionProtoType *Proto 1353 = OperatorNew->getType()->getAs<FunctionProtoType>(); 1354 1355 SmallVector<QualType, 4> ArgTypes; 1356 ArgTypes.push_back(Context.VoidPtrTy); 1357 for (unsigned I = 1, N = Proto->getNumArgs(); I < N; ++I) 1358 ArgTypes.push_back(Proto->getArgType(I)); 1359 1360 FunctionProtoType::ExtProtoInfo EPI; 1361 EPI.Variadic = Proto->isVariadic(); 1362 1363 ExpectedFunctionType 1364 = Context.getFunctionType(Context.VoidTy, ArgTypes.data(), 1365 ArgTypes.size(), EPI); 1366 } 1367 1368 for (LookupResult::iterator D = FoundDelete.begin(), 1369 DEnd = FoundDelete.end(); 1370 D != DEnd; ++D) { 1371 FunctionDecl *Fn = 0; 1372 if (FunctionTemplateDecl *FnTmpl 1373 = dyn_cast<FunctionTemplateDecl>((*D)->getUnderlyingDecl())) { 1374 // Perform template argument deduction to try to match the 1375 // expected function type. 1376 TemplateDeductionInfo Info(Context, StartLoc); 1377 if (DeduceTemplateArguments(FnTmpl, 0, ExpectedFunctionType, Fn, Info)) 1378 continue; 1379 } else 1380 Fn = cast<FunctionDecl>((*D)->getUnderlyingDecl()); 1381 1382 if (Context.hasSameType(Fn->getType(), ExpectedFunctionType)) 1383 Matches.push_back(std::make_pair(D.getPair(), Fn)); 1384 } 1385 } else { 1386 // C++ [expr.new]p20: 1387 // [...] Any non-placement deallocation function matches a 1388 // non-placement allocation function. [...] 1389 for (LookupResult::iterator D = FoundDelete.begin(), 1390 DEnd = FoundDelete.end(); 1391 D != DEnd; ++D) { 1392 if (FunctionDecl *Fn = dyn_cast<FunctionDecl>((*D)->getUnderlyingDecl())) 1393 if (isNonPlacementDeallocationFunction(Fn)) 1394 Matches.push_back(std::make_pair(D.getPair(), Fn)); 1395 } 1396 } 1397 1398 // C++ [expr.new]p20: 1399 // [...] If the lookup finds a single matching deallocation 1400 // function, that function will be called; otherwise, no 1401 // deallocation function will be called. 1402 if (Matches.size() == 1) { 1403 OperatorDelete = Matches[0].second; 1404 1405 // C++0x [expr.new]p20: 1406 // If the lookup finds the two-parameter form of a usual 1407 // deallocation function (3.7.4.2) and that function, considered 1408 // as a placement deallocation function, would have been 1409 // selected as a match for the allocation function, the program 1410 // is ill-formed. 1411 if (NumPlaceArgs && getLangOptions().CPlusPlus0x && 1412 isNonPlacementDeallocationFunction(OperatorDelete)) { 1413 Diag(StartLoc, diag::err_placement_new_non_placement_delete) 1414 << SourceRange(PlaceArgs[0]->getLocStart(), 1415 PlaceArgs[NumPlaceArgs - 1]->getLocEnd()); 1416 Diag(OperatorDelete->getLocation(), diag::note_previous_decl) 1417 << DeleteName; 1418 } else { 1419 CheckAllocationAccess(StartLoc, Range, FoundDelete.getNamingClass(), 1420 Matches[0].first); 1421 } 1422 } 1423 1424 return false; 1425 } 1426 1427 /// FindAllocationOverload - Find an fitting overload for the allocation 1428 /// function in the specified scope. 1429 bool Sema::FindAllocationOverload(SourceLocation StartLoc, SourceRange Range, 1430 DeclarationName Name, Expr** Args, 1431 unsigned NumArgs, DeclContext *Ctx, 1432 bool AllowMissing, FunctionDecl *&Operator, 1433 bool Diagnose) { 1434 LookupResult R(*this, Name, StartLoc, LookupOrdinaryName); 1435 LookupQualifiedName(R, Ctx); 1436 if (R.empty()) { 1437 if (AllowMissing || !Diagnose) 1438 return false; 1439 return Diag(StartLoc, diag::err_ovl_no_viable_function_in_call) 1440 << Name << Range; 1441 } 1442 1443 if (R.isAmbiguous()) 1444 return true; 1445 1446 R.suppressDiagnostics(); 1447 1448 OverloadCandidateSet Candidates(StartLoc); 1449 for (LookupResult::iterator Alloc = R.begin(), AllocEnd = R.end(); 1450 Alloc != AllocEnd; ++Alloc) { 1451 // Even member operator new/delete are implicitly treated as 1452 // static, so don't use AddMemberCandidate. 1453 NamedDecl *D = (*Alloc)->getUnderlyingDecl(); 1454 1455 if (FunctionTemplateDecl *FnTemplate = dyn_cast<FunctionTemplateDecl>(D)) { 1456 AddTemplateOverloadCandidate(FnTemplate, Alloc.getPair(), 1457 /*ExplicitTemplateArgs=*/0, Args, NumArgs, 1458 Candidates, 1459 /*SuppressUserConversions=*/false); 1460 continue; 1461 } 1462 1463 FunctionDecl *Fn = cast<FunctionDecl>(D); 1464 AddOverloadCandidate(Fn, Alloc.getPair(), Args, NumArgs, Candidates, 1465 /*SuppressUserConversions=*/false); 1466 } 1467 1468 // Do the resolution. 1469 OverloadCandidateSet::iterator Best; 1470 switch (Candidates.BestViableFunction(*this, StartLoc, Best)) { 1471 case OR_Success: { 1472 // Got one! 1473 FunctionDecl *FnDecl = Best->Function; 1474 MarkDeclarationReferenced(StartLoc, FnDecl); 1475 // The first argument is size_t, and the first parameter must be size_t, 1476 // too. This is checked on declaration and can be assumed. (It can't be 1477 // asserted on, though, since invalid decls are left in there.) 1478 // Watch out for variadic allocator function. 1479 unsigned NumArgsInFnDecl = FnDecl->getNumParams(); 1480 for (unsigned i = 0; (i < NumArgs && i < NumArgsInFnDecl); ++i) { 1481 InitializedEntity Entity = InitializedEntity::InitializeParameter(Context, 1482 FnDecl->getParamDecl(i)); 1483 1484 if (!Diagnose && !CanPerformCopyInitialization(Entity, Owned(Args[i]))) 1485 return true; 1486 1487 ExprResult Result 1488 = PerformCopyInitialization(Entity, SourceLocation(), Owned(Args[i])); 1489 if (Result.isInvalid()) 1490 return true; 1491 1492 Args[i] = Result.takeAs<Expr>(); 1493 } 1494 Operator = FnDecl; 1495 CheckAllocationAccess(StartLoc, Range, R.getNamingClass(), Best->FoundDecl, 1496 Diagnose); 1497 return false; 1498 } 1499 1500 case OR_No_Viable_Function: 1501 if (Diagnose) { 1502 Diag(StartLoc, diag::err_ovl_no_viable_function_in_call) 1503 << Name << Range; 1504 Candidates.NoteCandidates(*this, OCD_AllCandidates, Args, NumArgs); 1505 } 1506 return true; 1507 1508 case OR_Ambiguous: 1509 if (Diagnose) { 1510 Diag(StartLoc, diag::err_ovl_ambiguous_call) 1511 << Name << Range; 1512 Candidates.NoteCandidates(*this, OCD_ViableCandidates, Args, NumArgs); 1513 } 1514 return true; 1515 1516 case OR_Deleted: { 1517 if (Diagnose) { 1518 Diag(StartLoc, diag::err_ovl_deleted_call) 1519 << Best->Function->isDeleted() 1520 << Name 1521 << getDeletedOrUnavailableSuffix(Best->Function) 1522 << Range; 1523 Candidates.NoteCandidates(*this, OCD_AllCandidates, Args, NumArgs); 1524 } 1525 return true; 1526 } 1527 } 1528 llvm_unreachable("Unreachable, bad result from BestViableFunction"); 1529 } 1530 1531 1532 /// DeclareGlobalNewDelete - Declare the global forms of operator new and 1533 /// delete. These are: 1534 /// @code 1535 /// // C++03: 1536 /// void* operator new(std::size_t) throw(std::bad_alloc); 1537 /// void* operator new[](std::size_t) throw(std::bad_alloc); 1538 /// void operator delete(void *) throw(); 1539 /// void operator delete[](void *) throw(); 1540 /// // C++0x: 1541 /// void* operator new(std::size_t); 1542 /// void* operator new[](std::size_t); 1543 /// void operator delete(void *); 1544 /// void operator delete[](void *); 1545 /// @endcode 1546 /// C++0x operator delete is implicitly noexcept. 1547 /// Note that the placement and nothrow forms of new are *not* implicitly 1548 /// declared. Their use requires including \<new\>. 1549 void Sema::DeclareGlobalNewDelete() { 1550 if (GlobalNewDeleteDeclared) 1551 return; 1552 1553 // C++ [basic.std.dynamic]p2: 1554 // [...] The following allocation and deallocation functions (18.4) are 1555 // implicitly declared in global scope in each translation unit of a 1556 // program 1557 // 1558 // C++03: 1559 // void* operator new(std::size_t) throw(std::bad_alloc); 1560 // void* operator new[](std::size_t) throw(std::bad_alloc); 1561 // void operator delete(void*) throw(); 1562 // void operator delete[](void*) throw(); 1563 // C++0x: 1564 // void* operator new(std::size_t); 1565 // void* operator new[](std::size_t); 1566 // void operator delete(void*); 1567 // void operator delete[](void*); 1568 // 1569 // These implicit declarations introduce only the function names operator 1570 // new, operator new[], operator delete, operator delete[]. 1571 // 1572 // Here, we need to refer to std::bad_alloc, so we will implicitly declare 1573 // "std" or "bad_alloc" as necessary to form the exception specification. 1574 // However, we do not make these implicit declarations visible to name 1575 // lookup. 1576 // Note that the C++0x versions of operator delete are deallocation functions, 1577 // and thus are implicitly noexcept. 1578 if (!StdBadAlloc && !getLangOptions().CPlusPlus0x) { 1579 // The "std::bad_alloc" class has not yet been declared, so build it 1580 // implicitly. 1581 StdBadAlloc = CXXRecordDecl::Create(Context, TTK_Class, 1582 getOrCreateStdNamespace(), 1583 SourceLocation(), SourceLocation(), 1584 &PP.getIdentifierTable().get("bad_alloc"), 1585 0); 1586 getStdBadAlloc()->setImplicit(true); 1587 } 1588 1589 GlobalNewDeleteDeclared = true; 1590 1591 QualType VoidPtr = Context.getPointerType(Context.VoidTy); 1592 QualType SizeT = Context.getSizeType(); 1593 bool AssumeSaneOperatorNew = getLangOptions().AssumeSaneOperatorNew; 1594 1595 DeclareGlobalAllocationFunction( 1596 Context.DeclarationNames.getCXXOperatorName(OO_New), 1597 VoidPtr, SizeT, AssumeSaneOperatorNew); 1598 DeclareGlobalAllocationFunction( 1599 Context.DeclarationNames.getCXXOperatorName(OO_Array_New), 1600 VoidPtr, SizeT, AssumeSaneOperatorNew); 1601 DeclareGlobalAllocationFunction( 1602 Context.DeclarationNames.getCXXOperatorName(OO_Delete), 1603 Context.VoidTy, VoidPtr); 1604 DeclareGlobalAllocationFunction( 1605 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete), 1606 Context.VoidTy, VoidPtr); 1607 } 1608 1609 /// DeclareGlobalAllocationFunction - Declares a single implicit global 1610 /// allocation function if it doesn't already exist. 1611 void Sema::DeclareGlobalAllocationFunction(DeclarationName Name, 1612 QualType Return, QualType Argument, 1613 bool AddMallocAttr) { 1614 DeclContext *GlobalCtx = Context.getTranslationUnitDecl(); 1615 1616 // Check if this function is already declared. 1617 { 1618 DeclContext::lookup_iterator Alloc, AllocEnd; 1619 for (llvm::tie(Alloc, AllocEnd) = GlobalCtx->lookup(Name); 1620 Alloc != AllocEnd; ++Alloc) { 1621 // Only look at non-template functions, as it is the predefined, 1622 // non-templated allocation function we are trying to declare here. 1623 if (FunctionDecl *Func = dyn_cast<FunctionDecl>(*Alloc)) { 1624 QualType InitialParamType = 1625 Context.getCanonicalType( 1626 Func->getParamDecl(0)->getType().getUnqualifiedType()); 1627 // FIXME: Do we need to check for default arguments here? 1628 if (Func->getNumParams() == 1 && InitialParamType == Argument) { 1629 if(AddMallocAttr && !Func->hasAttr<MallocAttr>()) 1630 Func->addAttr(::new (Context) MallocAttr(SourceLocation(), Context)); 1631 return; 1632 } 1633 } 1634 } 1635 } 1636 1637 QualType BadAllocType; 1638 bool HasBadAllocExceptionSpec 1639 = (Name.getCXXOverloadedOperator() == OO_New || 1640 Name.getCXXOverloadedOperator() == OO_Array_New); 1641 if (HasBadAllocExceptionSpec && !getLangOptions().CPlusPlus0x) { 1642 assert(StdBadAlloc && "Must have std::bad_alloc declared"); 1643 BadAllocType = Context.getTypeDeclType(getStdBadAlloc()); 1644 } 1645 1646 FunctionProtoType::ExtProtoInfo EPI; 1647 if (HasBadAllocExceptionSpec) { 1648 if (!getLangOptions().CPlusPlus0x) { 1649 EPI.ExceptionSpecType = EST_Dynamic; 1650 EPI.NumExceptions = 1; 1651 EPI.Exceptions = &BadAllocType; 1652 } 1653 } else { 1654 EPI.ExceptionSpecType = getLangOptions().CPlusPlus0x ? 1655 EST_BasicNoexcept : EST_DynamicNone; 1656 } 1657 1658 QualType FnType = Context.getFunctionType(Return, &Argument, 1, EPI); 1659 FunctionDecl *Alloc = 1660 FunctionDecl::Create(Context, GlobalCtx, SourceLocation(), 1661 SourceLocation(), Name, 1662 FnType, /*TInfo=*/0, SC_None, 1663 SC_None, false, true); 1664 Alloc->setImplicit(); 1665 1666 if (AddMallocAttr) 1667 Alloc->addAttr(::new (Context) MallocAttr(SourceLocation(), Context)); 1668 1669 ParmVarDecl *Param = ParmVarDecl::Create(Context, Alloc, SourceLocation(), 1670 SourceLocation(), 0, 1671 Argument, /*TInfo=*/0, 1672 SC_None, SC_None, 0); 1673 Alloc->setParams(Param); 1674 1675 // FIXME: Also add this declaration to the IdentifierResolver, but 1676 // make sure it is at the end of the chain to coincide with the 1677 // global scope. 1678 Context.getTranslationUnitDecl()->addDecl(Alloc); 1679 } 1680 1681 bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, 1682 DeclarationName Name, 1683 FunctionDecl* &Operator, bool Diagnose) { 1684 LookupResult Found(*this, Name, StartLoc, LookupOrdinaryName); 1685 // Try to find operator delete/operator delete[] in class scope. 1686 LookupQualifiedName(Found, RD); 1687 1688 if (Found.isAmbiguous()) 1689 return true; 1690 1691 Found.suppressDiagnostics(); 1692 1693 SmallVector<DeclAccessPair,4> Matches; 1694 for (LookupResult::iterator F = Found.begin(), FEnd = Found.end(); 1695 F != FEnd; ++F) { 1696 NamedDecl *ND = (*F)->getUnderlyingDecl(); 1697 1698 // Ignore template operator delete members from the check for a usual 1699 // deallocation function. 1700 if (isa<FunctionTemplateDecl>(ND)) 1701 continue; 1702 1703 if (cast<CXXMethodDecl>(ND)->isUsualDeallocationFunction()) 1704 Matches.push_back(F.getPair()); 1705 } 1706 1707 // There's exactly one suitable operator; pick it. 1708 if (Matches.size() == 1) { 1709 Operator = cast<CXXMethodDecl>(Matches[0]->getUnderlyingDecl()); 1710 1711 if (Operator->isDeleted()) { 1712 if (Diagnose) { 1713 Diag(StartLoc, diag::err_deleted_function_use); 1714 Diag(Operator->getLocation(), diag::note_unavailable_here) << true; 1715 } 1716 return true; 1717 } 1718 1719 CheckAllocationAccess(StartLoc, SourceRange(), Found.getNamingClass(), 1720 Matches[0], Diagnose); 1721 return false; 1722 1723 // We found multiple suitable operators; complain about the ambiguity. 1724 } else if (!Matches.empty()) { 1725 if (Diagnose) { 1726 Diag(StartLoc, diag::err_ambiguous_suitable_delete_member_function_found) 1727 << Name << RD; 1728 1729 for (SmallVectorImpl<DeclAccessPair>::iterator 1730 F = Matches.begin(), FEnd = Matches.end(); F != FEnd; ++F) 1731 Diag((*F)->getUnderlyingDecl()->getLocation(), 1732 diag::note_member_declared_here) << Name; 1733 } 1734 return true; 1735 } 1736 1737 // We did find operator delete/operator delete[] declarations, but 1738 // none of them were suitable. 1739 if (!Found.empty()) { 1740 if (Diagnose) { 1741 Diag(StartLoc, diag::err_no_suitable_delete_member_function_found) 1742 << Name << RD; 1743 1744 for (LookupResult::iterator F = Found.begin(), FEnd = Found.end(); 1745 F != FEnd; ++F) 1746 Diag((*F)->getUnderlyingDecl()->getLocation(), 1747 diag::note_member_declared_here) << Name; 1748 } 1749 return true; 1750 } 1751 1752 // Look for a global declaration. 1753 DeclareGlobalNewDelete(); 1754 DeclContext *TUDecl = Context.getTranslationUnitDecl(); 1755 1756 CXXNullPtrLiteralExpr Null(Context.VoidPtrTy, SourceLocation()); 1757 Expr* DeallocArgs[1]; 1758 DeallocArgs[0] = &Null; 1759 if (FindAllocationOverload(StartLoc, SourceRange(), Name, 1760 DeallocArgs, 1, TUDecl, !Diagnose, 1761 Operator, Diagnose)) 1762 return true; 1763 1764 assert(Operator && "Did not find a deallocation function!"); 1765 return false; 1766 } 1767 1768 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in: 1769 /// @code ::delete ptr; @endcode 1770 /// or 1771 /// @code delete [] ptr; @endcode 1772 ExprResult 1773 Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, 1774 bool ArrayForm, Expr *ExE) { 1775 // C++ [expr.delete]p1: 1776 // The operand shall have a pointer type, or a class type having a single 1777 // conversion function to a pointer type. The result has type void. 1778 // 1779 // DR599 amends "pointer type" to "pointer to object type" in both cases. 1780 1781 ExprResult Ex = Owned(ExE); 1782 FunctionDecl *OperatorDelete = 0; 1783 bool ArrayFormAsWritten = ArrayForm; 1784 bool UsualArrayDeleteWantsSize = false; 1785 1786 if (!Ex.get()->isTypeDependent()) { 1787 QualType Type = Ex.get()->getType(); 1788 1789 if (const RecordType *Record = Type->getAs<RecordType>()) { 1790 if (RequireCompleteType(StartLoc, Type, 1791 PDiag(diag::err_delete_incomplete_class_type))) 1792 return ExprError(); 1793 1794 SmallVector<CXXConversionDecl*, 4> ObjectPtrConversions; 1795 1796 CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); 1797 const UnresolvedSetImpl *Conversions = RD->getVisibleConversionFunctions(); 1798 for (UnresolvedSetImpl::iterator I = Conversions->begin(), 1799 E = Conversions->end(); I != E; ++I) { 1800 NamedDecl *D = I.getDecl(); 1801 if (isa<UsingShadowDecl>(D)) 1802 D = cast<UsingShadowDecl>(D)->getTargetDecl(); 1803 1804 // Skip over templated conversion functions; they aren't considered. 1805 if (isa<FunctionTemplateDecl>(D)) 1806 continue; 1807 1808 CXXConversionDecl *Conv = cast<CXXConversionDecl>(D); 1809 1810 QualType ConvType = Conv->getConversionType().getNonReferenceType(); 1811 if (const PointerType *ConvPtrType = ConvType->getAs<PointerType>()) 1812 if (ConvPtrType->getPointeeType()->isIncompleteOrObjectType()) 1813 ObjectPtrConversions.push_back(Conv); 1814 } 1815 if (ObjectPtrConversions.size() == 1) { 1816 // We have a single conversion to a pointer-to-object type. Perform 1817 // that conversion. 1818 // TODO: don't redo the conversion calculation. 1819 ExprResult Res = 1820 PerformImplicitConversion(Ex.get(), 1821 ObjectPtrConversions.front()->getConversionType(), 1822 AA_Converting); 1823 if (Res.isUsable()) { 1824 Ex = move(Res); 1825 Type = Ex.get()->getType(); 1826 } 1827 } 1828 else if (ObjectPtrConversions.size() > 1) { 1829 Diag(StartLoc, diag::err_ambiguous_delete_operand) 1830 << Type << Ex.get()->getSourceRange(); 1831 for (unsigned i= 0; i < ObjectPtrConversions.size(); i++) 1832 NoteOverloadCandidate(ObjectPtrConversions[i]); 1833 return ExprError(); 1834 } 1835 } 1836 1837 if (!Type->isPointerType()) 1838 return ExprError(Diag(StartLoc, diag::err_delete_operand) 1839 << Type << Ex.get()->getSourceRange()); 1840 1841 QualType Pointee = Type->getAs<PointerType>()->getPointeeType(); 1842 QualType PointeeElem = Context.getBaseElementType(Pointee); 1843 1844 if (unsigned AddressSpace = Pointee.getAddressSpace()) 1845 return Diag(Ex.get()->getLocStart(), 1846 diag::err_address_space_qualified_delete) 1847 << Pointee.getUnqualifiedType() << AddressSpace; 1848 1849 CXXRecordDecl *PointeeRD = 0; 1850 if (Pointee->isVoidType() && !isSFINAEContext()) { 1851 // The C++ standard bans deleting a pointer to a non-object type, which 1852 // effectively bans deletion of "void*". However, most compilers support 1853 // this, so we treat it as a warning unless we're in a SFINAE context. 1854 Diag(StartLoc, diag::ext_delete_void_ptr_operand) 1855 << Type << Ex.get()->getSourceRange(); 1856 } else if (Pointee->isFunctionType() || Pointee->isVoidType()) { 1857 return ExprError(Diag(StartLoc, diag::err_delete_operand) 1858 << Type << Ex.get()->getSourceRange()); 1859 } else if (!Pointee->isDependentType()) { 1860 if (!RequireCompleteType(StartLoc, Pointee, 1861 PDiag(diag::warn_delete_incomplete) 1862 << Ex.get()->getSourceRange())) { 1863 if (const RecordType *RT = PointeeElem->getAs<RecordType>()) 1864 PointeeRD = cast<CXXRecordDecl>(RT->getDecl()); 1865 } 1866 } 1867 1868 // C++ [expr.delete]p2: 1869 // [Note: a pointer to a const type can be the operand of a 1870 // delete-expression; it is not necessary to cast away the constness 1871 // (5.2.11) of the pointer expression before it is used as the operand 1872 // of the delete-expression. ] 1873 if (!Context.hasSameType(Ex.get()->getType(), Context.VoidPtrTy)) 1874 Ex = Owned(ImplicitCastExpr::Create(Context, Context.VoidPtrTy, CK_NoOp, 1875 Ex.take(), 0, VK_RValue)); 1876 1877 if (Pointee->isArrayType() && !ArrayForm) { 1878 Diag(StartLoc, diag::warn_delete_array_type) 1879 << Type << Ex.get()->getSourceRange() 1880 << FixItHint::CreateInsertion(PP.getLocForEndOfToken(StartLoc), "[]"); 1881 ArrayForm = true; 1882 } 1883 1884 DeclarationName DeleteName = Context.DeclarationNames.getCXXOperatorName( 1885 ArrayForm ? OO_Array_Delete : OO_Delete); 1886 1887 if (PointeeRD) { 1888 if (!UseGlobal && 1889 FindDeallocationFunction(StartLoc, PointeeRD, DeleteName, 1890 OperatorDelete)) 1891 return ExprError(); 1892 1893 // If we're allocating an array of records, check whether the 1894 // usual operator delete[] has a size_t parameter. 1895 if (ArrayForm) { 1896 // If the user specifically asked to use the global allocator, 1897 // we'll need to do the lookup into the class. 1898 if (UseGlobal) 1899 UsualArrayDeleteWantsSize = 1900 doesUsualArrayDeleteWantSize(*this, StartLoc, PointeeElem); 1901 1902 // Otherwise, the usual operator delete[] should be the 1903 // function we just found. 1904 else if (isa<CXXMethodDecl>(OperatorDelete)) 1905 UsualArrayDeleteWantsSize = (OperatorDelete->getNumParams() == 2); 1906 } 1907 1908 if (!PointeeRD->hasTrivialDestructor()) 1909 if (CXXDestructorDecl *Dtor = LookupDestructor(PointeeRD)) { 1910 MarkDeclarationReferenced(StartLoc, 1911 const_cast<CXXDestructorDecl*>(Dtor)); 1912 DiagnoseUseOfDecl(Dtor, StartLoc); 1913 } 1914 1915 // C++ [expr.delete]p3: 1916 // In the first alternative (delete object), if the static type of the 1917 // object to be deleted is different from its dynamic type, the static 1918 // type shall be a base class of the dynamic type of the object to be 1919 // deleted and the static type shall have a virtual destructor or the 1920 // behavior is undefined. 1921 // 1922 // Note: a final class cannot be derived from, no issue there 1923 if (PointeeRD->isPolymorphic() && !PointeeRD->hasAttr<FinalAttr>()) { 1924 CXXDestructorDecl *dtor = PointeeRD->getDestructor(); 1925 if (dtor && !dtor->isVirtual()) { 1926 if (PointeeRD->isAbstract()) { 1927 // If the class is abstract, we warn by default, because we're 1928 // sure the code has undefined behavior. 1929 Diag(StartLoc, diag::warn_delete_abstract_non_virtual_dtor) 1930 << PointeeElem; 1931 } else if (!ArrayForm) { 1932 // Otherwise, if this is not an array delete, it's a bit suspect, 1933 // but not necessarily wrong. 1934 Diag(StartLoc, diag::warn_delete_non_virtual_dtor) << PointeeElem; 1935 } 1936 } 1937 } 1938 1939 } else if (getLangOptions().ObjCAutoRefCount && 1940 PointeeElem->isObjCLifetimeType() && 1941 (PointeeElem.getObjCLifetime() == Qualifiers::OCL_Strong || 1942 PointeeElem.getObjCLifetime() == Qualifiers::OCL_Weak) && 1943 ArrayForm) { 1944 Diag(StartLoc, diag::warn_err_new_delete_object_array) 1945 << 1 << PointeeElem; 1946 } 1947 1948 if (!OperatorDelete) { 1949 // Look for a global declaration. 1950 DeclareGlobalNewDelete(); 1951 DeclContext *TUDecl = Context.getTranslationUnitDecl(); 1952 Expr *Arg = Ex.get(); 1953 if (FindAllocationOverload(StartLoc, SourceRange(), DeleteName, 1954 &Arg, 1, TUDecl, /*AllowMissing=*/false, 1955 OperatorDelete)) 1956 return ExprError(); 1957 } 1958 1959 MarkDeclarationReferenced(StartLoc, OperatorDelete); 1960 1961 // Check access and ambiguity of operator delete and destructor. 1962 if (PointeeRD) { 1963 if (CXXDestructorDecl *Dtor = LookupDestructor(PointeeRD)) { 1964 CheckDestructorAccess(Ex.get()->getExprLoc(), Dtor, 1965 PDiag(diag::err_access_dtor) << PointeeElem); 1966 } 1967 } 1968 1969 } 1970 1971 return Owned(new (Context) CXXDeleteExpr(Context.VoidTy, UseGlobal, ArrayForm, 1972 ArrayFormAsWritten, 1973 UsualArrayDeleteWantsSize, 1974 OperatorDelete, Ex.take(), StartLoc)); 1975 } 1976 1977 /// \brief Check the use of the given variable as a C++ condition in an if, 1978 /// while, do-while, or switch statement. 1979 ExprResult Sema::CheckConditionVariable(VarDecl *ConditionVar, 1980 SourceLocation StmtLoc, 1981 bool ConvertToBoolean) { 1982 QualType T = ConditionVar->getType(); 1983 1984 // C++ [stmt.select]p2: 1985 // The declarator shall not specify a function or an array. 1986 if (T->isFunctionType()) 1987 return ExprError(Diag(ConditionVar->getLocation(), 1988 diag::err_invalid_use_of_function_type) 1989 << ConditionVar->getSourceRange()); 1990 else if (T->isArrayType()) 1991 return ExprError(Diag(ConditionVar->getLocation(), 1992 diag::err_invalid_use_of_array_type) 1993 << ConditionVar->getSourceRange()); 1994 1995 ExprResult Condition = 1996 Owned(DeclRefExpr::Create(Context, NestedNameSpecifierLoc(), 1997 ConditionVar, 1998 ConditionVar->getLocation(), 1999 ConditionVar->getType().getNonReferenceType(), 2000 VK_LValue)); 2001 if (ConvertToBoolean) { 2002 Condition = CheckBooleanCondition(Condition.take(), StmtLoc); 2003 if (Condition.isInvalid()) 2004 return ExprError(); 2005 } 2006 2007 return move(Condition); 2008 } 2009 2010 /// CheckCXXBooleanCondition - Returns true if a conversion to bool is invalid. 2011 ExprResult Sema::CheckCXXBooleanCondition(Expr *CondExpr) { 2012 // C++ 6.4p4: 2013 // The value of a condition that is an initialized declaration in a statement 2014 // other than a switch statement is the value of the declared variable 2015 // implicitly converted to type bool. If that conversion is ill-formed, the 2016 // program is ill-formed. 2017 // The value of a condition that is an expression is the value of the 2018 // expression, implicitly converted to bool. 2019 // 2020 return PerformContextuallyConvertToBool(CondExpr); 2021 } 2022 2023 /// Helper function to determine whether this is the (deprecated) C++ 2024 /// conversion from a string literal to a pointer to non-const char or 2025 /// non-const wchar_t (for narrow and wide string literals, 2026 /// respectively). 2027 bool 2028 Sema::IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType) { 2029 // Look inside the implicit cast, if it exists. 2030 if (ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(From)) 2031 From = Cast->getSubExpr(); 2032 2033 // A string literal (2.13.4) that is not a wide string literal can 2034 // be converted to an rvalue of type "pointer to char"; a wide 2035 // string literal can be converted to an rvalue of type "pointer 2036 // to wchar_t" (C++ 4.2p2). 2037 if (StringLiteral *StrLit = dyn_cast<StringLiteral>(From->IgnoreParens())) 2038 if (const PointerType *ToPtrType = ToType->getAs<PointerType>()) 2039 if (const BuiltinType *ToPointeeType 2040 = ToPtrType->getPointeeType()->getAs<BuiltinType>()) { 2041 // This conversion is considered only when there is an 2042 // explicit appropriate pointer target type (C++ 4.2p2). 2043 if (!ToPtrType->getPointeeType().hasQualifiers()) { 2044 switch (StrLit->getKind()) { 2045 case StringLiteral::UTF8: 2046 case StringLiteral::UTF16: 2047 case StringLiteral::UTF32: 2048 // We don't allow UTF literals to be implicitly converted 2049 break; 2050 case StringLiteral::Ascii: 2051 return (ToPointeeType->getKind() == BuiltinType::Char_U || 2052 ToPointeeType->getKind() == BuiltinType::Char_S); 2053 case StringLiteral::Wide: 2054 return ToPointeeType->isWideCharType(); 2055 } 2056 } 2057 } 2058 2059 return false; 2060 } 2061 2062 static ExprResult BuildCXXCastArgument(Sema &S, 2063 SourceLocation CastLoc, 2064 QualType Ty, 2065 CastKind Kind, 2066 CXXMethodDecl *Method, 2067 DeclAccessPair FoundDecl, 2068 Expr *From) { 2069 switch (Kind) { 2070 default: llvm_unreachable("Unhandled cast kind!"); 2071 case CK_ConstructorConversion: { 2072 ASTOwningVector<Expr*> ConstructorArgs(S); 2073 2074 if (S.CompleteConstructorCall(cast<CXXConstructorDecl>(Method), 2075 MultiExprArg(&From, 1), 2076 CastLoc, ConstructorArgs)) 2077 return ExprError(); 2078 2079 ExprResult Result = 2080 S.BuildCXXConstructExpr(CastLoc, Ty, cast<CXXConstructorDecl>(Method), 2081 move_arg(ConstructorArgs), 2082 /*ZeroInit*/ false, CXXConstructExpr::CK_Complete, 2083 SourceRange()); 2084 if (Result.isInvalid()) 2085 return ExprError(); 2086 2087 return S.MaybeBindToTemporary(Result.takeAs<Expr>()); 2088 } 2089 2090 case CK_UserDefinedConversion: { 2091 assert(!From->getType()->isPointerType() && "Arg can't have pointer type!"); 2092 2093 // Create an implicit call expr that calls it. 2094 ExprResult Result = S.BuildCXXMemberCallExpr(From, FoundDecl, Method); 2095 if (Result.isInvalid()) 2096 return ExprError(); 2097 2098 S.CheckMemberOperatorAccess(CastLoc, From, /*arg*/ 0, FoundDecl); 2099 2100 return S.MaybeBindToTemporary(Result.get()); 2101 } 2102 } 2103 } 2104 2105 /// PerformImplicitConversion - Perform an implicit conversion of the 2106 /// expression From to the type ToType using the pre-computed implicit 2107 /// conversion sequence ICS. Returns the converted 2108 /// expression. Action is the kind of conversion we're performing, 2109 /// used in the error message. 2110 ExprResult 2111 Sema::PerformImplicitConversion(Expr *From, QualType ToType, 2112 const ImplicitConversionSequence &ICS, 2113 AssignmentAction Action, 2114 CheckedConversionKind CCK) { 2115 switch (ICS.getKind()) { 2116 case ImplicitConversionSequence::StandardConversion: { 2117 ExprResult Res = PerformImplicitConversion(From, ToType, ICS.Standard, 2118 Action, CCK); 2119 if (Res.isInvalid()) 2120 return ExprError(); 2121 From = Res.take(); 2122 break; 2123 } 2124 2125 case ImplicitConversionSequence::UserDefinedConversion: { 2126 2127 FunctionDecl *FD = ICS.UserDefined.ConversionFunction; 2128 CastKind CastKind; 2129 QualType BeforeToType; 2130 if (const CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(FD)) { 2131 CastKind = CK_UserDefinedConversion; 2132 2133 // If the user-defined conversion is specified by a conversion function, 2134 // the initial standard conversion sequence converts the source type to 2135 // the implicit object parameter of the conversion function. 2136 BeforeToType = Context.getTagDeclType(Conv->getParent()); 2137 } else { 2138 const CXXConstructorDecl *Ctor = cast<CXXConstructorDecl>(FD); 2139 CastKind = CK_ConstructorConversion; 2140 // Do no conversion if dealing with ... for the first conversion. 2141 if (!ICS.UserDefined.EllipsisConversion) { 2142 // If the user-defined conversion is specified by a constructor, the 2143 // initial standard conversion sequence converts the source type to the 2144 // type required by the argument of the constructor 2145 BeforeToType = Ctor->getParamDecl(0)->getType().getNonReferenceType(); 2146 } 2147 } 2148 // Watch out for elipsis conversion. 2149 if (!ICS.UserDefined.EllipsisConversion) { 2150 ExprResult Res = 2151 PerformImplicitConversion(From, BeforeToType, 2152 ICS.UserDefined.Before, AA_Converting, 2153 CCK); 2154 if (Res.isInvalid()) 2155 return ExprError(); 2156 From = Res.take(); 2157 } 2158 2159 ExprResult CastArg 2160 = BuildCXXCastArgument(*this, 2161 From->getLocStart(), 2162 ToType.getNonReferenceType(), 2163 CastKind, cast<CXXMethodDecl>(FD), 2164 ICS.UserDefined.FoundConversionFunction, 2165 From); 2166 2167 if (CastArg.isInvalid()) 2168 return ExprError(); 2169 2170 From = CastArg.take(); 2171 2172 return PerformImplicitConversion(From, ToType, ICS.UserDefined.After, 2173 AA_Converting, CCK); 2174 } 2175 2176 case ImplicitConversionSequence::AmbiguousConversion: 2177 ICS.DiagnoseAmbiguousConversion(*this, From->getExprLoc(), 2178 PDiag(diag::err_typecheck_ambiguous_condition) 2179 << From->getSourceRange()); 2180 return ExprError(); 2181 2182 case ImplicitConversionSequence::EllipsisConversion: 2183 llvm_unreachable("Cannot perform an ellipsis conversion"); 2184 2185 case ImplicitConversionSequence::BadConversion: 2186 return ExprError(); 2187 } 2188 2189 // Everything went well. 2190 return Owned(From); 2191 } 2192 2193 /// PerformImplicitConversion - Perform an implicit conversion of the 2194 /// expression From to the type ToType by following the standard 2195 /// conversion sequence SCS. Returns the converted 2196 /// expression. Flavor is the context in which we're performing this 2197 /// conversion, for use in error messages. 2198 ExprResult 2199 Sema::PerformImplicitConversion(Expr *From, QualType ToType, 2200 const StandardConversionSequence& SCS, 2201 AssignmentAction Action, 2202 CheckedConversionKind CCK) { 2203 bool CStyle = (CCK == CCK_CStyleCast || CCK == CCK_FunctionalCast); 2204 2205 // Overall FIXME: we are recomputing too many types here and doing far too 2206 // much extra work. What this means is that we need to keep track of more 2207 // information that is computed when we try the implicit conversion initially, 2208 // so that we don't need to recompute anything here. 2209 QualType FromType = From->getType(); 2210 2211 if (SCS.CopyConstructor) { 2212 // FIXME: When can ToType be a reference type? 2213 assert(!ToType->isReferenceType()); 2214 if (SCS.Second == ICK_Derived_To_Base) { 2215 ASTOwningVector<Expr*> ConstructorArgs(*this); 2216 if (CompleteConstructorCall(cast<CXXConstructorDecl>(SCS.CopyConstructor), 2217 MultiExprArg(*this, &From, 1), 2218 /*FIXME:ConstructLoc*/SourceLocation(), 2219 ConstructorArgs)) 2220 return ExprError(); 2221 return BuildCXXConstructExpr(/*FIXME:ConstructLoc*/SourceLocation(), 2222 ToType, SCS.CopyConstructor, 2223 move_arg(ConstructorArgs), 2224 /*ZeroInit*/ false, 2225 CXXConstructExpr::CK_Complete, 2226 SourceRange()); 2227 } 2228 return BuildCXXConstructExpr(/*FIXME:ConstructLoc*/SourceLocation(), 2229 ToType, SCS.CopyConstructor, 2230 MultiExprArg(*this, &From, 1), 2231 /*ZeroInit*/ false, 2232 CXXConstructExpr::CK_Complete, 2233 SourceRange()); 2234 } 2235 2236 // Resolve overloaded function references. 2237 if (Context.hasSameType(FromType, Context.OverloadTy)) { 2238 DeclAccessPair Found; 2239 FunctionDecl *Fn = ResolveAddressOfOverloadedFunction(From, ToType, 2240 true, Found); 2241 if (!Fn) 2242 return ExprError(); 2243 2244 if (DiagnoseUseOfDecl(Fn, From->getSourceRange().getBegin())) 2245 return ExprError(); 2246 2247 From = FixOverloadedFunctionReference(From, Found, Fn); 2248 FromType = From->getType(); 2249 } 2250 2251 // Perform the first implicit conversion. 2252 switch (SCS.First) { 2253 case ICK_Identity: 2254 // Nothing to do. 2255 break; 2256 2257 case ICK_Lvalue_To_Rvalue: 2258 // Should this get its own ICK? 2259 if (From->getObjectKind() == OK_ObjCProperty) { 2260 ExprResult FromRes = ConvertPropertyForRValue(From); 2261 if (FromRes.isInvalid()) 2262 return ExprError(); 2263 From = FromRes.take(); 2264 if (!From->isGLValue()) break; 2265 } 2266 2267 FromType = FromType.getUnqualifiedType(); 2268 From = ImplicitCastExpr::Create(Context, FromType, CK_LValueToRValue, 2269 From, 0, VK_RValue); 2270 break; 2271 2272 case ICK_Array_To_Pointer: 2273 FromType = Context.getArrayDecayedType(FromType); 2274 From = ImpCastExprToType(From, FromType, CK_ArrayToPointerDecay, 2275 VK_RValue, /*BasePath=*/0, CCK).take(); 2276 break; 2277 2278 case ICK_Function_To_Pointer: 2279 FromType = Context.getPointerType(FromType); 2280 From = ImpCastExprToType(From, FromType, CK_FunctionToPointerDecay, 2281 VK_RValue, /*BasePath=*/0, CCK).take(); 2282 break; 2283 2284 default: 2285 llvm_unreachable("Improper first standard conversion"); 2286 } 2287 2288 // Perform the second implicit conversion 2289 switch (SCS.Second) { 2290 case ICK_Identity: 2291 // If both sides are functions (or pointers/references to them), there could 2292 // be incompatible exception declarations. 2293 if (CheckExceptionSpecCompatibility(From, ToType)) 2294 return ExprError(); 2295 // Nothing else to do. 2296 break; 2297 2298 case ICK_NoReturn_Adjustment: 2299 // If both sides are functions (or pointers/references to them), there could 2300 // be incompatible exception declarations. 2301 if (CheckExceptionSpecCompatibility(From, ToType)) 2302 return ExprError(); 2303 2304 From = ImpCastExprToType(From, ToType, CK_NoOp, 2305 VK_RValue, /*BasePath=*/0, CCK).take(); 2306 break; 2307 2308 case ICK_Integral_Promotion: 2309 case ICK_Integral_Conversion: 2310 From = ImpCastExprToType(From, ToType, CK_IntegralCast, 2311 VK_RValue, /*BasePath=*/0, CCK).take(); 2312 break; 2313 2314 case ICK_Floating_Promotion: 2315 case ICK_Floating_Conversion: 2316 From = ImpCastExprToType(From, ToType, CK_FloatingCast, 2317 VK_RValue, /*BasePath=*/0, CCK).take(); 2318 break; 2319 2320 case ICK_Complex_Promotion: 2321 case ICK_Complex_Conversion: { 2322 QualType FromEl = From->getType()->getAs<ComplexType>()->getElementType(); 2323 QualType ToEl = ToType->getAs<ComplexType>()->getElementType(); 2324 CastKind CK; 2325 if (FromEl->isRealFloatingType()) { 2326 if (ToEl->isRealFloatingType()) 2327 CK = CK_FloatingComplexCast; 2328 else 2329 CK = CK_FloatingComplexToIntegralComplex; 2330 } else if (ToEl->isRealFloatingType()) { 2331 CK = CK_IntegralComplexToFloatingComplex; 2332 } else { 2333 CK = CK_IntegralComplexCast; 2334 } 2335 From = ImpCastExprToType(From, ToType, CK, 2336 VK_RValue, /*BasePath=*/0, CCK).take(); 2337 break; 2338 } 2339 2340 case ICK_Floating_Integral: 2341 if (ToType->isRealFloatingType()) 2342 From = ImpCastExprToType(From, ToType, CK_IntegralToFloating, 2343 VK_RValue, /*BasePath=*/0, CCK).take(); 2344 else 2345 From = ImpCastExprToType(From, ToType, CK_FloatingToIntegral, 2346 VK_RValue, /*BasePath=*/0, CCK).take(); 2347 break; 2348 2349 case ICK_Compatible_Conversion: 2350 From = ImpCastExprToType(From, ToType, CK_NoOp, 2351 VK_RValue, /*BasePath=*/0, CCK).take(); 2352 break; 2353 2354 case ICK_Writeback_Conversion: 2355 case ICK_Pointer_Conversion: { 2356 if (SCS.IncompatibleObjC && Action != AA_Casting) { 2357 // Diagnose incompatible Objective-C conversions 2358 if (Action == AA_Initializing || Action == AA_Assigning) 2359 Diag(From->getSourceRange().getBegin(), 2360 diag::ext_typecheck_convert_incompatible_pointer) 2361 << ToType << From->getType() << Action 2362 << From->getSourceRange() << 0; 2363 else 2364 Diag(From->getSourceRange().getBegin(), 2365 diag::ext_typecheck_convert_incompatible_pointer) 2366 << From->getType() << ToType << Action 2367 << From->getSourceRange() << 0; 2368 2369 if (From->getType()->isObjCObjectPointerType() && 2370 ToType->isObjCObjectPointerType()) 2371 EmitRelatedResultTypeNote(From); 2372 } 2373 else if (getLangOptions().ObjCAutoRefCount && 2374 !CheckObjCARCUnavailableWeakConversion(ToType, 2375 From->getType())) { 2376 if (Action == AA_Initializing) 2377 Diag(From->getSourceRange().getBegin(), 2378 diag::err_arc_weak_unavailable_assign); 2379 else 2380 Diag(From->getSourceRange().getBegin(), 2381 diag::err_arc_convesion_of_weak_unavailable) 2382 << (Action == AA_Casting) << From->getType() << ToType 2383 << From->getSourceRange(); 2384 } 2385 2386 CastKind Kind = CK_Invalid; 2387 CXXCastPath BasePath; 2388 if (CheckPointerConversion(From, ToType, Kind, BasePath, CStyle)) 2389 return ExprError(); 2390 2391 // Make sure we extend blocks if necessary. 2392 // FIXME: doing this here is really ugly. 2393 if (Kind == CK_BlockPointerToObjCPointerCast) { 2394 ExprResult E = From; 2395 (void) PrepareCastToObjCObjectPointer(E); 2396 From = E.take(); 2397 } 2398 2399 From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK) 2400 .take(); 2401 break; 2402 } 2403 2404 case ICK_Pointer_Member: { 2405 CastKind Kind = CK_Invalid; 2406 CXXCastPath BasePath; 2407 if (CheckMemberPointerConversion(From, ToType, Kind, BasePath, CStyle)) 2408 return ExprError(); 2409 if (CheckExceptionSpecCompatibility(From, ToType)) 2410 return ExprError(); 2411 From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK) 2412 .take(); 2413 break; 2414 } 2415 2416 case ICK_Boolean_Conversion: 2417 From = ImpCastExprToType(From, Context.BoolTy, 2418 ScalarTypeToBooleanCastKind(FromType), 2419 VK_RValue, /*BasePath=*/0, CCK).take(); 2420 break; 2421 2422 case ICK_Derived_To_Base: { 2423 CXXCastPath BasePath; 2424 if (CheckDerivedToBaseConversion(From->getType(), 2425 ToType.getNonReferenceType(), 2426 From->getLocStart(), 2427 From->getSourceRange(), 2428 &BasePath, 2429 CStyle)) 2430 return ExprError(); 2431 2432 From = ImpCastExprToType(From, ToType.getNonReferenceType(), 2433 CK_DerivedToBase, From->getValueKind(), 2434 &BasePath, CCK).take(); 2435 break; 2436 } 2437 2438 case ICK_Vector_Conversion: 2439 From = ImpCastExprToType(From, ToType, CK_BitCast, 2440 VK_RValue, /*BasePath=*/0, CCK).take(); 2441 break; 2442 2443 case ICK_Vector_Splat: 2444 From = ImpCastExprToType(From, ToType, CK_VectorSplat, 2445 VK_RValue, /*BasePath=*/0, CCK).take(); 2446 break; 2447 2448 case ICK_Complex_Real: 2449 // Case 1. x -> _Complex y 2450 if (const ComplexType *ToComplex = ToType->getAs<ComplexType>()) { 2451 QualType ElType = ToComplex->getElementType(); 2452 bool isFloatingComplex = ElType->isRealFloatingType(); 2453 2454 // x -> y 2455 if (Context.hasSameUnqualifiedType(ElType, From->getType())) { 2456 // do nothing 2457 } else if (From->getType()->isRealFloatingType()) { 2458 From = ImpCastExprToType(From, ElType, 2459 isFloatingComplex ? CK_FloatingCast : CK_FloatingToIntegral).take(); 2460 } else { 2461 assert(From->getType()->isIntegerType()); 2462 From = ImpCastExprToType(From, ElType, 2463 isFloatingComplex ? CK_IntegralToFloating : CK_IntegralCast).take(); 2464 } 2465 // y -> _Complex y 2466 From = ImpCastExprToType(From, ToType, 2467 isFloatingComplex ? CK_FloatingRealToComplex 2468 : CK_IntegralRealToComplex).take(); 2469 2470 // Case 2. _Complex x -> y 2471 } else { 2472 const ComplexType *FromComplex = From->getType()->getAs<ComplexType>(); 2473 assert(FromComplex); 2474 2475 QualType ElType = FromComplex->getElementType(); 2476 bool isFloatingComplex = ElType->isRealFloatingType(); 2477 2478 // _Complex x -> x 2479 From = ImpCastExprToType(From, ElType, 2480 isFloatingComplex ? CK_FloatingComplexToReal 2481 : CK_IntegralComplexToReal, 2482 VK_RValue, /*BasePath=*/0, CCK).take(); 2483 2484 // x -> y 2485 if (Context.hasSameUnqualifiedType(ElType, ToType)) { 2486 // do nothing 2487 } else if (ToType->isRealFloatingType()) { 2488 From = ImpCastExprToType(From, ToType, 2489 isFloatingComplex ? CK_FloatingCast : CK_IntegralToFloating, 2490 VK_RValue, /*BasePath=*/0, CCK).take(); 2491 } else { 2492 assert(ToType->isIntegerType()); 2493 From = ImpCastExprToType(From, ToType, 2494 isFloatingComplex ? CK_FloatingToIntegral : CK_IntegralCast, 2495 VK_RValue, /*BasePath=*/0, CCK).take(); 2496 } 2497 } 2498 break; 2499 2500 case ICK_Block_Pointer_Conversion: { 2501 From = ImpCastExprToType(From, ToType.getUnqualifiedType(), CK_BitCast, 2502 VK_RValue, /*BasePath=*/0, CCK).take(); 2503 break; 2504 } 2505 2506 case ICK_TransparentUnionConversion: { 2507 ExprResult FromRes = Owned(From); 2508 Sema::AssignConvertType ConvTy = 2509 CheckTransparentUnionArgumentConstraints(ToType, FromRes); 2510 if (FromRes.isInvalid()) 2511 return ExprError(); 2512 From = FromRes.take(); 2513 assert ((ConvTy == Sema::Compatible) && 2514 "Improper transparent union conversion"); 2515 (void)ConvTy; 2516 break; 2517 } 2518 2519 case ICK_Lvalue_To_Rvalue: 2520 case ICK_Array_To_Pointer: 2521 case ICK_Function_To_Pointer: 2522 case ICK_Qualification: 2523 case ICK_Num_Conversion_Kinds: 2524 llvm_unreachable("Improper second standard conversion"); 2525 } 2526 2527 switch (SCS.Third) { 2528 case ICK_Identity: 2529 // Nothing to do. 2530 break; 2531 2532 case ICK_Qualification: { 2533 // The qualification keeps the category of the inner expression, unless the 2534 // target type isn't a reference. 2535 ExprValueKind VK = ToType->isReferenceType() ? 2536 From->getValueKind() : VK_RValue; 2537 From = ImpCastExprToType(From, ToType.getNonLValueExprType(Context), 2538 CK_NoOp, VK, /*BasePath=*/0, CCK).take(); 2539 2540 if (SCS.DeprecatedStringLiteralToCharPtr && 2541 !getLangOptions().WritableStrings) 2542 Diag(From->getLocStart(), diag::warn_deprecated_string_literal_conversion) 2543 << ToType.getNonReferenceType(); 2544 2545 break; 2546 } 2547 2548 default: 2549 llvm_unreachable("Improper third standard conversion"); 2550 } 2551 2552 return Owned(From); 2553 } 2554 2555 ExprResult Sema::ActOnUnaryTypeTrait(UnaryTypeTrait UTT, 2556 SourceLocation KWLoc, 2557 ParsedType Ty, 2558 SourceLocation RParen) { 2559 TypeSourceInfo *TSInfo; 2560 QualType T = GetTypeFromParser(Ty, &TSInfo); 2561 2562 if (!TSInfo) 2563 TSInfo = Context.getTrivialTypeSourceInfo(T); 2564 return BuildUnaryTypeTrait(UTT, KWLoc, TSInfo, RParen); 2565 } 2566 2567 /// \brief Check the completeness of a type in a unary type trait. 2568 /// 2569 /// If the particular type trait requires a complete type, tries to complete 2570 /// it. If completing the type fails, a diagnostic is emitted and false 2571 /// returned. If completing the type succeeds or no completion was required, 2572 /// returns true. 2573 static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, 2574 UnaryTypeTrait UTT, 2575 SourceLocation Loc, 2576 QualType ArgTy) { 2577 // C++0x [meta.unary.prop]p3: 2578 // For all of the class templates X declared in this Clause, instantiating 2579 // that template with a template argument that is a class template 2580 // specialization may result in the implicit instantiation of the template 2581 // argument if and only if the semantics of X require that the argument 2582 // must be a complete type. 2583 // We apply this rule to all the type trait expressions used to implement 2584 // these class templates. We also try to follow any GCC documented behavior 2585 // in these expressions to ensure portability of standard libraries. 2586 switch (UTT) { 2587 // is_complete_type somewhat obviously cannot require a complete type. 2588 case UTT_IsCompleteType: 2589 // Fall-through 2590 2591 // These traits are modeled on the type predicates in C++0x 2592 // [meta.unary.cat] and [meta.unary.comp]. They are not specified as 2593 // requiring a complete type, as whether or not they return true cannot be 2594 // impacted by the completeness of the type. 2595 case UTT_IsVoid: 2596 case UTT_IsIntegral: 2597 case UTT_IsFloatingPoint: 2598 case UTT_IsArray: 2599 case UTT_IsPointer: 2600 case UTT_IsLvalueReference: 2601 case UTT_IsRvalueReference: 2602 case UTT_IsMemberFunctionPointer: 2603 case UTT_IsMemberObjectPointer: 2604 case UTT_IsEnum: 2605 case UTT_IsUnion: 2606 case UTT_IsClass: 2607 case UTT_IsFunction: 2608 case UTT_IsReference: 2609 case UTT_IsArithmetic: 2610 case UTT_IsFundamental: 2611 case UTT_IsObject: 2612 case UTT_IsScalar: 2613 case UTT_IsCompound: 2614 case UTT_IsMemberPointer: 2615 // Fall-through 2616 2617 // These traits are modeled on type predicates in C++0x [meta.unary.prop] 2618 // which requires some of its traits to have the complete type. However, 2619 // the completeness of the type cannot impact these traits' semantics, and 2620 // so they don't require it. This matches the comments on these traits in 2621 // Table 49. 2622 case UTT_IsConst: 2623 case UTT_IsVolatile: 2624 case UTT_IsSigned: 2625 case UTT_IsUnsigned: 2626 return true; 2627 2628 // C++0x [meta.unary.prop] Table 49 requires the following traits to be 2629 // applied to a complete type. 2630 case UTT_IsTrivial: 2631 case UTT_IsTriviallyCopyable: 2632 case UTT_IsStandardLayout: 2633 case UTT_IsPOD: 2634 case UTT_IsLiteral: 2635 case UTT_IsEmpty: 2636 case UTT_IsPolymorphic: 2637 case UTT_IsAbstract: 2638 // Fall-through 2639 2640 // These trait expressions are designed to help implement predicates in 2641 // [meta.unary.prop] despite not being named the same. They are specified 2642 // by both GCC and the Embarcadero C++ compiler, and require the complete 2643 // type due to the overarching C++0x type predicates being implemented 2644 // requiring the complete type. 2645 case UTT_HasNothrowAssign: 2646 case UTT_HasNothrowConstructor: 2647 case UTT_HasNothrowCopy: 2648 case UTT_HasTrivialAssign: 2649 case UTT_HasTrivialDefaultConstructor: 2650 case UTT_HasTrivialCopy: 2651 case UTT_HasTrivialDestructor: 2652 case UTT_HasVirtualDestructor: 2653 // Arrays of unknown bound are expressly allowed. 2654 QualType ElTy = ArgTy; 2655 if (ArgTy->isIncompleteArrayType()) 2656 ElTy = S.Context.getAsArrayType(ArgTy)->getElementType(); 2657 2658 // The void type is expressly allowed. 2659 if (ElTy->isVoidType()) 2660 return true; 2661 2662 return !S.RequireCompleteType( 2663 Loc, ElTy, diag::err_incomplete_type_used_in_type_trait_expr); 2664 } 2665 llvm_unreachable("Type trait not handled by switch"); 2666 } 2667 2668 static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT, 2669 SourceLocation KeyLoc, QualType T) { 2670 assert(!T->isDependentType() && "Cannot evaluate traits of dependent type"); 2671 2672 ASTContext &C = Self.Context; 2673 switch(UTT) { 2674 // Type trait expressions corresponding to the primary type category 2675 // predicates in C++0x [meta.unary.cat]. 2676 case UTT_IsVoid: 2677 return T->isVoidType(); 2678 case UTT_IsIntegral: 2679 return T->isIntegralType(C); 2680 case UTT_IsFloatingPoint: 2681 return T->isFloatingType(); 2682 case UTT_IsArray: 2683 return T->isArrayType(); 2684 case UTT_IsPointer: 2685 return T->isPointerType(); 2686 case UTT_IsLvalueReference: 2687 return T->isLValueReferenceType(); 2688 case UTT_IsRvalueReference: 2689 return T->isRValueReferenceType(); 2690 case UTT_IsMemberFunctionPointer: 2691 return T->isMemberFunctionPointerType(); 2692 case UTT_IsMemberObjectPointer: 2693 return T->isMemberDataPointerType(); 2694 case UTT_IsEnum: 2695 return T->isEnumeralType(); 2696 case UTT_IsUnion: 2697 return T->isUnionType(); 2698 case UTT_IsClass: 2699 return T->isClassType() || T->isStructureType(); 2700 case UTT_IsFunction: 2701 return T->isFunctionType(); 2702 2703 // Type trait expressions which correspond to the convenient composition 2704 // predicates in C++0x [meta.unary.comp]. 2705 case UTT_IsReference: 2706 return T->isReferenceType(); 2707 case UTT_IsArithmetic: 2708 return T->isArithmeticType() && !T->isEnumeralType(); 2709 case UTT_IsFundamental: 2710 return T->isFundamentalType(); 2711 case UTT_IsObject: 2712 return T->isObjectType(); 2713 case UTT_IsScalar: 2714 // Note: semantic analysis depends on Objective-C lifetime types to be 2715 // considered scalar types. However, such types do not actually behave 2716 // like scalar types at run time (since they may require retain/release 2717 // operations), so we report them as non-scalar. 2718 if (T->isObjCLifetimeType()) { 2719 switch (T.getObjCLifetime()) { 2720 case Qualifiers::OCL_None: 2721 case Qualifiers::OCL_ExplicitNone: 2722 return true; 2723 2724 case Qualifiers::OCL_Strong: 2725 case Qualifiers::OCL_Weak: 2726 case Qualifiers::OCL_Autoreleasing: 2727 return false; 2728 } 2729 } 2730 2731 return T->isScalarType(); 2732 case UTT_IsCompound: 2733 return T->isCompoundType(); 2734 case UTT_IsMemberPointer: 2735 return T->isMemberPointerType(); 2736 2737 // Type trait expressions which correspond to the type property predicates 2738 // in C++0x [meta.unary.prop]. 2739 case UTT_IsConst: 2740 return T.isConstQualified(); 2741 case UTT_IsVolatile: 2742 return T.isVolatileQualified(); 2743 case UTT_IsTrivial: 2744 return T.isTrivialType(Self.Context); 2745 case UTT_IsTriviallyCopyable: 2746 return T.isTriviallyCopyableType(Self.Context); 2747 case UTT_IsStandardLayout: 2748 return T->isStandardLayoutType(); 2749 case UTT_IsPOD: 2750 return T.isPODType(Self.Context); 2751 case UTT_IsLiteral: 2752 return T->isLiteralType(); 2753 case UTT_IsEmpty: 2754 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) 2755 return !RD->isUnion() && RD->isEmpty(); 2756 return false; 2757 case UTT_IsPolymorphic: 2758 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) 2759 return RD->isPolymorphic(); 2760 return false; 2761 case UTT_IsAbstract: 2762 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) 2763 return RD->isAbstract(); 2764 return false; 2765 case UTT_IsSigned: 2766 return T->isSignedIntegerType(); 2767 case UTT_IsUnsigned: 2768 return T->isUnsignedIntegerType(); 2769 2770 // Type trait expressions which query classes regarding their construction, 2771 // destruction, and copying. Rather than being based directly on the 2772 // related type predicates in the standard, they are specified by both 2773 // GCC[1] and the Embarcadero C++ compiler[2], and Clang implements those 2774 // specifications. 2775 // 2776 // 1: http://gcc.gnu/.org/onlinedocs/gcc/Type-Traits.html 2777 // 2: http://docwiki.embarcadero.com/RADStudio/XE/en/Type_Trait_Functions_(C%2B%2B0x)_Index 2778 case UTT_HasTrivialDefaultConstructor: 2779 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2780 // If __is_pod (type) is true then the trait is true, else if type is 2781 // a cv class or union type (or array thereof) with a trivial default 2782 // constructor ([class.ctor]) then the trait is true, else it is false. 2783 if (T.isPODType(Self.Context)) 2784 return true; 2785 if (const RecordType *RT = 2786 C.getBaseElementType(T)->getAs<RecordType>()) 2787 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDefaultConstructor(); 2788 return false; 2789 case UTT_HasTrivialCopy: 2790 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2791 // If __is_pod (type) is true or type is a reference type then 2792 // the trait is true, else if type is a cv class or union type 2793 // with a trivial copy constructor ([class.copy]) then the trait 2794 // is true, else it is false. 2795 if (T.isPODType(Self.Context) || T->isReferenceType()) 2796 return true; 2797 if (const RecordType *RT = T->getAs<RecordType>()) 2798 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyConstructor(); 2799 return false; 2800 case UTT_HasTrivialAssign: 2801 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2802 // If type is const qualified or is a reference type then the 2803 // trait is false. Otherwise if __is_pod (type) is true then the 2804 // trait is true, else if type is a cv class or union type with 2805 // a trivial copy assignment ([class.copy]) then the trait is 2806 // true, else it is false. 2807 // Note: the const and reference restrictions are interesting, 2808 // given that const and reference members don't prevent a class 2809 // from having a trivial copy assignment operator (but do cause 2810 // errors if the copy assignment operator is actually used, q.v. 2811 // [class.copy]p12). 2812 2813 if (C.getBaseElementType(T).isConstQualified()) 2814 return false; 2815 if (T.isPODType(Self.Context)) 2816 return true; 2817 if (const RecordType *RT = T->getAs<RecordType>()) 2818 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialCopyAssignment(); 2819 return false; 2820 case UTT_HasTrivialDestructor: 2821 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2822 // If __is_pod (type) is true or type is a reference type 2823 // then the trait is true, else if type is a cv class or union 2824 // type (or array thereof) with a trivial destructor 2825 // ([class.dtor]) then the trait is true, else it is 2826 // false. 2827 if (T.isPODType(Self.Context) || T->isReferenceType()) 2828 return true; 2829 2830 // Objective-C++ ARC: autorelease types don't require destruction. 2831 if (T->isObjCLifetimeType() && 2832 T.getObjCLifetime() == Qualifiers::OCL_Autoreleasing) 2833 return true; 2834 2835 if (const RecordType *RT = 2836 C.getBaseElementType(T)->getAs<RecordType>()) 2837 return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor(); 2838 return false; 2839 // TODO: Propagate nothrowness for implicitly declared special members. 2840 case UTT_HasNothrowAssign: 2841 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2842 // If type is const qualified or is a reference type then the 2843 // trait is false. Otherwise if __has_trivial_assign (type) 2844 // is true then the trait is true, else if type is a cv class 2845 // or union type with copy assignment operators that are known 2846 // not to throw an exception then the trait is true, else it is 2847 // false. 2848 if (C.getBaseElementType(T).isConstQualified()) 2849 return false; 2850 if (T->isReferenceType()) 2851 return false; 2852 if (T.isPODType(Self.Context) || T->isObjCLifetimeType()) 2853 return true; 2854 if (const RecordType *RT = T->getAs<RecordType>()) { 2855 CXXRecordDecl* RD = cast<CXXRecordDecl>(RT->getDecl()); 2856 if (RD->hasTrivialCopyAssignment()) 2857 return true; 2858 2859 bool FoundAssign = false; 2860 DeclarationName Name = C.DeclarationNames.getCXXOperatorName(OO_Equal); 2861 LookupResult Res(Self, DeclarationNameInfo(Name, KeyLoc), 2862 Sema::LookupOrdinaryName); 2863 if (Self.LookupQualifiedName(Res, RD)) { 2864 for (LookupResult::iterator Op = Res.begin(), OpEnd = Res.end(); 2865 Op != OpEnd; ++Op) { 2866 CXXMethodDecl *Operator = cast<CXXMethodDecl>(*Op); 2867 if (Operator->isCopyAssignmentOperator()) { 2868 FoundAssign = true; 2869 const FunctionProtoType *CPT 2870 = Operator->getType()->getAs<FunctionProtoType>(); 2871 if (CPT->getExceptionSpecType() == EST_Delayed) 2872 return false; 2873 if (!CPT->isNothrow(Self.Context)) 2874 return false; 2875 } 2876 } 2877 } 2878 2879 return FoundAssign; 2880 } 2881 return false; 2882 case UTT_HasNothrowCopy: 2883 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2884 // If __has_trivial_copy (type) is true then the trait is true, else 2885 // if type is a cv class or union type with copy constructors that are 2886 // known not to throw an exception then the trait is true, else it is 2887 // false. 2888 if (T.isPODType(C) || T->isReferenceType() || T->isObjCLifetimeType()) 2889 return true; 2890 if (const RecordType *RT = T->getAs<RecordType>()) { 2891 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 2892 if (RD->hasTrivialCopyConstructor()) 2893 return true; 2894 2895 bool FoundConstructor = false; 2896 unsigned FoundTQs; 2897 DeclContext::lookup_const_iterator Con, ConEnd; 2898 for (llvm::tie(Con, ConEnd) = Self.LookupConstructors(RD); 2899 Con != ConEnd; ++Con) { 2900 // A template constructor is never a copy constructor. 2901 // FIXME: However, it may actually be selected at the actual overload 2902 // resolution point. 2903 if (isa<FunctionTemplateDecl>(*Con)) 2904 continue; 2905 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con); 2906 if (Constructor->isCopyConstructor(FoundTQs)) { 2907 FoundConstructor = true; 2908 const FunctionProtoType *CPT 2909 = Constructor->getType()->getAs<FunctionProtoType>(); 2910 if (CPT->getExceptionSpecType() == EST_Delayed) 2911 return false; 2912 // FIXME: check whether evaluating default arguments can throw. 2913 // For now, we'll be conservative and assume that they can throw. 2914 if (!CPT->isNothrow(Self.Context) || CPT->getNumArgs() > 1) 2915 return false; 2916 } 2917 } 2918 2919 return FoundConstructor; 2920 } 2921 return false; 2922 case UTT_HasNothrowConstructor: 2923 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2924 // If __has_trivial_constructor (type) is true then the trait is 2925 // true, else if type is a cv class or union type (or array 2926 // thereof) with a default constructor that is known not to 2927 // throw an exception then the trait is true, else it is false. 2928 if (T.isPODType(C) || T->isObjCLifetimeType()) 2929 return true; 2930 if (const RecordType *RT = C.getBaseElementType(T)->getAs<RecordType>()) { 2931 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 2932 if (RD->hasTrivialDefaultConstructor()) 2933 return true; 2934 2935 DeclContext::lookup_const_iterator Con, ConEnd; 2936 for (llvm::tie(Con, ConEnd) = Self.LookupConstructors(RD); 2937 Con != ConEnd; ++Con) { 2938 // FIXME: In C++0x, a constructor template can be a default constructor. 2939 if (isa<FunctionTemplateDecl>(*Con)) 2940 continue; 2941 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con); 2942 if (Constructor->isDefaultConstructor()) { 2943 const FunctionProtoType *CPT 2944 = Constructor->getType()->getAs<FunctionProtoType>(); 2945 if (CPT->getExceptionSpecType() == EST_Delayed) 2946 return false; 2947 // TODO: check whether evaluating default arguments can throw. 2948 // For now, we'll be conservative and assume that they can throw. 2949 return CPT->isNothrow(Self.Context) && CPT->getNumArgs() == 0; 2950 } 2951 } 2952 } 2953 return false; 2954 case UTT_HasVirtualDestructor: 2955 // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: 2956 // If type is a class type with a virtual destructor ([class.dtor]) 2957 // then the trait is true, else it is false. 2958 if (const RecordType *Record = T->getAs<RecordType>()) { 2959 CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); 2960 if (CXXDestructorDecl *Destructor = Self.LookupDestructor(RD)) 2961 return Destructor->isVirtual(); 2962 } 2963 return false; 2964 2965 // These type trait expressions are modeled on the specifications for the 2966 // Embarcadero C++0x type trait functions: 2967 // http://docwiki.embarcadero.com/RADStudio/XE/en/Type_Trait_Functions_(C%2B%2B0x)_Index 2968 case UTT_IsCompleteType: 2969 // http://docwiki.embarcadero.com/RADStudio/XE/en/Is_complete_type_(typename_T_): 2970 // Returns True if and only if T is a complete type at the point of the 2971 // function call. 2972 return !T->isIncompleteType(); 2973 } 2974 llvm_unreachable("Type trait not covered by switch"); 2975 } 2976 2977 ExprResult Sema::BuildUnaryTypeTrait(UnaryTypeTrait UTT, 2978 SourceLocation KWLoc, 2979 TypeSourceInfo *TSInfo, 2980 SourceLocation RParen) { 2981 QualType T = TSInfo->getType(); 2982 if (!CheckUnaryTypeTraitTypeCompleteness(*this, UTT, KWLoc, T)) 2983 return ExprError(); 2984 2985 bool Value = false; 2986 if (!T->isDependentType()) 2987 Value = EvaluateUnaryTypeTrait(*this, UTT, KWLoc, T); 2988 2989 return Owned(new (Context) UnaryTypeTraitExpr(KWLoc, UTT, TSInfo, Value, 2990 RParen, Context.BoolTy)); 2991 } 2992 2993 ExprResult Sema::ActOnBinaryTypeTrait(BinaryTypeTrait BTT, 2994 SourceLocation KWLoc, 2995 ParsedType LhsTy, 2996 ParsedType RhsTy, 2997 SourceLocation RParen) { 2998 TypeSourceInfo *LhsTSInfo; 2999 QualType LhsT = GetTypeFromParser(LhsTy, &LhsTSInfo); 3000 if (!LhsTSInfo) 3001 LhsTSInfo = Context.getTrivialTypeSourceInfo(LhsT); 3002 3003 TypeSourceInfo *RhsTSInfo; 3004 QualType RhsT = GetTypeFromParser(RhsTy, &RhsTSInfo); 3005 if (!RhsTSInfo) 3006 RhsTSInfo = Context.getTrivialTypeSourceInfo(RhsT); 3007 3008 return BuildBinaryTypeTrait(BTT, KWLoc, LhsTSInfo, RhsTSInfo, RParen); 3009 } 3010 3011 static bool EvaluateBinaryTypeTrait(Sema &Self, BinaryTypeTrait BTT, 3012 QualType LhsT, QualType RhsT, 3013 SourceLocation KeyLoc) { 3014 assert(!LhsT->isDependentType() && !RhsT->isDependentType() && 3015 "Cannot evaluate traits of dependent types"); 3016 3017 switch(BTT) { 3018 case BTT_IsBaseOf: { 3019 // C++0x [meta.rel]p2 3020 // Base is a base class of Derived without regard to cv-qualifiers or 3021 // Base and Derived are not unions and name the same class type without 3022 // regard to cv-qualifiers. 3023 3024 const RecordType *lhsRecord = LhsT->getAs<RecordType>(); 3025 if (!lhsRecord) return false; 3026 3027 const RecordType *rhsRecord = RhsT->getAs<RecordType>(); 3028 if (!rhsRecord) return false; 3029 3030 assert(Self.Context.hasSameUnqualifiedType(LhsT, RhsT) 3031 == (lhsRecord == rhsRecord)); 3032 3033 if (lhsRecord == rhsRecord) 3034 return !lhsRecord->getDecl()->isUnion(); 3035 3036 // C++0x [meta.rel]p2: 3037 // If Base and Derived are class types and are different types 3038 // (ignoring possible cv-qualifiers) then Derived shall be a 3039 // complete type. 3040 if (Self.RequireCompleteType(KeyLoc, RhsT, 3041 diag::err_incomplete_type_used_in_type_trait_expr)) 3042 return false; 3043 3044 return cast<CXXRecordDecl>(rhsRecord->getDecl()) 3045 ->isDerivedFrom(cast<CXXRecordDecl>(lhsRecord->getDecl())); 3046 } 3047 case BTT_IsSame: 3048 return Self.Context.hasSameType(LhsT, RhsT); 3049 case BTT_TypeCompatible: 3050 return Self.Context.typesAreCompatible(LhsT.getUnqualifiedType(), 3051 RhsT.getUnqualifiedType()); 3052 case BTT_IsConvertible: 3053 case BTT_IsConvertibleTo: { 3054 // C++0x [meta.rel]p4: 3055 // Given the following function prototype: 3056 // 3057 // template <class T> 3058 // typename add_rvalue_reference<T>::type create(); 3059 // 3060 // the predicate condition for a template specialization 3061 // is_convertible<From, To> shall be satisfied if and only if 3062 // the return expression in the following code would be 3063 // well-formed, including any implicit conversions to the return 3064 // type of the function: 3065 // 3066 // To test() { 3067 // return create<From>(); 3068 // } 3069 // 3070 // Access checking is performed as if in a context unrelated to To and 3071 // From. Only the validity of the immediate context of the expression 3072 // of the return-statement (including conversions to the return type) 3073 // is considered. 3074 // 3075 // We model the initialization as a copy-initialization of a temporary 3076 // of the appropriate type, which for this expression is identical to the 3077 // return statement (since NRVO doesn't apply). 3078 if (LhsT->isObjectType() || LhsT->isFunctionType()) 3079 LhsT = Self.Context.getRValueReferenceType(LhsT); 3080 3081 InitializedEntity To(InitializedEntity::InitializeTemporary(RhsT)); 3082 OpaqueValueExpr From(KeyLoc, LhsT.getNonLValueExprType(Self.Context), 3083 Expr::getValueKindForType(LhsT)); 3084 Expr *FromPtr = &From; 3085 InitializationKind Kind(InitializationKind::CreateCopy(KeyLoc, 3086 SourceLocation())); 3087 3088 // Perform the initialization within a SFINAE trap at translation unit 3089 // scope. 3090 Sema::SFINAETrap SFINAE(Self, /*AccessCheckingSFINAE=*/true); 3091 Sema::ContextRAII TUContext(Self, Self.Context.getTranslationUnitDecl()); 3092 InitializationSequence Init(Self, To, Kind, &FromPtr, 1); 3093 if (Init.Failed()) 3094 return false; 3095 3096 ExprResult Result = Init.Perform(Self, To, Kind, MultiExprArg(&FromPtr, 1)); 3097 return !Result.isInvalid() && !SFINAE.hasErrorOccurred(); 3098 } 3099 } 3100 llvm_unreachable("Unknown type trait or not implemented"); 3101 } 3102 3103 ExprResult Sema::BuildBinaryTypeTrait(BinaryTypeTrait BTT, 3104 SourceLocation KWLoc, 3105 TypeSourceInfo *LhsTSInfo, 3106 TypeSourceInfo *RhsTSInfo, 3107 SourceLocation RParen) { 3108 QualType LhsT = LhsTSInfo->getType(); 3109 QualType RhsT = RhsTSInfo->getType(); 3110 3111 if (BTT == BTT_TypeCompatible) { 3112 if (getLangOptions().CPlusPlus) { 3113 Diag(KWLoc, diag::err_types_compatible_p_in_cplusplus) 3114 << SourceRange(KWLoc, RParen); 3115 return ExprError(); 3116 } 3117 } 3118 3119 bool Value = false; 3120 if (!LhsT->isDependentType() && !RhsT->isDependentType()) 3121 Value = EvaluateBinaryTypeTrait(*this, BTT, LhsT, RhsT, KWLoc); 3122 3123 // Select trait result type. 3124 QualType ResultType; 3125 switch (BTT) { 3126 case BTT_IsBaseOf: ResultType = Context.BoolTy; break; 3127 case BTT_IsConvertible: ResultType = Context.BoolTy; break; 3128 case BTT_IsSame: ResultType = Context.BoolTy; break; 3129 case BTT_TypeCompatible: ResultType = Context.IntTy; break; 3130 case BTT_IsConvertibleTo: ResultType = Context.BoolTy; break; 3131 } 3132 3133 return Owned(new (Context) BinaryTypeTraitExpr(KWLoc, BTT, LhsTSInfo, 3134 RhsTSInfo, Value, RParen, 3135 ResultType)); 3136 } 3137 3138 ExprResult Sema::ActOnArrayTypeTrait(ArrayTypeTrait ATT, 3139 SourceLocation KWLoc, 3140 ParsedType Ty, 3141 Expr* DimExpr, 3142 SourceLocation RParen) { 3143 TypeSourceInfo *TSInfo; 3144 QualType T = GetTypeFromParser(Ty, &TSInfo); 3145 if (!TSInfo) 3146 TSInfo = Context.getTrivialTypeSourceInfo(T); 3147 3148 return BuildArrayTypeTrait(ATT, KWLoc, TSInfo, DimExpr, RParen); 3149 } 3150 3151 static uint64_t EvaluateArrayTypeTrait(Sema &Self, ArrayTypeTrait ATT, 3152 QualType T, Expr *DimExpr, 3153 SourceLocation KeyLoc) { 3154 assert(!T->isDependentType() && "Cannot evaluate traits of dependent type"); 3155 3156 switch(ATT) { 3157 case ATT_ArrayRank: 3158 if (T->isArrayType()) { 3159 unsigned Dim = 0; 3160 while (const ArrayType *AT = Self.Context.getAsArrayType(T)) { 3161 ++Dim; 3162 T = AT->getElementType(); 3163 } 3164 return Dim; 3165 } 3166 return 0; 3167 3168 case ATT_ArrayExtent: { 3169 llvm::APSInt Value; 3170 uint64_t Dim; 3171 if (DimExpr->isIntegerConstantExpr(Value, Self.Context, 0, false)) { 3172 if (Value < llvm::APSInt(Value.getBitWidth(), Value.isUnsigned())) { 3173 Self.Diag(KeyLoc, diag::err_dimension_expr_not_constant_integer) << 3174 DimExpr->getSourceRange(); 3175 return false; 3176 } 3177 Dim = Value.getLimitedValue(); 3178 } else { 3179 Self.Diag(KeyLoc, diag::err_dimension_expr_not_constant_integer) << 3180 DimExpr->getSourceRange(); 3181 return false; 3182 } 3183 3184 if (T->isArrayType()) { 3185 unsigned D = 0; 3186 bool Matched = false; 3187 while (const ArrayType *AT = Self.Context.getAsArrayType(T)) { 3188 if (Dim == D) { 3189 Matched = true; 3190 break; 3191 } 3192 ++D; 3193 T = AT->getElementType(); 3194 } 3195 3196 if (Matched && T->isArrayType()) { 3197 if (const ConstantArrayType *CAT = Self.Context.getAsConstantArrayType(T)) 3198 return CAT->getSize().getLimitedValue(); 3199 } 3200 } 3201 return 0; 3202 } 3203 } 3204 llvm_unreachable("Unknown type trait or not implemented"); 3205 } 3206 3207 ExprResult Sema::BuildArrayTypeTrait(ArrayTypeTrait ATT, 3208 SourceLocation KWLoc, 3209 TypeSourceInfo *TSInfo, 3210 Expr* DimExpr, 3211 SourceLocation RParen) { 3212 QualType T = TSInfo->getType(); 3213 3214 // FIXME: This should likely be tracked as an APInt to remove any host 3215 // assumptions about the width of size_t on the target. 3216 uint64_t Value = 0; 3217 if (!T->isDependentType()) 3218 Value = EvaluateArrayTypeTrait(*this, ATT, T, DimExpr, KWLoc); 3219 3220 // While the specification for these traits from the Embarcadero C++ 3221 // compiler's documentation says the return type is 'unsigned int', Clang 3222 // returns 'size_t'. On Windows, the primary platform for the Embarcadero 3223 // compiler, there is no difference. On several other platforms this is an 3224 // important distinction. 3225 return Owned(new (Context) ArrayTypeTraitExpr(KWLoc, ATT, TSInfo, Value, 3226 DimExpr, RParen, 3227 Context.getSizeType())); 3228 } 3229 3230 ExprResult Sema::ActOnExpressionTrait(ExpressionTrait ET, 3231 SourceLocation KWLoc, 3232 Expr *Queried, 3233 SourceLocation RParen) { 3234 // If error parsing the expression, ignore. 3235 if (!Queried) 3236 return ExprError(); 3237 3238 ExprResult Result = BuildExpressionTrait(ET, KWLoc, Queried, RParen); 3239 3240 return move(Result); 3241 } 3242 3243 static bool EvaluateExpressionTrait(ExpressionTrait ET, Expr *E) { 3244 switch (ET) { 3245 case ET_IsLValueExpr: return E->isLValue(); 3246 case ET_IsRValueExpr: return E->isRValue(); 3247 } 3248 llvm_unreachable("Expression trait not covered by switch"); 3249 } 3250 3251 ExprResult Sema::BuildExpressionTrait(ExpressionTrait ET, 3252 SourceLocation KWLoc, 3253 Expr *Queried, 3254 SourceLocation RParen) { 3255 if (Queried->isTypeDependent()) { 3256 // Delay type-checking for type-dependent expressions. 3257 } else if (Queried->getType()->isPlaceholderType()) { 3258 ExprResult PE = CheckPlaceholderExpr(Queried); 3259 if (PE.isInvalid()) return ExprError(); 3260 return BuildExpressionTrait(ET, KWLoc, PE.take(), RParen); 3261 } 3262 3263 bool Value = EvaluateExpressionTrait(ET, Queried); 3264 3265 return Owned(new (Context) ExpressionTraitExpr(KWLoc, ET, Queried, Value, 3266 RParen, Context.BoolTy)); 3267 } 3268 3269 QualType Sema::CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, 3270 ExprValueKind &VK, 3271 SourceLocation Loc, 3272 bool isIndirect) { 3273 assert(!LHS.get()->getType()->isPlaceholderType() && 3274 !RHS.get()->getType()->isPlaceholderType() && 3275 "placeholders should have been weeded out by now"); 3276 3277 // The LHS undergoes lvalue conversions if this is ->*. 3278 if (isIndirect) { 3279 LHS = DefaultLvalueConversion(LHS.take()); 3280 if (LHS.isInvalid()) return QualType(); 3281 } 3282 3283 // The RHS always undergoes lvalue conversions. 3284 RHS = DefaultLvalueConversion(RHS.take()); 3285 if (RHS.isInvalid()) return QualType(); 3286 3287 const char *OpSpelling = isIndirect ? "->*" : ".*"; 3288 // C++ 5.5p2 3289 // The binary operator .* [p3: ->*] binds its second operand, which shall 3290 // be of type "pointer to member of T" (where T is a completely-defined 3291 // class type) [...] 3292 QualType RHSType = RHS.get()->getType(); 3293 const MemberPointerType *MemPtr = RHSType->getAs<MemberPointerType>(); 3294 if (!MemPtr) { 3295 Diag(Loc, diag::err_bad_memptr_rhs) 3296 << OpSpelling << RHSType << RHS.get()->getSourceRange(); 3297 return QualType(); 3298 } 3299 3300 QualType Class(MemPtr->getClass(), 0); 3301 3302 // Note: C++ [expr.mptr.oper]p2-3 says that the class type into which the 3303 // member pointer points must be completely-defined. However, there is no 3304 // reason for this semantic distinction, and the rule is not enforced by 3305 // other compilers. Therefore, we do not check this property, as it is 3306 // likely to be considered a defect. 3307 3308 // C++ 5.5p2 3309 // [...] to its first operand, which shall be of class T or of a class of 3310 // which T is an unambiguous and accessible base class. [p3: a pointer to 3311 // such a class] 3312 QualType LHSType = LHS.get()->getType(); 3313 if (isIndirect) { 3314 if (const PointerType *Ptr = LHSType->getAs<PointerType>()) 3315 LHSType = Ptr->getPointeeType(); 3316 else { 3317 Diag(Loc, diag::err_bad_memptr_lhs) 3318 << OpSpelling << 1 << LHSType 3319 << FixItHint::CreateReplacement(SourceRange(Loc), ".*"); 3320 return QualType(); 3321 } 3322 } 3323 3324 if (!Context.hasSameUnqualifiedType(Class, LHSType)) { 3325 // If we want to check the hierarchy, we need a complete type. 3326 if (RequireCompleteType(Loc, LHSType, PDiag(diag::err_bad_memptr_lhs) 3327 << OpSpelling << (int)isIndirect)) { 3328 return QualType(); 3329 } 3330 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, 3331 /*DetectVirtual=*/false); 3332 // FIXME: Would it be useful to print full ambiguity paths, or is that 3333 // overkill? 3334 if (!IsDerivedFrom(LHSType, Class, Paths) || 3335 Paths.isAmbiguous(Context.getCanonicalType(Class))) { 3336 Diag(Loc, diag::err_bad_memptr_lhs) << OpSpelling 3337 << (int)isIndirect << LHS.get()->getType(); 3338 return QualType(); 3339 } 3340 // Cast LHS to type of use. 3341 QualType UseType = isIndirect ? Context.getPointerType(Class) : Class; 3342 ExprValueKind VK = isIndirect ? VK_RValue : LHS.get()->getValueKind(); 3343 3344 CXXCastPath BasePath; 3345 BuildBasePathArray(Paths, BasePath); 3346 LHS = ImpCastExprToType(LHS.take(), UseType, CK_DerivedToBase, VK, 3347 &BasePath); 3348 } 3349 3350 if (isa<CXXScalarValueInitExpr>(RHS.get()->IgnoreParens())) { 3351 // Diagnose use of pointer-to-member type which when used as 3352 // the functional cast in a pointer-to-member expression. 3353 Diag(Loc, diag::err_pointer_to_member_type) << isIndirect; 3354 return QualType(); 3355 } 3356 3357 // C++ 5.5p2 3358 // The result is an object or a function of the type specified by the 3359 // second operand. 3360 // The cv qualifiers are the union of those in the pointer and the left side, 3361 // in accordance with 5.5p5 and 5.2.5. 3362 QualType Result = MemPtr->getPointeeType(); 3363 Result = Context.getCVRQualifiedType(Result, LHSType.getCVRQualifiers()); 3364 3365 // C++0x [expr.mptr.oper]p6: 3366 // In a .* expression whose object expression is an rvalue, the program is 3367 // ill-formed if the second operand is a pointer to member function with 3368 // ref-qualifier &. In a ->* expression or in a .* expression whose object 3369 // expression is an lvalue, the program is ill-formed if the second operand 3370 // is a pointer to member function with ref-qualifier &&. 3371 if (const FunctionProtoType *Proto = Result->getAs<FunctionProtoType>()) { 3372 switch (Proto->getRefQualifier()) { 3373 case RQ_None: 3374 // Do nothing 3375 break; 3376 3377 case RQ_LValue: 3378 if (!isIndirect && !LHS.get()->Classify(Context).isLValue()) 3379 Diag(Loc, diag::err_pointer_to_member_oper_value_classify) 3380 << RHSType << 1 << LHS.get()->getSourceRange(); 3381 break; 3382 3383 case RQ_RValue: 3384 if (isIndirect || !LHS.get()->Classify(Context).isRValue()) 3385 Diag(Loc, diag::err_pointer_to_member_oper_value_classify) 3386 << RHSType << 0 << LHS.get()->getSourceRange(); 3387 break; 3388 } 3389 } 3390 3391 // C++ [expr.mptr.oper]p6: 3392 // The result of a .* expression whose second operand is a pointer 3393 // to a data member is of the same value category as its 3394 // first operand. The result of a .* expression whose second 3395 // operand is a pointer to a member function is a prvalue. The 3396 // result of an ->* expression is an lvalue if its second operand 3397 // is a pointer to data member and a prvalue otherwise. 3398 if (Result->isFunctionType()) { 3399 VK = VK_RValue; 3400 return Context.BoundMemberTy; 3401 } else if (isIndirect) { 3402 VK = VK_LValue; 3403 } else { 3404 VK = LHS.get()->getValueKind(); 3405 } 3406 3407 return Result; 3408 } 3409 3410 /// \brief Try to convert a type to another according to C++0x 5.16p3. 3411 /// 3412 /// This is part of the parameter validation for the ? operator. If either 3413 /// value operand is a class type, the two operands are attempted to be 3414 /// converted to each other. This function does the conversion in one direction. 3415 /// It returns true if the program is ill-formed and has already been diagnosed 3416 /// as such. 3417 static bool TryClassUnification(Sema &Self, Expr *From, Expr *To, 3418 SourceLocation QuestionLoc, 3419 bool &HaveConversion, 3420 QualType &ToType) { 3421 HaveConversion = false; 3422 ToType = To->getType(); 3423 3424 InitializationKind Kind = InitializationKind::CreateCopy(To->getLocStart(), 3425 SourceLocation()); 3426 // C++0x 5.16p3 3427 // The process for determining whether an operand expression E1 of type T1 3428 // can be converted to match an operand expression E2 of type T2 is defined 3429 // as follows: 3430 // -- If E2 is an lvalue: 3431 bool ToIsLvalue = To->isLValue(); 3432 if (ToIsLvalue) { 3433 // E1 can be converted to match E2 if E1 can be implicitly converted to 3434 // type "lvalue reference to T2", subject to the constraint that in the 3435 // conversion the reference must bind directly to E1. 3436 QualType T = Self.Context.getLValueReferenceType(ToType); 3437 InitializedEntity Entity = InitializedEntity::InitializeTemporary(T); 3438 3439 InitializationSequence InitSeq(Self, Entity, Kind, &From, 1); 3440 if (InitSeq.isDirectReferenceBinding()) { 3441 ToType = T; 3442 HaveConversion = true; 3443 return false; 3444 } 3445 3446 if (InitSeq.isAmbiguous()) 3447 return InitSeq.Diagnose(Self, Entity, Kind, &From, 1); 3448 } 3449 3450 // -- If E2 is an rvalue, or if the conversion above cannot be done: 3451 // -- if E1 and E2 have class type, and the underlying class types are 3452 // the same or one is a base class of the other: 3453 QualType FTy = From->getType(); 3454 QualType TTy = To->getType(); 3455 const RecordType *FRec = FTy->getAs<RecordType>(); 3456 const RecordType *TRec = TTy->getAs<RecordType>(); 3457 bool FDerivedFromT = FRec && TRec && FRec != TRec && 3458 Self.IsDerivedFrom(FTy, TTy); 3459 if (FRec && TRec && 3460 (FRec == TRec || FDerivedFromT || Self.IsDerivedFrom(TTy, FTy))) { 3461 // E1 can be converted to match E2 if the class of T2 is the 3462 // same type as, or a base class of, the class of T1, and 3463 // [cv2 > cv1]. 3464 if (FRec == TRec || FDerivedFromT) { 3465 if (TTy.isAtLeastAsQualifiedAs(FTy)) { 3466 InitializedEntity Entity = InitializedEntity::InitializeTemporary(TTy); 3467 InitializationSequence InitSeq(Self, Entity, Kind, &From, 1); 3468 if (InitSeq) { 3469 HaveConversion = true; 3470 return false; 3471 } 3472 3473 if (InitSeq.isAmbiguous()) 3474 return InitSeq.Diagnose(Self, Entity, Kind, &From, 1); 3475 } 3476 } 3477 3478 return false; 3479 } 3480 3481 // -- Otherwise: E1 can be converted to match E2 if E1 can be 3482 // implicitly converted to the type that expression E2 would have 3483 // if E2 were converted to an rvalue (or the type it has, if E2 is 3484 // an rvalue). 3485 // 3486 // This actually refers very narrowly to the lvalue-to-rvalue conversion, not 3487 // to the array-to-pointer or function-to-pointer conversions. 3488 if (!TTy->getAs<TagType>()) 3489 TTy = TTy.getUnqualifiedType(); 3490 3491 InitializedEntity Entity = InitializedEntity::InitializeTemporary(TTy); 3492 InitializationSequence InitSeq(Self, Entity, Kind, &From, 1); 3493 HaveConversion = !InitSeq.Failed(); 3494 ToType = TTy; 3495 if (InitSeq.isAmbiguous()) 3496 return InitSeq.Diagnose(Self, Entity, Kind, &From, 1); 3497 3498 return false; 3499 } 3500 3501 /// \brief Try to find a common type for two according to C++0x 5.16p5. 3502 /// 3503 /// This is part of the parameter validation for the ? operator. If either 3504 /// value operand is a class type, overload resolution is used to find a 3505 /// conversion to a common type. 3506 static bool FindConditionalOverload(Sema &Self, ExprResult &LHS, ExprResult &RHS, 3507 SourceLocation QuestionLoc) { 3508 Expr *Args[2] = { LHS.get(), RHS.get() }; 3509 OverloadCandidateSet CandidateSet(QuestionLoc); 3510 Self.AddBuiltinOperatorCandidates(OO_Conditional, QuestionLoc, Args, 2, 3511 CandidateSet); 3512 3513 OverloadCandidateSet::iterator Best; 3514 switch (CandidateSet.BestViableFunction(Self, QuestionLoc, Best)) { 3515 case OR_Success: { 3516 // We found a match. Perform the conversions on the arguments and move on. 3517 ExprResult LHSRes = 3518 Self.PerformImplicitConversion(LHS.get(), Best->BuiltinTypes.ParamTypes[0], 3519 Best->Conversions[0], Sema::AA_Converting); 3520 if (LHSRes.isInvalid()) 3521 break; 3522 LHS = move(LHSRes); 3523 3524 ExprResult RHSRes = 3525 Self.PerformImplicitConversion(RHS.get(), Best->BuiltinTypes.ParamTypes[1], 3526 Best->Conversions[1], Sema::AA_Converting); 3527 if (RHSRes.isInvalid()) 3528 break; 3529 RHS = move(RHSRes); 3530 if (Best->Function) 3531 Self.MarkDeclarationReferenced(QuestionLoc, Best->Function); 3532 return false; 3533 } 3534 3535 case OR_No_Viable_Function: 3536 3537 // Emit a better diagnostic if one of the expressions is a null pointer 3538 // constant and the other is a pointer type. In this case, the user most 3539 // likely forgot to take the address of the other expression. 3540 if (Self.DiagnoseConditionalForNull(LHS.get(), RHS.get(), QuestionLoc)) 3541 return true; 3542 3543 Self.Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) 3544 << LHS.get()->getType() << RHS.get()->getType() 3545 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); 3546 return true; 3547 3548 case OR_Ambiguous: 3549 Self.Diag(QuestionLoc, diag::err_conditional_ambiguous_ovl) 3550 << LHS.get()->getType() << RHS.get()->getType() 3551 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); 3552 // FIXME: Print the possible common types by printing the return types of 3553 // the viable candidates. 3554 break; 3555 3556 case OR_Deleted: 3557 llvm_unreachable("Conditional operator has only built-in overloads"); 3558 } 3559 return true; 3560 } 3561 3562 /// \brief Perform an "extended" implicit conversion as returned by 3563 /// TryClassUnification. 3564 static bool ConvertForConditional(Sema &Self, ExprResult &E, QualType T) { 3565 InitializedEntity Entity = InitializedEntity::InitializeTemporary(T); 3566 InitializationKind Kind = InitializationKind::CreateCopy(E.get()->getLocStart(), 3567 SourceLocation()); 3568 Expr *Arg = E.take(); 3569 InitializationSequence InitSeq(Self, Entity, Kind, &Arg, 1); 3570 ExprResult Result = InitSeq.Perform(Self, Entity, Kind, MultiExprArg(&Arg, 1)); 3571 if (Result.isInvalid()) 3572 return true; 3573 3574 E = Result; 3575 return false; 3576 } 3577 3578 /// \brief Check the operands of ?: under C++ semantics. 3579 /// 3580 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y 3581 /// extension. In this case, LHS == Cond. (But they're not aliases.) 3582 QualType Sema::CXXCheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, 3583 ExprValueKind &VK, ExprObjectKind &OK, 3584 SourceLocation QuestionLoc) { 3585 // FIXME: Handle C99's complex types, vector types, block pointers and Obj-C++ 3586 // interface pointers. 3587 3588 // C++0x 5.16p1 3589 // The first expression is contextually converted to bool. 3590 if (!Cond.get()->isTypeDependent()) { 3591 ExprResult CondRes = CheckCXXBooleanCondition(Cond.take()); 3592 if (CondRes.isInvalid()) 3593 return QualType(); 3594 Cond = move(CondRes); 3595 } 3596 3597 // Assume r-value. 3598 VK = VK_RValue; 3599 OK = OK_Ordinary; 3600 3601 // Either of the arguments dependent? 3602 if (LHS.get()->isTypeDependent() || RHS.get()->isTypeDependent()) 3603 return Context.DependentTy; 3604 3605 // C++0x 5.16p2 3606 // If either the second or the third operand has type (cv) void, ... 3607 QualType LTy = LHS.get()->getType(); 3608 QualType RTy = RHS.get()->getType(); 3609 bool LVoid = LTy->isVoidType(); 3610 bool RVoid = RTy->isVoidType(); 3611 if (LVoid || RVoid) { 3612 // ... then the [l2r] conversions are performed on the second and third 3613 // operands ... 3614 LHS = DefaultFunctionArrayLvalueConversion(LHS.take()); 3615 RHS = DefaultFunctionArrayLvalueConversion(RHS.take()); 3616 if (LHS.isInvalid() || RHS.isInvalid()) 3617 return QualType(); 3618 LTy = LHS.get()->getType(); 3619 RTy = RHS.get()->getType(); 3620 3621 // ... and one of the following shall hold: 3622 // -- The second or the third operand (but not both) is a throw- 3623 // expression; the result is of the type of the other and is an rvalue. 3624 bool LThrow = isa<CXXThrowExpr>(LHS.get()); 3625 bool RThrow = isa<CXXThrowExpr>(RHS.get()); 3626 if (LThrow && !RThrow) 3627 return RTy; 3628 if (RThrow && !LThrow) 3629 return LTy; 3630 3631 // -- Both the second and third operands have type void; the result is of 3632 // type void and is an rvalue. 3633 if (LVoid && RVoid) 3634 return Context.VoidTy; 3635 3636 // Neither holds, error. 3637 Diag(QuestionLoc, diag::err_conditional_void_nonvoid) 3638 << (LVoid ? RTy : LTy) << (LVoid ? 0 : 1) 3639 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); 3640 return QualType(); 3641 } 3642 3643 // Neither is void. 3644 3645 // C++0x 5.16p3 3646 // Otherwise, if the second and third operand have different types, and 3647 // either has (cv) class type, and attempt is made to convert each of those 3648 // operands to the other. 3649 if (!Context.hasSameType(LTy, RTy) && 3650 (LTy->isRecordType() || RTy->isRecordType())) { 3651 ImplicitConversionSequence ICSLeftToRight, ICSRightToLeft; 3652 // These return true if a single direction is already ambiguous. 3653 QualType L2RType, R2LType; 3654 bool HaveL2R, HaveR2L; 3655 if (TryClassUnification(*this, LHS.get(), RHS.get(), QuestionLoc, HaveL2R, L2RType)) 3656 return QualType(); 3657 if (TryClassUnification(*this, RHS.get(), LHS.get(), QuestionLoc, HaveR2L, R2LType)) 3658 return QualType(); 3659 3660 // If both can be converted, [...] the program is ill-formed. 3661 if (HaveL2R && HaveR2L) { 3662 Diag(QuestionLoc, diag::err_conditional_ambiguous) 3663 << LTy << RTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); 3664 return QualType(); 3665 } 3666 3667 // If exactly one conversion is possible, that conversion is applied to 3668 // the chosen operand and the converted operands are used in place of the 3669 // original operands for the remainder of this section. 3670 if (HaveL2R) { 3671 if (ConvertForConditional(*this, LHS, L2RType) || LHS.isInvalid()) 3672 return QualType(); 3673 LTy = LHS.get()->getType(); 3674 } else if (HaveR2L) { 3675 if (ConvertForConditional(*this, RHS, R2LType) || RHS.isInvalid()) 3676 return QualType(); 3677 RTy = RHS.get()->getType(); 3678 } 3679 } 3680 3681 // C++0x 5.16p4 3682 // If the second and third operands are glvalues of the same value 3683 // category and have the same type, the result is of that type and 3684 // value category and it is a bit-field if the second or the third 3685 // operand is a bit-field, or if both are bit-fields. 3686 // We only extend this to bitfields, not to the crazy other kinds of 3687 // l-values. 3688 bool Same = Context.hasSameType(LTy, RTy); 3689 if (Same && 3690 LHS.get()->isGLValue() && 3691 LHS.get()->getValueKind() == RHS.get()->getValueKind() && 3692 LHS.get()->isOrdinaryOrBitFieldObject() && 3693 RHS.get()->isOrdinaryOrBitFieldObject()) { 3694 VK = LHS.get()->getValueKind(); 3695 if (LHS.get()->getObjectKind() == OK_BitField || 3696 RHS.get()->getObjectKind() == OK_BitField) 3697 OK = OK_BitField; 3698 return LTy; 3699 } 3700 3701 // C++0x 5.16p5 3702 // Otherwise, the result is an rvalue. If the second and third operands 3703 // do not have the same type, and either has (cv) class type, ... 3704 if (!Same && (LTy->isRecordType() || RTy->isRecordType())) { 3705 // ... overload resolution is used to determine the conversions (if any) 3706 // to be applied to the operands. If the overload resolution fails, the 3707 // program is ill-formed. 3708 if (FindConditionalOverload(*this, LHS, RHS, QuestionLoc)) 3709 return QualType(); 3710 } 3711 3712 // C++0x 5.16p6 3713 // LValue-to-rvalue, array-to-pointer, and function-to-pointer standard 3714 // conversions are performed on the second and third operands. 3715 LHS = DefaultFunctionArrayLvalueConversion(LHS.take()); 3716 RHS = DefaultFunctionArrayLvalueConversion(RHS.take()); 3717 if (LHS.isInvalid() || RHS.isInvalid()) 3718 return QualType(); 3719 LTy = LHS.get()->getType(); 3720 RTy = RHS.get()->getType(); 3721 3722 // After those conversions, one of the following shall hold: 3723 // -- The second and third operands have the same type; the result 3724 // is of that type. If the operands have class type, the result 3725 // is a prvalue temporary of the result type, which is 3726 // copy-initialized from either the second operand or the third 3727 // operand depending on the value of the first operand. 3728 if (Context.getCanonicalType(LTy) == Context.getCanonicalType(RTy)) { 3729 if (LTy->isRecordType()) { 3730 // The operands have class type. Make a temporary copy. 3731 InitializedEntity Entity = InitializedEntity::InitializeTemporary(LTy); 3732 ExprResult LHSCopy = PerformCopyInitialization(Entity, 3733 SourceLocation(), 3734 LHS); 3735 if (LHSCopy.isInvalid()) 3736 return QualType(); 3737 3738 ExprResult RHSCopy = PerformCopyInitialization(Entity, 3739 SourceLocation(), 3740 RHS); 3741 if (RHSCopy.isInvalid()) 3742 return QualType(); 3743 3744 LHS = LHSCopy; 3745 RHS = RHSCopy; 3746 } 3747 3748 return LTy; 3749 } 3750 3751 // Extension: conditional operator involving vector types. 3752 if (LTy->isVectorType() || RTy->isVectorType()) 3753 return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/false); 3754 3755 // -- The second and third operands have arithmetic or enumeration type; 3756 // the usual arithmetic conversions are performed to bring them to a 3757 // common type, and the result is of that type. 3758 if (LTy->isArithmeticType() && RTy->isArithmeticType()) { 3759 UsualArithmeticConversions(LHS, RHS); 3760 if (LHS.isInvalid() || RHS.isInvalid()) 3761 return QualType(); 3762 return LHS.get()->getType(); 3763 } 3764 3765 // -- The second and third operands have pointer type, or one has pointer 3766 // type and the other is a null pointer constant; pointer conversions 3767 // and qualification conversions are performed to bring them to their 3768 // composite pointer type. The result is of the composite pointer type. 3769 // -- The second and third operands have pointer to member type, or one has 3770 // pointer to member type and the other is a null pointer constant; 3771 // pointer to member conversions and qualification conversions are 3772 // performed to bring them to a common type, whose cv-qualification 3773 // shall match the cv-qualification of either the second or the third 3774 // operand. The result is of the common type. 3775 bool NonStandardCompositeType = false; 3776 QualType Composite = FindCompositePointerType(QuestionLoc, LHS, RHS, 3777 isSFINAEContext()? 0 : &NonStandardCompositeType); 3778 if (!Composite.isNull()) { 3779 if (NonStandardCompositeType) 3780 Diag(QuestionLoc, 3781 diag::ext_typecheck_cond_incompatible_operands_nonstandard) 3782 << LTy << RTy << Composite 3783 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); 3784 3785 return Composite; 3786 } 3787 3788 // Similarly, attempt to find composite type of two objective-c pointers. 3789 Composite = FindCompositeObjCPointerType(LHS, RHS, QuestionLoc); 3790 if (!Composite.isNull()) 3791 return Composite; 3792 3793 // Check if we are using a null with a non-pointer type. 3794 if (DiagnoseConditionalForNull(LHS.get(), RHS.get(), QuestionLoc)) 3795 return QualType(); 3796 3797 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) 3798 << LHS.get()->getType() << RHS.get()->getType() 3799 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); 3800 return QualType(); 3801 } 3802 3803 /// \brief Find a merged pointer type and convert the two expressions to it. 3804 /// 3805 /// This finds the composite pointer type (or member pointer type) for @p E1 3806 /// and @p E2 according to C++0x 5.9p2. It converts both expressions to this 3807 /// type and returns it. 3808 /// It does not emit diagnostics. 3809 /// 3810 /// \param Loc The location of the operator requiring these two expressions to 3811 /// be converted to the composite pointer type. 3812 /// 3813 /// If \p NonStandardCompositeType is non-NULL, then we are permitted to find 3814 /// a non-standard (but still sane) composite type to which both expressions 3815 /// can be converted. When such a type is chosen, \c *NonStandardCompositeType 3816 /// will be set true. 3817 QualType Sema::FindCompositePointerType(SourceLocation Loc, 3818 Expr *&E1, Expr *&E2, 3819 bool *NonStandardCompositeType) { 3820 if (NonStandardCompositeType) 3821 *NonStandardCompositeType = false; 3822 3823 assert(getLangOptions().CPlusPlus && "This function assumes C++"); 3824 QualType T1 = E1->getType(), T2 = E2->getType(); 3825 3826 if (!T1->isAnyPointerType() && !T1->isMemberPointerType() && 3827 !T2->isAnyPointerType() && !T2->isMemberPointerType()) 3828 return QualType(); 3829 3830 // C++0x 5.9p2 3831 // Pointer conversions and qualification conversions are performed on 3832 // pointer operands to bring them to their composite pointer type. If 3833 // one operand is a null pointer constant, the composite pointer type is 3834 // the type of the other operand. 3835 if (E1->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) { 3836 if (T2->isMemberPointerType()) 3837 E1 = ImpCastExprToType(E1, T2, CK_NullToMemberPointer).take(); 3838 else 3839 E1 = ImpCastExprToType(E1, T2, CK_NullToPointer).take(); 3840 return T2; 3841 } 3842 if (E2->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) { 3843 if (T1->isMemberPointerType()) 3844 E2 = ImpCastExprToType(E2, T1, CK_NullToMemberPointer).take(); 3845 else 3846 E2 = ImpCastExprToType(E2, T1, CK_NullToPointer).take(); 3847 return T1; 3848 } 3849 3850 // Now both have to be pointers or member pointers. 3851 if ((!T1->isPointerType() && !T1->isMemberPointerType()) || 3852 (!T2->isPointerType() && !T2->isMemberPointerType())) 3853 return QualType(); 3854 3855 // Otherwise, of one of the operands has type "pointer to cv1 void," then 3856 // the other has type "pointer to cv2 T" and the composite pointer type is 3857 // "pointer to cv12 void," where cv12 is the union of cv1 and cv2. 3858 // Otherwise, the composite pointer type is a pointer type similar to the 3859 // type of one of the operands, with a cv-qualification signature that is 3860 // the union of the cv-qualification signatures of the operand types. 3861 // In practice, the first part here is redundant; it's subsumed by the second. 3862 // What we do here is, we build the two possible composite types, and try the 3863 // conversions in both directions. If only one works, or if the two composite 3864 // types are the same, we have succeeded. 3865 // FIXME: extended qualifiers? 3866 typedef SmallVector<unsigned, 4> QualifierVector; 3867 QualifierVector QualifierUnion; 3868 typedef SmallVector<std::pair<const Type *, const Type *>, 4> 3869 ContainingClassVector; 3870 ContainingClassVector MemberOfClass; 3871 QualType Composite1 = Context.getCanonicalType(T1), 3872 Composite2 = Context.getCanonicalType(T2); 3873 unsigned NeedConstBefore = 0; 3874 do { 3875 const PointerType *Ptr1, *Ptr2; 3876 if ((Ptr1 = Composite1->getAs<PointerType>()) && 3877 (Ptr2 = Composite2->getAs<PointerType>())) { 3878 Composite1 = Ptr1->getPointeeType(); 3879 Composite2 = Ptr2->getPointeeType(); 3880 3881 // If we're allowed to create a non-standard composite type, keep track 3882 // of where we need to fill in additional 'const' qualifiers. 3883 if (NonStandardCompositeType && 3884 Composite1.getCVRQualifiers() != Composite2.getCVRQualifiers()) 3885 NeedConstBefore = QualifierUnion.size(); 3886 3887 QualifierUnion.push_back( 3888 Composite1.getCVRQualifiers() | Composite2.getCVRQualifiers()); 3889 MemberOfClass.push_back(std::make_pair((const Type *)0, (const Type *)0)); 3890 continue; 3891 } 3892 3893 const MemberPointerType *MemPtr1, *MemPtr2; 3894 if ((MemPtr1 = Composite1->getAs<MemberPointerType>()) && 3895 (MemPtr2 = Composite2->getAs<MemberPointerType>())) { 3896 Composite1 = MemPtr1->getPointeeType(); 3897 Composite2 = MemPtr2->getPointeeType(); 3898 3899 // If we're allowed to create a non-standard composite type, keep track 3900 // of where we need to fill in additional 'const' qualifiers. 3901 if (NonStandardCompositeType && 3902 Composite1.getCVRQualifiers() != Composite2.getCVRQualifiers()) 3903 NeedConstBefore = QualifierUnion.size(); 3904 3905 QualifierUnion.push_back( 3906 Composite1.getCVRQualifiers() | Composite2.getCVRQualifiers()); 3907 MemberOfClass.push_back(std::make_pair(MemPtr1->getClass(), 3908 MemPtr2->getClass())); 3909 continue; 3910 } 3911 3912 // FIXME: block pointer types? 3913 3914 // Cannot unwrap any more types. 3915 break; 3916 } while (true); 3917 3918 if (NeedConstBefore && NonStandardCompositeType) { 3919 // Extension: Add 'const' to qualifiers that come before the first qualifier 3920 // mismatch, so that our (non-standard!) composite type meets the 3921 // requirements of C++ [conv.qual]p4 bullet 3. 3922 for (unsigned I = 0; I != NeedConstBefore; ++I) { 3923 if ((QualifierUnion[I] & Qualifiers::Const) == 0) { 3924 QualifierUnion[I] = QualifierUnion[I] | Qualifiers::Const; 3925 *NonStandardCompositeType = true; 3926 } 3927 } 3928 } 3929 3930 // Rewrap the composites as pointers or member pointers with the union CVRs. 3931 ContainingClassVector::reverse_iterator MOC 3932 = MemberOfClass.rbegin(); 3933 for (QualifierVector::reverse_iterator 3934 I = QualifierUnion.rbegin(), 3935 E = QualifierUnion.rend(); 3936 I != E; (void)++I, ++MOC) { 3937 Qualifiers Quals = Qualifiers::fromCVRMask(*I); 3938 if (MOC->first && MOC->second) { 3939 // Rebuild member pointer type 3940 Composite1 = Context.getMemberPointerType( 3941 Context.getQualifiedType(Composite1, Quals), 3942 MOC->first); 3943 Composite2 = Context.getMemberPointerType( 3944 Context.getQualifiedType(Composite2, Quals), 3945 MOC->second); 3946 } else { 3947 // Rebuild pointer type 3948 Composite1 3949 = Context.getPointerType(Context.getQualifiedType(Composite1, Quals)); 3950 Composite2 3951 = Context.getPointerType(Context.getQualifiedType(Composite2, Quals)); 3952 } 3953 } 3954 3955 // Try to convert to the first composite pointer type. 3956 InitializedEntity Entity1 3957 = InitializedEntity::InitializeTemporary(Composite1); 3958 InitializationKind Kind 3959 = InitializationKind::CreateCopy(Loc, SourceLocation()); 3960 InitializationSequence E1ToC1(*this, Entity1, Kind, &E1, 1); 3961 InitializationSequence E2ToC1(*this, Entity1, Kind, &E2, 1); 3962 3963 if (E1ToC1 && E2ToC1) { 3964 // Conversion to Composite1 is viable. 3965 if (!Context.hasSameType(Composite1, Composite2)) { 3966 // Composite2 is a different type from Composite1. Check whether 3967 // Composite2 is also viable. 3968 InitializedEntity Entity2 3969 = InitializedEntity::InitializeTemporary(Composite2); 3970 InitializationSequence E1ToC2(*this, Entity2, Kind, &E1, 1); 3971 InitializationSequence E2ToC2(*this, Entity2, Kind, &E2, 1); 3972 if (E1ToC2 && E2ToC2) { 3973 // Both Composite1 and Composite2 are viable and are different; 3974 // this is an ambiguity. 3975 return QualType(); 3976 } 3977 } 3978 3979 // Convert E1 to Composite1 3980 ExprResult E1Result 3981 = E1ToC1.Perform(*this, Entity1, Kind, MultiExprArg(*this,&E1,1)); 3982 if (E1Result.isInvalid()) 3983 return QualType(); 3984 E1 = E1Result.takeAs<Expr>(); 3985 3986 // Convert E2 to Composite1 3987 ExprResult E2Result 3988 = E2ToC1.Perform(*this, Entity1, Kind, MultiExprArg(*this,&E2,1)); 3989 if (E2Result.isInvalid()) 3990 return QualType(); 3991 E2 = E2Result.takeAs<Expr>(); 3992 3993 return Composite1; 3994 } 3995 3996 // Check whether Composite2 is viable. 3997 InitializedEntity Entity2 3998 = InitializedEntity::InitializeTemporary(Composite2); 3999 InitializationSequence E1ToC2(*this, Entity2, Kind, &E1, 1); 4000 InitializationSequence E2ToC2(*this, Entity2, Kind, &E2, 1); 4001 if (!E1ToC2 || !E2ToC2) 4002 return QualType(); 4003 4004 // Convert E1 to Composite2 4005 ExprResult E1Result 4006 = E1ToC2.Perform(*this, Entity2, Kind, MultiExprArg(*this, &E1, 1)); 4007 if (E1Result.isInvalid()) 4008 return QualType(); 4009 E1 = E1Result.takeAs<Expr>(); 4010 4011 // Convert E2 to Composite2 4012 ExprResult E2Result 4013 = E2ToC2.Perform(*this, Entity2, Kind, MultiExprArg(*this, &E2, 1)); 4014 if (E2Result.isInvalid()) 4015 return QualType(); 4016 E2 = E2Result.takeAs<Expr>(); 4017 4018 return Composite2; 4019 } 4020 4021 ExprResult Sema::MaybeBindToTemporary(Expr *E) { 4022 if (!E) 4023 return ExprError(); 4024 4025 assert(!isa<CXXBindTemporaryExpr>(E) && "Double-bound temporary?"); 4026 4027 // If the result is a glvalue, we shouldn't bind it. 4028 if (!E->isRValue()) 4029 return Owned(E); 4030 4031 // In ARC, calls that return a retainable type can return retained, 4032 // in which case we have to insert a consuming cast. 4033 if (getLangOptions().ObjCAutoRefCount && 4034 E->getType()->isObjCRetainableType()) { 4035 4036 bool ReturnsRetained; 4037 4038 // For actual calls, we compute this by examining the type of the 4039 // called value. 4040 if (CallExpr *Call = dyn_cast<CallExpr>(E)) { 4041 Expr *Callee = Call->getCallee()->IgnoreParens(); 4042 QualType T = Callee->getType(); 4043 4044 if (T == Context.BoundMemberTy) { 4045 // Handle pointer-to-members. 4046 if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(Callee)) 4047 T = BinOp->getRHS()->getType(); 4048 else if (MemberExpr *Mem = dyn_cast<MemberExpr>(Callee)) 4049 T = Mem->getMemberDecl()->getType(); 4050 } 4051 4052 if (const PointerType *Ptr = T->getAs<PointerType>()) 4053 T = Ptr->getPointeeType(); 4054 else if (const BlockPointerType *Ptr = T->getAs<BlockPointerType>()) 4055 T = Ptr->getPointeeType(); 4056 else if (const MemberPointerType *MemPtr = T->getAs<MemberPointerType>()) 4057 T = MemPtr->getPointeeType(); 4058 4059 const FunctionType *FTy = T->getAs<FunctionType>(); 4060 assert(FTy && "call to value not of function type?"); 4061 ReturnsRetained = FTy->getExtInfo().getProducesResult(); 4062 4063 // ActOnStmtExpr arranges things so that StmtExprs of retainable 4064 // type always produce a +1 object. 4065 } else if (isa<StmtExpr>(E)) { 4066 ReturnsRetained = true; 4067 4068 // For message sends and property references, we try to find an 4069 // actual method. FIXME: we should infer retention by selector in 4070 // cases where we don't have an actual method. 4071 } else { 4072 ObjCMethodDecl *D = 0; 4073 if (ObjCMessageExpr *Send = dyn_cast<ObjCMessageExpr>(E)) { 4074 D = Send->getMethodDecl(); 4075 } else { 4076 CastExpr *CE = cast<CastExpr>(E); 4077 assert(CE->getCastKind() == CK_GetObjCProperty); 4078 const ObjCPropertyRefExpr *PRE = CE->getSubExpr()->getObjCProperty(); 4079 D = (PRE->isImplicitProperty() ? PRE->getImplicitPropertyGetter() : 0); 4080 } 4081 4082 ReturnsRetained = (D && D->hasAttr<NSReturnsRetainedAttr>()); 4083 4084 // Don't do reclaims on performSelector calls; despite their 4085 // return type, the invoked method doesn't necessarily actually 4086 // return an object. 4087 if (!ReturnsRetained && 4088 D && D->getMethodFamily() == OMF_performSelector) 4089 return Owned(E); 4090 } 4091 4092 ExprNeedsCleanups = true; 4093 4094 CastKind ck = (ReturnsRetained ? CK_ARCConsumeObject 4095 : CK_ARCReclaimReturnedObject); 4096 return Owned(ImplicitCastExpr::Create(Context, E->getType(), ck, E, 0, 4097 VK_RValue)); 4098 } 4099 4100 if (!getLangOptions().CPlusPlus) 4101 return Owned(E); 4102 4103 const RecordType *RT = E->getType()->getAs<RecordType>(); 4104 if (!RT) 4105 return Owned(E); 4106 4107 // That should be enough to guarantee that this type is complete. 4108 // If it has a trivial destructor, we can avoid the extra copy. 4109 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 4110 if (RD->isInvalidDecl() || RD->hasTrivialDestructor()) 4111 return Owned(E); 4112 4113 CXXDestructorDecl *Destructor = LookupDestructor(RD); 4114 4115 CXXTemporary *Temp = CXXTemporary::Create(Context, Destructor); 4116 if (Destructor) { 4117 MarkDeclarationReferenced(E->getExprLoc(), Destructor); 4118 CheckDestructorAccess(E->getExprLoc(), Destructor, 4119 PDiag(diag::err_access_dtor_temp) 4120 << E->getType()); 4121 4122 ExprTemporaries.push_back(Temp); 4123 ExprNeedsCleanups = true; 4124 } 4125 return Owned(CXXBindTemporaryExpr::Create(Context, Temp, E)); 4126 } 4127 4128 Expr *Sema::MaybeCreateExprWithCleanups(Expr *SubExpr) { 4129 assert(SubExpr && "sub expression can't be null!"); 4130 4131 unsigned FirstTemporary = ExprEvalContexts.back().NumTemporaries; 4132 assert(ExprTemporaries.size() >= FirstTemporary); 4133 assert(ExprNeedsCleanups || ExprTemporaries.size() == FirstTemporary); 4134 if (!ExprNeedsCleanups) 4135 return SubExpr; 4136 4137 Expr *E = ExprWithCleanups::Create(Context, SubExpr, 4138 ExprTemporaries.begin() + FirstTemporary, 4139 ExprTemporaries.size() - FirstTemporary); 4140 ExprTemporaries.erase(ExprTemporaries.begin() + FirstTemporary, 4141 ExprTemporaries.end()); 4142 ExprNeedsCleanups = false; 4143 4144 return E; 4145 } 4146 4147 ExprResult 4148 Sema::MaybeCreateExprWithCleanups(ExprResult SubExpr) { 4149 if (SubExpr.isInvalid()) 4150 return ExprError(); 4151 4152 return Owned(MaybeCreateExprWithCleanups(SubExpr.take())); 4153 } 4154 4155 Stmt *Sema::MaybeCreateStmtWithCleanups(Stmt *SubStmt) { 4156 assert(SubStmt && "sub statement can't be null!"); 4157 4158 if (!ExprNeedsCleanups) 4159 return SubStmt; 4160 4161 // FIXME: In order to attach the temporaries, wrap the statement into 4162 // a StmtExpr; currently this is only used for asm statements. 4163 // This is hacky, either create a new CXXStmtWithTemporaries statement or 4164 // a new AsmStmtWithTemporaries. 4165 CompoundStmt *CompStmt = new (Context) CompoundStmt(Context, &SubStmt, 1, 4166 SourceLocation(), 4167 SourceLocation()); 4168 Expr *E = new (Context) StmtExpr(CompStmt, Context.VoidTy, SourceLocation(), 4169 SourceLocation()); 4170 return MaybeCreateExprWithCleanups(E); 4171 } 4172 4173 ExprResult 4174 Sema::ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, 4175 tok::TokenKind OpKind, ParsedType &ObjectType, 4176 bool &MayBePseudoDestructor) { 4177 // Since this might be a postfix expression, get rid of ParenListExprs. 4178 ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Base); 4179 if (Result.isInvalid()) return ExprError(); 4180 Base = Result.get(); 4181 4182 QualType BaseType = Base->getType(); 4183 MayBePseudoDestructor = false; 4184 if (BaseType->isDependentType()) { 4185 // If we have a pointer to a dependent type and are using the -> operator, 4186 // the object type is the type that the pointer points to. We might still 4187 // have enough information about that type to do something useful. 4188 if (OpKind == tok::arrow) 4189 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) 4190 BaseType = Ptr->getPointeeType(); 4191 4192 ObjectType = ParsedType::make(BaseType); 4193 MayBePseudoDestructor = true; 4194 return Owned(Base); 4195 } 4196 4197 // C++ [over.match.oper]p8: 4198 // [...] When operator->returns, the operator-> is applied to the value 4199 // returned, with the original second operand. 4200 if (OpKind == tok::arrow) { 4201 // The set of types we've considered so far. 4202 llvm::SmallPtrSet<CanQualType,8> CTypes; 4203 SmallVector<SourceLocation, 8> Locations; 4204 CTypes.insert(Context.getCanonicalType(BaseType)); 4205 4206 while (BaseType->isRecordType()) { 4207 Result = BuildOverloadedArrowExpr(S, Base, OpLoc); 4208 if (Result.isInvalid()) 4209 return ExprError(); 4210 Base = Result.get(); 4211 if (CXXOperatorCallExpr *OpCall = dyn_cast<CXXOperatorCallExpr>(Base)) 4212 Locations.push_back(OpCall->getDirectCallee()->getLocation()); 4213 BaseType = Base->getType(); 4214 CanQualType CBaseType = Context.getCanonicalType(BaseType); 4215 if (!CTypes.insert(CBaseType)) { 4216 Diag(OpLoc, diag::err_operator_arrow_circular); 4217 for (unsigned i = 0; i < Locations.size(); i++) 4218 Diag(Locations[i], diag::note_declared_at); 4219 return ExprError(); 4220 } 4221 } 4222 4223 if (BaseType->isPointerType()) 4224 BaseType = BaseType->getPointeeType(); 4225 } 4226 4227 // We could end up with various non-record types here, such as extended 4228 // vector types or Objective-C interfaces. Just return early and let 4229 // ActOnMemberReferenceExpr do the work. 4230 if (!BaseType->isRecordType()) { 4231 // C++ [basic.lookup.classref]p2: 4232 // [...] If the type of the object expression is of pointer to scalar 4233 // type, the unqualified-id is looked up in the context of the complete 4234 // postfix-expression. 4235 // 4236 // This also indicates that we should be parsing a 4237 // pseudo-destructor-name. 4238 ObjectType = ParsedType(); 4239 MayBePseudoDestructor = true; 4240 return Owned(Base); 4241 } 4242 4243 // The object type must be complete (or dependent). 4244 if (!BaseType->isDependentType() && 4245 RequireCompleteType(OpLoc, BaseType, 4246 PDiag(diag::err_incomplete_member_access))) 4247 return ExprError(); 4248 4249 // C++ [basic.lookup.classref]p2: 4250 // If the id-expression in a class member access (5.2.5) is an 4251 // unqualified-id, and the type of the object expression is of a class 4252 // type C (or of pointer to a class type C), the unqualified-id is looked 4253 // up in the scope of class C. [...] 4254 ObjectType = ParsedType::make(BaseType); 4255 return move(Base); 4256 } 4257 4258 ExprResult Sema::DiagnoseDtorReference(SourceLocation NameLoc, 4259 Expr *MemExpr) { 4260 SourceLocation ExpectedLParenLoc = PP.getLocForEndOfToken(NameLoc); 4261 Diag(MemExpr->getLocStart(), diag::err_dtor_expr_without_call) 4262 << isa<CXXPseudoDestructorExpr>(MemExpr) 4263 << FixItHint::CreateInsertion(ExpectedLParenLoc, "()"); 4264 4265 return ActOnCallExpr(/*Scope*/ 0, 4266 MemExpr, 4267 /*LPLoc*/ ExpectedLParenLoc, 4268 MultiExprArg(), 4269 /*RPLoc*/ ExpectedLParenLoc); 4270 } 4271 4272 ExprResult Sema::BuildPseudoDestructorExpr(Expr *Base, 4273 SourceLocation OpLoc, 4274 tok::TokenKind OpKind, 4275 const CXXScopeSpec &SS, 4276 TypeSourceInfo *ScopeTypeInfo, 4277 SourceLocation CCLoc, 4278 SourceLocation TildeLoc, 4279 PseudoDestructorTypeStorage Destructed, 4280 bool HasTrailingLParen) { 4281 TypeSourceInfo *DestructedTypeInfo = Destructed.getTypeSourceInfo(); 4282 4283 // C++ [expr.pseudo]p2: 4284 // The left-hand side of the dot operator shall be of scalar type. The 4285 // left-hand side of the arrow operator shall be of pointer to scalar type. 4286 // This scalar type is the object type. 4287 QualType ObjectType = Base->getType(); 4288 if (OpKind == tok::arrow) { 4289 if (const PointerType *Ptr = ObjectType->getAs<PointerType>()) { 4290 ObjectType = Ptr->getPointeeType(); 4291 } else if (!Base->isTypeDependent()) { 4292 // The user wrote "p->" when she probably meant "p."; fix it. 4293 Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) 4294 << ObjectType << true 4295 << FixItHint::CreateReplacement(OpLoc, "."); 4296 if (isSFINAEContext()) 4297 return ExprError(); 4298 4299 OpKind = tok::period; 4300 } 4301 } 4302 4303 if (!ObjectType->isDependentType() && !ObjectType->isScalarType()) { 4304 Diag(OpLoc, diag::err_pseudo_dtor_base_not_scalar) 4305 << ObjectType << Base->getSourceRange(); 4306 return ExprError(); 4307 } 4308 4309 // C++ [expr.pseudo]p2: 4310 // [...] The cv-unqualified versions of the object type and of the type 4311 // designated by the pseudo-destructor-name shall be the same type. 4312 if (DestructedTypeInfo) { 4313 QualType DestructedType = DestructedTypeInfo->getType(); 4314 SourceLocation DestructedTypeStart 4315 = DestructedTypeInfo->getTypeLoc().getLocalSourceRange().getBegin(); 4316 if (!DestructedType->isDependentType() && !ObjectType->isDependentType()) { 4317 if (!Context.hasSameUnqualifiedType(DestructedType, ObjectType)) { 4318 Diag(DestructedTypeStart, diag::err_pseudo_dtor_type_mismatch) 4319 << ObjectType << DestructedType << Base->getSourceRange() 4320 << DestructedTypeInfo->getTypeLoc().getLocalSourceRange(); 4321 4322 // Recover by setting the destructed type to the object type. 4323 DestructedType = ObjectType; 4324 DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType, 4325 DestructedTypeStart); 4326 Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo); 4327 } else if (DestructedType.getObjCLifetime() != 4328 ObjectType.getObjCLifetime()) { 4329 4330 if (DestructedType.getObjCLifetime() == Qualifiers::OCL_None) { 4331 // Okay: just pretend that the user provided the correctly-qualified 4332 // type. 4333 } else { 4334 Diag(DestructedTypeStart, diag::err_arc_pseudo_dtor_inconstant_quals) 4335 << ObjectType << DestructedType << Base->getSourceRange() 4336 << DestructedTypeInfo->getTypeLoc().getLocalSourceRange(); 4337 } 4338 4339 // Recover by setting the destructed type to the object type. 4340 DestructedType = ObjectType; 4341 DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType, 4342 DestructedTypeStart); 4343 Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo); 4344 } 4345 } 4346 } 4347 4348 // C++ [expr.pseudo]p2: 4349 // [...] Furthermore, the two type-names in a pseudo-destructor-name of the 4350 // form 4351 // 4352 // ::[opt] nested-name-specifier[opt] type-name :: ~ type-name 4353 // 4354 // shall designate the same scalar type. 4355 if (ScopeTypeInfo) { 4356 QualType ScopeType = ScopeTypeInfo->getType(); 4357 if (!ScopeType->isDependentType() && !ObjectType->isDependentType() && 4358 !Context.hasSameUnqualifiedType(ScopeType, ObjectType)) { 4359 4360 Diag(ScopeTypeInfo->getTypeLoc().getLocalSourceRange().getBegin(), 4361 diag::err_pseudo_dtor_type_mismatch) 4362 << ObjectType << ScopeType << Base->getSourceRange() 4363 << ScopeTypeInfo->getTypeLoc().getLocalSourceRange(); 4364 4365 ScopeType = QualType(); 4366 ScopeTypeInfo = 0; 4367 } 4368 } 4369 4370 Expr *Result 4371 = new (Context) CXXPseudoDestructorExpr(Context, Base, 4372 OpKind == tok::arrow, OpLoc, 4373 SS.getWithLocInContext(Context), 4374 ScopeTypeInfo, 4375 CCLoc, 4376 TildeLoc, 4377 Destructed); 4378 4379 if (HasTrailingLParen) 4380 return Owned(Result); 4381 4382 return DiagnoseDtorReference(Destructed.getLocation(), Result); 4383 } 4384 4385 ExprResult Sema::ActOnPseudoDestructorExpr(Scope *S, Expr *Base, 4386 SourceLocation OpLoc, 4387 tok::TokenKind OpKind, 4388 CXXScopeSpec &SS, 4389 UnqualifiedId &FirstTypeName, 4390 SourceLocation CCLoc, 4391 SourceLocation TildeLoc, 4392 UnqualifiedId &SecondTypeName, 4393 bool HasTrailingLParen) { 4394 assert((FirstTypeName.getKind() == UnqualifiedId::IK_TemplateId || 4395 FirstTypeName.getKind() == UnqualifiedId::IK_Identifier) && 4396 "Invalid first type name in pseudo-destructor"); 4397 assert((SecondTypeName.getKind() == UnqualifiedId::IK_TemplateId || 4398 SecondTypeName.getKind() == UnqualifiedId::IK_Identifier) && 4399 "Invalid second type name in pseudo-destructor"); 4400 4401 // C++ [expr.pseudo]p2: 4402 // The left-hand side of the dot operator shall be of scalar type. The 4403 // left-hand side of the arrow operator shall be of pointer to scalar type. 4404 // This scalar type is the object type. 4405 QualType ObjectType = Base->getType(); 4406 if (OpKind == tok::arrow) { 4407 if (const PointerType *Ptr = ObjectType->getAs<PointerType>()) { 4408 ObjectType = Ptr->getPointeeType(); 4409 } else if (!ObjectType->isDependentType()) { 4410 // The user wrote "p->" when she probably meant "p."; fix it. 4411 Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) 4412 << ObjectType << true 4413 << FixItHint::CreateReplacement(OpLoc, "."); 4414 if (isSFINAEContext()) 4415 return ExprError(); 4416 4417 OpKind = tok::period; 4418 } 4419 } 4420 4421 // Compute the object type that we should use for name lookup purposes. Only 4422 // record types and dependent types matter. 4423 ParsedType ObjectTypePtrForLookup; 4424 if (!SS.isSet()) { 4425 if (ObjectType->isRecordType()) 4426 ObjectTypePtrForLookup = ParsedType::make(ObjectType); 4427 else if (ObjectType->isDependentType()) 4428 ObjectTypePtrForLookup = ParsedType::make(Context.DependentTy); 4429 } 4430 4431 // Convert the name of the type being destructed (following the ~) into a 4432 // type (with source-location information). 4433 QualType DestructedType; 4434 TypeSourceInfo *DestructedTypeInfo = 0; 4435 PseudoDestructorTypeStorage Destructed; 4436 if (SecondTypeName.getKind() == UnqualifiedId::IK_Identifier) { 4437 ParsedType T = getTypeName(*SecondTypeName.Identifier, 4438 SecondTypeName.StartLocation, 4439 S, &SS, true, false, ObjectTypePtrForLookup); 4440 if (!T && 4441 ((SS.isSet() && !computeDeclContext(SS, false)) || 4442 (!SS.isSet() && ObjectType->isDependentType()))) { 4443 // The name of the type being destroyed is a dependent name, and we 4444 // couldn't find anything useful in scope. Just store the identifier and 4445 // it's location, and we'll perform (qualified) name lookup again at 4446 // template instantiation time. 4447 Destructed = PseudoDestructorTypeStorage(SecondTypeName.Identifier, 4448 SecondTypeName.StartLocation); 4449 } else if (!T) { 4450 Diag(SecondTypeName.StartLocation, 4451 diag::err_pseudo_dtor_destructor_non_type) 4452 << SecondTypeName.Identifier << ObjectType; 4453 if (isSFINAEContext()) 4454 return ExprError(); 4455 4456 // Recover by assuming we had the right type all along. 4457 DestructedType = ObjectType; 4458 } else 4459 DestructedType = GetTypeFromParser(T, &DestructedTypeInfo); 4460 } else { 4461 // Resolve the template-id to a type. 4462 TemplateIdAnnotation *TemplateId = SecondTypeName.TemplateId; 4463 ASTTemplateArgsPtr TemplateArgsPtr(*this, 4464 TemplateId->getTemplateArgs(), 4465 TemplateId->NumArgs); 4466 TypeResult T = ActOnTemplateIdType(TemplateId->SS, 4467 TemplateId->Template, 4468 TemplateId->TemplateNameLoc, 4469 TemplateId->LAngleLoc, 4470 TemplateArgsPtr, 4471 TemplateId->RAngleLoc); 4472 if (T.isInvalid() || !T.get()) { 4473 // Recover by assuming we had the right type all along. 4474 DestructedType = ObjectType; 4475 } else 4476 DestructedType = GetTypeFromParser(T.get(), &DestructedTypeInfo); 4477 } 4478 4479 // If we've performed some kind of recovery, (re-)build the type source 4480 // information. 4481 if (!DestructedType.isNull()) { 4482 if (!DestructedTypeInfo) 4483 DestructedTypeInfo = Context.getTrivialTypeSourceInfo(DestructedType, 4484 SecondTypeName.StartLocation); 4485 Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo); 4486 } 4487 4488 // Convert the name of the scope type (the type prior to '::') into a type. 4489 TypeSourceInfo *ScopeTypeInfo = 0; 4490 QualType ScopeType; 4491 if (FirstTypeName.getKind() == UnqualifiedId::IK_TemplateId || 4492 FirstTypeName.Identifier) { 4493 if (FirstTypeName.getKind() == UnqualifiedId::IK_Identifier) { 4494 ParsedType T = getTypeName(*FirstTypeName.Identifier, 4495 FirstTypeName.StartLocation, 4496 S, &SS, true, false, ObjectTypePtrForLookup); 4497 if (!T) { 4498 Diag(FirstTypeName.StartLocation, 4499 diag::err_pseudo_dtor_destructor_non_type) 4500 << FirstTypeName.Identifier << ObjectType; 4501 4502 if (isSFINAEContext()) 4503 return ExprError(); 4504 4505 // Just drop this type. It's unnecessary anyway. 4506 ScopeType = QualType(); 4507 } else 4508 ScopeType = GetTypeFromParser(T, &ScopeTypeInfo); 4509 } else { 4510 // Resolve the template-id to a type. 4511 TemplateIdAnnotation *TemplateId = FirstTypeName.TemplateId; 4512 ASTTemplateArgsPtr TemplateArgsPtr(*this, 4513 TemplateId->getTemplateArgs(), 4514 TemplateId->NumArgs); 4515 TypeResult T = ActOnTemplateIdType(TemplateId->SS, 4516 TemplateId->Template, 4517 TemplateId->TemplateNameLoc, 4518 TemplateId->LAngleLoc, 4519 TemplateArgsPtr, 4520 TemplateId->RAngleLoc); 4521 if (T.isInvalid() || !T.get()) { 4522 // Recover by dropping this type. 4523 ScopeType = QualType(); 4524 } else 4525 ScopeType = GetTypeFromParser(T.get(), &ScopeTypeInfo); 4526 } 4527 } 4528 4529 if (!ScopeType.isNull() && !ScopeTypeInfo) 4530 ScopeTypeInfo = Context.getTrivialTypeSourceInfo(ScopeType, 4531 FirstTypeName.StartLocation); 4532 4533 4534 return BuildPseudoDestructorExpr(Base, OpLoc, OpKind, SS, 4535 ScopeTypeInfo, CCLoc, TildeLoc, 4536 Destructed, HasTrailingLParen); 4537 } 4538 4539 ExprResult Sema::BuildCXXMemberCallExpr(Expr *E, NamedDecl *FoundDecl, 4540 CXXMethodDecl *Method) { 4541 ExprResult Exp = PerformObjectArgumentInitialization(E, /*Qualifier=*/0, 4542 FoundDecl, Method); 4543 if (Exp.isInvalid()) 4544 return true; 4545 4546 MemberExpr *ME = 4547 new (Context) MemberExpr(Exp.take(), /*IsArrow=*/false, Method, 4548 SourceLocation(), Method->getType(), 4549 VK_RValue, OK_Ordinary); 4550 QualType ResultType = Method->getResultType(); 4551 ExprValueKind VK = Expr::getValueKindForType(ResultType); 4552 ResultType = ResultType.getNonLValueExprType(Context); 4553 4554 MarkDeclarationReferenced(Exp.get()->getLocStart(), Method); 4555 CXXMemberCallExpr *CE = 4556 new (Context) CXXMemberCallExpr(Context, ME, 0, 0, ResultType, VK, 4557 Exp.get()->getLocEnd()); 4558 return CE; 4559 } 4560 4561 ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand, 4562 SourceLocation RParen) { 4563 return Owned(new (Context) CXXNoexceptExpr(Context.BoolTy, Operand, 4564 Operand->CanThrow(Context), 4565 KeyLoc, RParen)); 4566 } 4567 4568 ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation, 4569 Expr *Operand, SourceLocation RParen) { 4570 return BuildCXXNoexceptExpr(KeyLoc, Operand, RParen); 4571 } 4572 4573 /// Perform the conversions required for an expression used in a 4574 /// context that ignores the result. 4575 ExprResult Sema::IgnoredValueConversions(Expr *E) { 4576 // C99 6.3.2.1: 4577 // [Except in specific positions,] an lvalue that does not have 4578 // array type is converted to the value stored in the 4579 // designated object (and is no longer an lvalue). 4580 if (E->isRValue()) { 4581 // In C, function designators (i.e. expressions of function type) 4582 // are r-values, but we still want to do function-to-pointer decay 4583 // on them. This is both technically correct and convenient for 4584 // some clients. 4585 if (!getLangOptions().CPlusPlus && E->getType()->isFunctionType()) 4586 return DefaultFunctionArrayConversion(E); 4587 4588 return Owned(E); 4589 } 4590 4591 // We always want to do this on ObjC property references. 4592 if (E->getObjectKind() == OK_ObjCProperty) { 4593 ExprResult Res = ConvertPropertyForRValue(E); 4594 if (Res.isInvalid()) return Owned(E); 4595 E = Res.take(); 4596 if (E->isRValue()) return Owned(E); 4597 } 4598 4599 // Otherwise, this rule does not apply in C++, at least not for the moment. 4600 if (getLangOptions().CPlusPlus) return Owned(E); 4601 4602 // GCC seems to also exclude expressions of incomplete enum type. 4603 if (const EnumType *T = E->getType()->getAs<EnumType>()) { 4604 if (!T->getDecl()->isComplete()) { 4605 // FIXME: stupid workaround for a codegen bug! 4606 E = ImpCastExprToType(E, Context.VoidTy, CK_ToVoid).take(); 4607 return Owned(E); 4608 } 4609 } 4610 4611 ExprResult Res = DefaultFunctionArrayLvalueConversion(E); 4612 if (Res.isInvalid()) 4613 return Owned(E); 4614 E = Res.take(); 4615 4616 if (!E->getType()->isVoidType()) 4617 RequireCompleteType(E->getExprLoc(), E->getType(), 4618 diag::err_incomplete_type); 4619 return Owned(E); 4620 } 4621 4622 ExprResult Sema::ActOnFinishFullExpr(Expr *FE) { 4623 ExprResult FullExpr = Owned(FE); 4624 4625 if (!FullExpr.get()) 4626 return ExprError(); 4627 4628 if (DiagnoseUnexpandedParameterPack(FullExpr.get())) 4629 return ExprError(); 4630 4631 FullExpr = CheckPlaceholderExpr(FullExpr.take()); 4632 if (FullExpr.isInvalid()) 4633 return ExprError(); 4634 4635 FullExpr = IgnoredValueConversions(FullExpr.take()); 4636 if (FullExpr.isInvalid()) 4637 return ExprError(); 4638 4639 CheckImplicitConversions(FullExpr.get(), FullExpr.get()->getExprLoc()); 4640 return MaybeCreateExprWithCleanups(FullExpr); 4641 } 4642 4643 StmtResult Sema::ActOnFinishFullStmt(Stmt *FullStmt) { 4644 if (!FullStmt) return StmtError(); 4645 4646 return MaybeCreateStmtWithCleanups(FullStmt); 4647 } 4648 4649 bool Sema::CheckMicrosoftIfExistsSymbol(CXXScopeSpec &SS, 4650 UnqualifiedId &Name) { 4651 DeclarationNameInfo TargetNameInfo = GetNameFromUnqualifiedId(Name); 4652 DeclarationName TargetName = TargetNameInfo.getName(); 4653 if (!TargetName) 4654 return false; 4655 4656 // Do the redeclaration lookup in the current scope. 4657 LookupResult R(*this, TargetNameInfo, Sema::LookupAnyName, 4658 Sema::NotForRedeclaration); 4659 R.suppressDiagnostics(); 4660 LookupParsedName(R, getCurScope(), &SS); 4661 return !R.empty(); 4662 } 4663