1 //===--- SemaCast.cpp - Semantic Analysis for Casts -----------------------===// 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 cast expressions, including 11 // 1) C-style casts like '(int) x' 12 // 2) C++ functional casts like 'int(x)' 13 // 3) C++ named casts like 'static_cast<int>(x)' 14 // 15 //===----------------------------------------------------------------------===// 16 17 #include "clang/Sema/SemaInternal.h" 18 #include "clang/AST/ASTContext.h" 19 #include "clang/AST/CXXInheritance.h" 20 #include "clang/AST/ExprCXX.h" 21 #include "clang/AST/ExprObjC.h" 22 #include "clang/AST/RecordLayout.h" 23 #include "clang/Basic/PartialDiagnostic.h" 24 #include "clang/Basic/TargetInfo.h" 25 #include "clang/Lex/Preprocessor.h" 26 #include "clang/Sema/Initialization.h" 27 #include "llvm/ADT/SmallVector.h" 28 #include <set> 29 using namespace clang; 30 31 32 33 enum TryCastResult { 34 TC_NotApplicable, ///< The cast method is not applicable. 35 TC_Success, ///< The cast method is appropriate and successful. 36 TC_Extension, ///< The cast method is appropriate and accepted as a 37 ///< language extension. 38 TC_Failed ///< The cast method is appropriate, but failed. A 39 ///< diagnostic has been emitted. 40 }; 41 42 static bool isValidCast(TryCastResult TCR) { 43 return TCR == TC_Success || TCR == TC_Extension; 44 } 45 46 enum CastType { 47 CT_Const, ///< const_cast 48 CT_Static, ///< static_cast 49 CT_Reinterpret, ///< reinterpret_cast 50 CT_Dynamic, ///< dynamic_cast 51 CT_CStyle, ///< (Type)expr 52 CT_Functional ///< Type(expr) 53 }; 54 55 namespace { 56 struct CastOperation { 57 CastOperation(Sema &S, QualType destType, ExprResult src) 58 : Self(S), SrcExpr(src), DestType(destType), 59 ResultType(destType.getNonLValueExprType(S.Context)), 60 ValueKind(Expr::getValueKindForType(destType)), 61 Kind(CK_Dependent), IsARCUnbridgedCast(false) { 62 63 if (const BuiltinType *placeholder = 64 src.get()->getType()->getAsPlaceholderType()) { 65 PlaceholderKind = placeholder->getKind(); 66 } else { 67 PlaceholderKind = (BuiltinType::Kind) 0; 68 } 69 } 70 71 Sema &Self; 72 ExprResult SrcExpr; 73 QualType DestType; 74 QualType ResultType; 75 ExprValueKind ValueKind; 76 CastKind Kind; 77 BuiltinType::Kind PlaceholderKind; 78 CXXCastPath BasePath; 79 bool IsARCUnbridgedCast; 80 81 SourceRange OpRange; 82 SourceRange DestRange; 83 84 // Top-level semantics-checking routines. 85 void CheckConstCast(); 86 void CheckReinterpretCast(); 87 void CheckStaticCast(); 88 void CheckDynamicCast(); 89 void CheckCXXCStyleCast(bool FunctionalCast, bool ListInitialization); 90 void CheckCStyleCast(); 91 92 void updatePartOfExplicitCastFlags(CastExpr *CE) { 93 // Walk down from the CE to the OrigSrcExpr, and mark all immediate 94 // ImplicitCastExpr's as being part of ExplicitCastExpr. The original CE 95 // (which is a ExplicitCastExpr), and the OrigSrcExpr are not touched. 96 for (; auto *ICE = dyn_cast<ImplicitCastExpr>(CE->getSubExpr()); CE = ICE) 97 ICE->setIsPartOfExplicitCast(true); 98 } 99 100 /// Complete an apparently-successful cast operation that yields 101 /// the given expression. 102 ExprResult complete(CastExpr *castExpr) { 103 // If this is an unbridged cast, wrap the result in an implicit 104 // cast that yields the unbridged-cast placeholder type. 105 if (IsARCUnbridgedCast) { 106 castExpr = ImplicitCastExpr::Create(Self.Context, 107 Self.Context.ARCUnbridgedCastTy, 108 CK_Dependent, castExpr, nullptr, 109 castExpr->getValueKind()); 110 } 111 updatePartOfExplicitCastFlags(castExpr); 112 return castExpr; 113 } 114 115 // Internal convenience methods. 116 117 /// Try to handle the given placeholder expression kind. Return 118 /// true if the source expression has the appropriate placeholder 119 /// kind. A placeholder can only be claimed once. 120 bool claimPlaceholder(BuiltinType::Kind K) { 121 if (PlaceholderKind != K) return false; 122 123 PlaceholderKind = (BuiltinType::Kind) 0; 124 return true; 125 } 126 127 bool isPlaceholder() const { 128 return PlaceholderKind != 0; 129 } 130 bool isPlaceholder(BuiltinType::Kind K) const { 131 return PlaceholderKind == K; 132 } 133 134 void checkCastAlign() { 135 Self.CheckCastAlign(SrcExpr.get(), DestType, OpRange); 136 } 137 138 void checkObjCConversion(Sema::CheckedConversionKind CCK) { 139 assert(Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()); 140 141 Expr *src = SrcExpr.get(); 142 if (Self.CheckObjCConversion(OpRange, DestType, src, CCK) == 143 Sema::ACR_unbridged) 144 IsARCUnbridgedCast = true; 145 SrcExpr = src; 146 } 147 148 /// Check for and handle non-overload placeholder expressions. 149 void checkNonOverloadPlaceholders() { 150 if (!isPlaceholder() || isPlaceholder(BuiltinType::Overload)) 151 return; 152 153 SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get()); 154 if (SrcExpr.isInvalid()) 155 return; 156 PlaceholderKind = (BuiltinType::Kind) 0; 157 } 158 }; 159 } 160 161 static void DiagnoseCastQual(Sema &Self, const ExprResult &SrcExpr, 162 QualType DestType); 163 164 // The Try functions attempt a specific way of casting. If they succeed, they 165 // return TC_Success. If their way of casting is not appropriate for the given 166 // arguments, they return TC_NotApplicable and *may* set diag to a diagnostic 167 // to emit if no other way succeeds. If their way of casting is appropriate but 168 // fails, they return TC_Failed and *must* set diag; they can set it to 0 if 169 // they emit a specialized diagnostic. 170 // All diagnostics returned by these functions must expect the same three 171 // arguments: 172 // %0: Cast Type (a value from the CastType enumeration) 173 // %1: Source Type 174 // %2: Destination Type 175 static TryCastResult TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, 176 QualType DestType, bool CStyle, 177 CastKind &Kind, 178 CXXCastPath &BasePath, 179 unsigned &msg); 180 static TryCastResult TryStaticReferenceDowncast(Sema &Self, Expr *SrcExpr, 181 QualType DestType, bool CStyle, 182 SourceRange OpRange, 183 unsigned &msg, 184 CastKind &Kind, 185 CXXCastPath &BasePath); 186 static TryCastResult TryStaticPointerDowncast(Sema &Self, QualType SrcType, 187 QualType DestType, bool CStyle, 188 SourceRange OpRange, 189 unsigned &msg, 190 CastKind &Kind, 191 CXXCastPath &BasePath); 192 static TryCastResult TryStaticDowncast(Sema &Self, CanQualType SrcType, 193 CanQualType DestType, bool CStyle, 194 SourceRange OpRange, 195 QualType OrigSrcType, 196 QualType OrigDestType, unsigned &msg, 197 CastKind &Kind, 198 CXXCastPath &BasePath); 199 static TryCastResult TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, 200 QualType SrcType, 201 QualType DestType,bool CStyle, 202 SourceRange OpRange, 203 unsigned &msg, 204 CastKind &Kind, 205 CXXCastPath &BasePath); 206 207 static TryCastResult TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, 208 QualType DestType, 209 Sema::CheckedConversionKind CCK, 210 SourceRange OpRange, 211 unsigned &msg, CastKind &Kind, 212 bool ListInitialization); 213 static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr, 214 QualType DestType, 215 Sema::CheckedConversionKind CCK, 216 SourceRange OpRange, 217 unsigned &msg, CastKind &Kind, 218 CXXCastPath &BasePath, 219 bool ListInitialization); 220 static TryCastResult TryConstCast(Sema &Self, ExprResult &SrcExpr, 221 QualType DestType, bool CStyle, 222 unsigned &msg); 223 static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, 224 QualType DestType, bool CStyle, 225 SourceRange OpRange, 226 unsigned &msg, 227 CastKind &Kind); 228 229 230 /// ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const}_cast's. 231 ExprResult 232 Sema::ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, 233 SourceLocation LAngleBracketLoc, Declarator &D, 234 SourceLocation RAngleBracketLoc, 235 SourceLocation LParenLoc, Expr *E, 236 SourceLocation RParenLoc) { 237 238 assert(!D.isInvalidType()); 239 240 TypeSourceInfo *TInfo = GetTypeForDeclaratorCast(D, E->getType()); 241 if (D.isInvalidType()) 242 return ExprError(); 243 244 if (getLangOpts().CPlusPlus) { 245 // Check that there are no default arguments (C++ only). 246 CheckExtraCXXDefaultArguments(D); 247 } 248 249 return BuildCXXNamedCast(OpLoc, Kind, TInfo, E, 250 SourceRange(LAngleBracketLoc, RAngleBracketLoc), 251 SourceRange(LParenLoc, RParenLoc)); 252 } 253 254 ExprResult 255 Sema::BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, 256 TypeSourceInfo *DestTInfo, Expr *E, 257 SourceRange AngleBrackets, SourceRange Parens) { 258 ExprResult Ex = E; 259 QualType DestType = DestTInfo->getType(); 260 261 // If the type is dependent, we won't do the semantic analysis now. 262 bool TypeDependent = 263 DestType->isDependentType() || Ex.get()->isTypeDependent(); 264 265 CastOperation Op(*this, DestType, E); 266 Op.OpRange = SourceRange(OpLoc, Parens.getEnd()); 267 Op.DestRange = AngleBrackets; 268 269 switch (Kind) { 270 default: llvm_unreachable("Unknown C++ cast!"); 271 272 case tok::kw_const_cast: 273 if (!TypeDependent) { 274 Op.CheckConstCast(); 275 if (Op.SrcExpr.isInvalid()) 276 return ExprError(); 277 DiscardMisalignedMemberAddress(DestType.getTypePtr(), E); 278 } 279 return Op.complete(CXXConstCastExpr::Create(Context, Op.ResultType, 280 Op.ValueKind, Op.SrcExpr.get(), DestTInfo, 281 OpLoc, Parens.getEnd(), 282 AngleBrackets)); 283 284 case tok::kw_dynamic_cast: { 285 // OpenCL C++ 1.0 s2.9: dynamic_cast is not supported. 286 if (getLangOpts().OpenCLCPlusPlus) { 287 return ExprError(Diag(OpLoc, diag::err_openclcxx_not_supported) 288 << "dynamic_cast"); 289 } 290 291 if (!TypeDependent) { 292 Op.CheckDynamicCast(); 293 if (Op.SrcExpr.isInvalid()) 294 return ExprError(); 295 } 296 return Op.complete(CXXDynamicCastExpr::Create(Context, Op.ResultType, 297 Op.ValueKind, Op.Kind, Op.SrcExpr.get(), 298 &Op.BasePath, DestTInfo, 299 OpLoc, Parens.getEnd(), 300 AngleBrackets)); 301 } 302 case tok::kw_reinterpret_cast: { 303 if (!TypeDependent) { 304 Op.CheckReinterpretCast(); 305 if (Op.SrcExpr.isInvalid()) 306 return ExprError(); 307 DiscardMisalignedMemberAddress(DestType.getTypePtr(), E); 308 } 309 return Op.complete(CXXReinterpretCastExpr::Create(Context, Op.ResultType, 310 Op.ValueKind, Op.Kind, Op.SrcExpr.get(), 311 nullptr, DestTInfo, OpLoc, 312 Parens.getEnd(), 313 AngleBrackets)); 314 } 315 case tok::kw_static_cast: { 316 if (!TypeDependent) { 317 Op.CheckStaticCast(); 318 if (Op.SrcExpr.isInvalid()) 319 return ExprError(); 320 DiscardMisalignedMemberAddress(DestType.getTypePtr(), E); 321 } 322 323 return Op.complete(CXXStaticCastExpr::Create(Context, Op.ResultType, 324 Op.ValueKind, Op.Kind, Op.SrcExpr.get(), 325 &Op.BasePath, DestTInfo, 326 OpLoc, Parens.getEnd(), 327 AngleBrackets)); 328 } 329 } 330 } 331 332 /// Try to diagnose a failed overloaded cast. Returns true if 333 /// diagnostics were emitted. 334 static bool tryDiagnoseOverloadedCast(Sema &S, CastType CT, 335 SourceRange range, Expr *src, 336 QualType destType, 337 bool listInitialization) { 338 switch (CT) { 339 // These cast kinds don't consider user-defined conversions. 340 case CT_Const: 341 case CT_Reinterpret: 342 case CT_Dynamic: 343 return false; 344 345 // These do. 346 case CT_Static: 347 case CT_CStyle: 348 case CT_Functional: 349 break; 350 } 351 352 QualType srcType = src->getType(); 353 if (!destType->isRecordType() && !srcType->isRecordType()) 354 return false; 355 356 InitializedEntity entity = InitializedEntity::InitializeTemporary(destType); 357 InitializationKind initKind 358 = (CT == CT_CStyle)? InitializationKind::CreateCStyleCast(range.getBegin(), 359 range, listInitialization) 360 : (CT == CT_Functional)? InitializationKind::CreateFunctionalCast(range, 361 listInitialization) 362 : InitializationKind::CreateCast(/*type range?*/ range); 363 InitializationSequence sequence(S, entity, initKind, src); 364 365 assert(sequence.Failed() && "initialization succeeded on second try?"); 366 switch (sequence.getFailureKind()) { 367 default: return false; 368 369 case InitializationSequence::FK_ConstructorOverloadFailed: 370 case InitializationSequence::FK_UserConversionOverloadFailed: 371 break; 372 } 373 374 OverloadCandidateSet &candidates = sequence.getFailedCandidateSet(); 375 376 unsigned msg = 0; 377 OverloadCandidateDisplayKind howManyCandidates = OCD_AllCandidates; 378 379 switch (sequence.getFailedOverloadResult()) { 380 case OR_Success: llvm_unreachable("successful failed overload"); 381 case OR_No_Viable_Function: 382 if (candidates.empty()) 383 msg = diag::err_ovl_no_conversion_in_cast; 384 else 385 msg = diag::err_ovl_no_viable_conversion_in_cast; 386 howManyCandidates = OCD_AllCandidates; 387 break; 388 389 case OR_Ambiguous: 390 msg = diag::err_ovl_ambiguous_conversion_in_cast; 391 howManyCandidates = OCD_ViableCandidates; 392 break; 393 394 case OR_Deleted: 395 msg = diag::err_ovl_deleted_conversion_in_cast; 396 howManyCandidates = OCD_ViableCandidates; 397 break; 398 } 399 400 S.Diag(range.getBegin(), msg) 401 << CT << srcType << destType 402 << range << src->getSourceRange(); 403 404 candidates.NoteCandidates(S, howManyCandidates, src); 405 406 return true; 407 } 408 409 /// Diagnose a failed cast. 410 static void diagnoseBadCast(Sema &S, unsigned msg, CastType castType, 411 SourceRange opRange, Expr *src, QualType destType, 412 bool listInitialization) { 413 if (msg == diag::err_bad_cxx_cast_generic && 414 tryDiagnoseOverloadedCast(S, castType, opRange, src, destType, 415 listInitialization)) 416 return; 417 418 S.Diag(opRange.getBegin(), msg) << castType 419 << src->getType() << destType << opRange << src->getSourceRange(); 420 421 // Detect if both types are (ptr to) class, and note any incompleteness. 422 int DifferentPtrness = 0; 423 QualType From = destType; 424 if (auto Ptr = From->getAs<PointerType>()) { 425 From = Ptr->getPointeeType(); 426 DifferentPtrness++; 427 } 428 QualType To = src->getType(); 429 if (auto Ptr = To->getAs<PointerType>()) { 430 To = Ptr->getPointeeType(); 431 DifferentPtrness--; 432 } 433 if (!DifferentPtrness) { 434 auto RecFrom = From->getAs<RecordType>(); 435 auto RecTo = To->getAs<RecordType>(); 436 if (RecFrom && RecTo) { 437 auto DeclFrom = RecFrom->getAsCXXRecordDecl(); 438 if (!DeclFrom->isCompleteDefinition()) 439 S.Diag(DeclFrom->getLocation(), diag::note_type_incomplete) 440 << DeclFrom->getDeclName(); 441 auto DeclTo = RecTo->getAsCXXRecordDecl(); 442 if (!DeclTo->isCompleteDefinition()) 443 S.Diag(DeclTo->getLocation(), diag::note_type_incomplete) 444 << DeclTo->getDeclName(); 445 } 446 } 447 } 448 449 namespace { 450 /// The kind of unwrapping we did when determining whether a conversion casts 451 /// away constness. 452 enum CastAwayConstnessKind { 453 /// The conversion does not cast away constness. 454 CACK_None = 0, 455 /// We unwrapped similar types. 456 CACK_Similar = 1, 457 /// We unwrapped dissimilar types with similar representations (eg, a pointer 458 /// versus an Objective-C object pointer). 459 CACK_SimilarKind = 2, 460 /// We unwrapped representationally-unrelated types, such as a pointer versus 461 /// a pointer-to-member. 462 CACK_Incoherent = 3, 463 }; 464 } 465 466 /// Unwrap one level of types for CastsAwayConstness. 467 /// 468 /// Like Sema::UnwrapSimilarTypes, this removes one level of indirection from 469 /// both types, provided that they're both pointer-like or array-like. Unlike 470 /// the Sema function, doesn't care if the unwrapped pieces are related. 471 /// 472 /// This function may remove additional levels as necessary for correctness: 473 /// the resulting T1 is unwrapped sufficiently that it is never an array type, 474 /// so that its qualifiers can be directly compared to those of T2 (which will 475 /// have the combined set of qualifiers from all indermediate levels of T2), 476 /// as (effectively) required by [expr.const.cast]p7 replacing T1's qualifiers 477 /// with those from T2. 478 static CastAwayConstnessKind 479 unwrapCastAwayConstnessLevel(ASTContext &Context, QualType &T1, QualType &T2) { 480 enum { None, Ptr, MemPtr, BlockPtr, Array }; 481 auto Classify = [](QualType T) { 482 if (T->isAnyPointerType()) return Ptr; 483 if (T->isMemberPointerType()) return MemPtr; 484 if (T->isBlockPointerType()) return BlockPtr; 485 // We somewhat-arbitrarily don't look through VLA types here. This is at 486 // least consistent with the behavior of UnwrapSimilarTypes. 487 if (T->isConstantArrayType() || T->isIncompleteArrayType()) return Array; 488 return None; 489 }; 490 491 auto Unwrap = [&](QualType T) { 492 if (auto *AT = Context.getAsArrayType(T)) 493 return AT->getElementType(); 494 return T->getPointeeType(); 495 }; 496 497 CastAwayConstnessKind Kind; 498 499 if (T2->isReferenceType()) { 500 // Special case: if the destination type is a reference type, unwrap it as 501 // the first level. (The source will have been an lvalue expression in this 502 // case, so there is no corresponding "reference to" in T1 to remove.) This 503 // simulates removing a "pointer to" from both sides. 504 T2 = T2->getPointeeType(); 505 Kind = CastAwayConstnessKind::CACK_Similar; 506 } else if (Context.UnwrapSimilarTypes(T1, T2)) { 507 Kind = CastAwayConstnessKind::CACK_Similar; 508 } else { 509 // Try unwrapping mismatching levels. 510 int T1Class = Classify(T1); 511 if (T1Class == None) 512 return CastAwayConstnessKind::CACK_None; 513 514 int T2Class = Classify(T2); 515 if (T2Class == None) 516 return CastAwayConstnessKind::CACK_None; 517 518 T1 = Unwrap(T1); 519 T2 = Unwrap(T2); 520 Kind = T1Class == T2Class ? CastAwayConstnessKind::CACK_SimilarKind 521 : CastAwayConstnessKind::CACK_Incoherent; 522 } 523 524 // We've unwrapped at least one level. If the resulting T1 is a (possibly 525 // multidimensional) array type, any qualifier on any matching layer of 526 // T2 is considered to correspond to T1. Decompose down to the element 527 // type of T1 so that we can compare properly. 528 while (true) { 529 Context.UnwrapSimilarArrayTypes(T1, T2); 530 531 if (Classify(T1) != Array) 532 break; 533 534 auto T2Class = Classify(T2); 535 if (T2Class == None) 536 break; 537 538 if (T2Class != Array) 539 Kind = CastAwayConstnessKind::CACK_Incoherent; 540 else if (Kind != CastAwayConstnessKind::CACK_Incoherent) 541 Kind = CastAwayConstnessKind::CACK_SimilarKind; 542 543 T1 = Unwrap(T1); 544 T2 = Unwrap(T2).withCVRQualifiers(T2.getCVRQualifiers()); 545 } 546 547 return Kind; 548 } 549 550 /// Check if the pointer conversion from SrcType to DestType casts away 551 /// constness as defined in C++ [expr.const.cast]. This is used by the cast 552 /// checkers. Both arguments must denote pointer (possibly to member) types. 553 /// 554 /// \param CheckCVR Whether to check for const/volatile/restrict qualifiers. 555 /// \param CheckObjCLifetime Whether to check Objective-C lifetime qualifiers. 556 static CastAwayConstnessKind 557 CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType, 558 bool CheckCVR, bool CheckObjCLifetime, 559 QualType *TheOffendingSrcType = nullptr, 560 QualType *TheOffendingDestType = nullptr, 561 Qualifiers *CastAwayQualifiers = nullptr) { 562 // If the only checking we care about is for Objective-C lifetime qualifiers, 563 // and we're not in ObjC mode, there's nothing to check. 564 if (!CheckCVR && CheckObjCLifetime && !Self.Context.getLangOpts().ObjC1) 565 return CastAwayConstnessKind::CACK_None; 566 567 if (!DestType->isReferenceType()) { 568 assert((SrcType->isAnyPointerType() || SrcType->isMemberPointerType() || 569 SrcType->isBlockPointerType()) && 570 "Source type is not pointer or pointer to member."); 571 assert((DestType->isAnyPointerType() || DestType->isMemberPointerType() || 572 DestType->isBlockPointerType()) && 573 "Destination type is not pointer or pointer to member."); 574 } 575 576 QualType UnwrappedSrcType = Self.Context.getCanonicalType(SrcType), 577 UnwrappedDestType = Self.Context.getCanonicalType(DestType); 578 579 // Find the qualifiers. We only care about cvr-qualifiers for the 580 // purpose of this check, because other qualifiers (address spaces, 581 // Objective-C GC, etc.) are part of the type's identity. 582 QualType PrevUnwrappedSrcType = UnwrappedSrcType; 583 QualType PrevUnwrappedDestType = UnwrappedDestType; 584 auto WorstKind = CastAwayConstnessKind::CACK_Similar; 585 bool AllConstSoFar = true; 586 while (auto Kind = unwrapCastAwayConstnessLevel( 587 Self.Context, UnwrappedSrcType, UnwrappedDestType)) { 588 // Track the worst kind of unwrap we needed to do before we found a 589 // problem. 590 if (Kind > WorstKind) 591 WorstKind = Kind; 592 593 // Determine the relevant qualifiers at this level. 594 Qualifiers SrcQuals, DestQuals; 595 Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals); 596 Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals); 597 598 // We do not meaningfully track object const-ness of Objective-C object 599 // types. Remove const from the source type if either the source or 600 // the destination is an Objective-C object type. 601 if (UnwrappedSrcType->isObjCObjectType() || 602 UnwrappedDestType->isObjCObjectType()) 603 SrcQuals.removeConst(); 604 605 if (CheckCVR) { 606 Qualifiers SrcCvrQuals = 607 Qualifiers::fromCVRMask(SrcQuals.getCVRQualifiers()); 608 Qualifiers DestCvrQuals = 609 Qualifiers::fromCVRMask(DestQuals.getCVRQualifiers()); 610 611 if (SrcCvrQuals != DestCvrQuals) { 612 if (CastAwayQualifiers) 613 *CastAwayQualifiers = SrcCvrQuals - DestCvrQuals; 614 615 // If we removed a cvr-qualifier, this is casting away 'constness'. 616 if (!DestCvrQuals.compatiblyIncludes(SrcCvrQuals)) { 617 if (TheOffendingSrcType) 618 *TheOffendingSrcType = PrevUnwrappedSrcType; 619 if (TheOffendingDestType) 620 *TheOffendingDestType = PrevUnwrappedDestType; 621 return WorstKind; 622 } 623 624 // If any prior level was not 'const', this is also casting away 625 // 'constness'. We noted the outermost type missing a 'const' already. 626 if (!AllConstSoFar) 627 return WorstKind; 628 } 629 } 630 631 if (CheckObjCLifetime && 632 !DestQuals.compatiblyIncludesObjCLifetime(SrcQuals)) 633 return WorstKind; 634 635 // If we found our first non-const-qualified type, this may be the place 636 // where things start to go wrong. 637 if (AllConstSoFar && !DestQuals.hasConst()) { 638 AllConstSoFar = false; 639 if (TheOffendingSrcType) 640 *TheOffendingSrcType = PrevUnwrappedSrcType; 641 if (TheOffendingDestType) 642 *TheOffendingDestType = PrevUnwrappedDestType; 643 } 644 645 PrevUnwrappedSrcType = UnwrappedSrcType; 646 PrevUnwrappedDestType = UnwrappedDestType; 647 } 648 649 return CastAwayConstnessKind::CACK_None; 650 } 651 652 static TryCastResult getCastAwayConstnessCastKind(CastAwayConstnessKind CACK, 653 unsigned &DiagID) { 654 switch (CACK) { 655 case CastAwayConstnessKind::CACK_None: 656 llvm_unreachable("did not cast away constness"); 657 658 case CastAwayConstnessKind::CACK_Similar: 659 // FIXME: Accept these as an extension too? 660 case CastAwayConstnessKind::CACK_SimilarKind: 661 DiagID = diag::err_bad_cxx_cast_qualifiers_away; 662 return TC_Failed; 663 664 case CastAwayConstnessKind::CACK_Incoherent: 665 DiagID = diag::ext_bad_cxx_cast_qualifiers_away_incoherent; 666 return TC_Extension; 667 } 668 669 llvm_unreachable("unexpected cast away constness kind"); 670 } 671 672 /// CheckDynamicCast - Check that a dynamic_cast\<DestType\>(SrcExpr) is valid. 673 /// Refer to C++ 5.2.7 for details. Dynamic casts are used mostly for runtime- 674 /// checked downcasts in class hierarchies. 675 void CastOperation::CheckDynamicCast() { 676 if (ValueKind == VK_RValue) 677 SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get()); 678 else if (isPlaceholder()) 679 SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get()); 680 if (SrcExpr.isInvalid()) // if conversion failed, don't report another error 681 return; 682 683 QualType OrigSrcType = SrcExpr.get()->getType(); 684 QualType DestType = Self.Context.getCanonicalType(this->DestType); 685 686 // C++ 5.2.7p1: T shall be a pointer or reference to a complete class type, 687 // or "pointer to cv void". 688 689 QualType DestPointee; 690 const PointerType *DestPointer = DestType->getAs<PointerType>(); 691 const ReferenceType *DestReference = nullptr; 692 if (DestPointer) { 693 DestPointee = DestPointer->getPointeeType(); 694 } else if ((DestReference = DestType->getAs<ReferenceType>())) { 695 DestPointee = DestReference->getPointeeType(); 696 } else { 697 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ref_or_ptr) 698 << this->DestType << DestRange; 699 SrcExpr = ExprError(); 700 return; 701 } 702 703 const RecordType *DestRecord = DestPointee->getAs<RecordType>(); 704 if (DestPointee->isVoidType()) { 705 assert(DestPointer && "Reference to void is not possible"); 706 } else if (DestRecord) { 707 if (Self.RequireCompleteType(OpRange.getBegin(), DestPointee, 708 diag::err_bad_dynamic_cast_incomplete, 709 DestRange)) { 710 SrcExpr = ExprError(); 711 return; 712 } 713 } else { 714 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class) 715 << DestPointee.getUnqualifiedType() << DestRange; 716 SrcExpr = ExprError(); 717 return; 718 } 719 720 // C++0x 5.2.7p2: If T is a pointer type, v shall be an rvalue of a pointer to 721 // complete class type, [...]. If T is an lvalue reference type, v shall be 722 // an lvalue of a complete class type, [...]. If T is an rvalue reference 723 // type, v shall be an expression having a complete class type, [...] 724 QualType SrcType = Self.Context.getCanonicalType(OrigSrcType); 725 QualType SrcPointee; 726 if (DestPointer) { 727 if (const PointerType *SrcPointer = SrcType->getAs<PointerType>()) { 728 SrcPointee = SrcPointer->getPointeeType(); 729 } else { 730 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ptr) 731 << OrigSrcType << SrcExpr.get()->getSourceRange(); 732 SrcExpr = ExprError(); 733 return; 734 } 735 } else if (DestReference->isLValueReferenceType()) { 736 if (!SrcExpr.get()->isLValue()) { 737 Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_rvalue) 738 << CT_Dynamic << OrigSrcType << this->DestType << OpRange; 739 } 740 SrcPointee = SrcType; 741 } else { 742 // If we're dynamic_casting from a prvalue to an rvalue reference, we need 743 // to materialize the prvalue before we bind the reference to it. 744 if (SrcExpr.get()->isRValue()) 745 SrcExpr = Self.CreateMaterializeTemporaryExpr( 746 SrcType, SrcExpr.get(), /*IsLValueReference*/ false); 747 SrcPointee = SrcType; 748 } 749 750 const RecordType *SrcRecord = SrcPointee->getAs<RecordType>(); 751 if (SrcRecord) { 752 if (Self.RequireCompleteType(OpRange.getBegin(), SrcPointee, 753 diag::err_bad_dynamic_cast_incomplete, 754 SrcExpr.get())) { 755 SrcExpr = ExprError(); 756 return; 757 } 758 } else { 759 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class) 760 << SrcPointee.getUnqualifiedType() << SrcExpr.get()->getSourceRange(); 761 SrcExpr = ExprError(); 762 return; 763 } 764 765 assert((DestPointer || DestReference) && 766 "Bad destination non-ptr/ref slipped through."); 767 assert((DestRecord || DestPointee->isVoidType()) && 768 "Bad destination pointee slipped through."); 769 assert(SrcRecord && "Bad source pointee slipped through."); 770 771 // C++ 5.2.7p1: The dynamic_cast operator shall not cast away constness. 772 if (!DestPointee.isAtLeastAsQualifiedAs(SrcPointee)) { 773 Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_qualifiers_away) 774 << CT_Dynamic << OrigSrcType << this->DestType << OpRange; 775 SrcExpr = ExprError(); 776 return; 777 } 778 779 // C++ 5.2.7p3: If the type of v is the same as the required result type, 780 // [except for cv]. 781 if (DestRecord == SrcRecord) { 782 Kind = CK_NoOp; 783 return; 784 } 785 786 // C++ 5.2.7p5 787 // Upcasts are resolved statically. 788 if (DestRecord && 789 Self.IsDerivedFrom(OpRange.getBegin(), SrcPointee, DestPointee)) { 790 if (Self.CheckDerivedToBaseConversion(SrcPointee, DestPointee, 791 OpRange.getBegin(), OpRange, 792 &BasePath)) { 793 SrcExpr = ExprError(); 794 return; 795 } 796 797 Kind = CK_DerivedToBase; 798 return; 799 } 800 801 // C++ 5.2.7p6: Otherwise, v shall be [polymorphic]. 802 const RecordDecl *SrcDecl = SrcRecord->getDecl()->getDefinition(); 803 assert(SrcDecl && "Definition missing"); 804 if (!cast<CXXRecordDecl>(SrcDecl)->isPolymorphic()) { 805 Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_polymorphic) 806 << SrcPointee.getUnqualifiedType() << SrcExpr.get()->getSourceRange(); 807 SrcExpr = ExprError(); 808 } 809 810 // dynamic_cast is not available with -fno-rtti. 811 // As an exception, dynamic_cast to void* is available because it doesn't 812 // use RTTI. 813 if (!Self.getLangOpts().RTTI && !DestPointee->isVoidType()) { 814 Self.Diag(OpRange.getBegin(), diag::err_no_dynamic_cast_with_fno_rtti); 815 SrcExpr = ExprError(); 816 return; 817 } 818 819 // Done. Everything else is run-time checks. 820 Kind = CK_Dynamic; 821 } 822 823 /// CheckConstCast - Check that a const_cast\<DestType\>(SrcExpr) is valid. 824 /// Refer to C++ 5.2.11 for details. const_cast is typically used in code 825 /// like this: 826 /// const char *str = "literal"; 827 /// legacy_function(const_cast\<char*\>(str)); 828 void CastOperation::CheckConstCast() { 829 if (ValueKind == VK_RValue) 830 SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get()); 831 else if (isPlaceholder()) 832 SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get()); 833 if (SrcExpr.isInvalid()) // if conversion failed, don't report another error 834 return; 835 836 unsigned msg = diag::err_bad_cxx_cast_generic; 837 auto TCR = TryConstCast(Self, SrcExpr, DestType, /*CStyle*/ false, msg); 838 if (TCR != TC_Success && msg != 0) { 839 Self.Diag(OpRange.getBegin(), msg) << CT_Const 840 << SrcExpr.get()->getType() << DestType << OpRange; 841 } 842 if (!isValidCast(TCR)) 843 SrcExpr = ExprError(); 844 } 845 846 /// Check that a reinterpret_cast\<DestType\>(SrcExpr) is not used as upcast 847 /// or downcast between respective pointers or references. 848 static void DiagnoseReinterpretUpDownCast(Sema &Self, const Expr *SrcExpr, 849 QualType DestType, 850 SourceRange OpRange) { 851 QualType SrcType = SrcExpr->getType(); 852 // When casting from pointer or reference, get pointee type; use original 853 // type otherwise. 854 const CXXRecordDecl *SrcPointeeRD = SrcType->getPointeeCXXRecordDecl(); 855 const CXXRecordDecl *SrcRD = 856 SrcPointeeRD ? SrcPointeeRD : SrcType->getAsCXXRecordDecl(); 857 858 // Examining subobjects for records is only possible if the complete and 859 // valid definition is available. Also, template instantiation is not 860 // allowed here. 861 if (!SrcRD || !SrcRD->isCompleteDefinition() || SrcRD->isInvalidDecl()) 862 return; 863 864 const CXXRecordDecl *DestRD = DestType->getPointeeCXXRecordDecl(); 865 866 if (!DestRD || !DestRD->isCompleteDefinition() || DestRD->isInvalidDecl()) 867 return; 868 869 enum { 870 ReinterpretUpcast, 871 ReinterpretDowncast 872 } ReinterpretKind; 873 874 CXXBasePaths BasePaths; 875 876 if (SrcRD->isDerivedFrom(DestRD, BasePaths)) 877 ReinterpretKind = ReinterpretUpcast; 878 else if (DestRD->isDerivedFrom(SrcRD, BasePaths)) 879 ReinterpretKind = ReinterpretDowncast; 880 else 881 return; 882 883 bool VirtualBase = true; 884 bool NonZeroOffset = false; 885 for (CXXBasePaths::const_paths_iterator I = BasePaths.begin(), 886 E = BasePaths.end(); 887 I != E; ++I) { 888 const CXXBasePath &Path = *I; 889 CharUnits Offset = CharUnits::Zero(); 890 bool IsVirtual = false; 891 for (CXXBasePath::const_iterator IElem = Path.begin(), EElem = Path.end(); 892 IElem != EElem; ++IElem) { 893 IsVirtual = IElem->Base->isVirtual(); 894 if (IsVirtual) 895 break; 896 const CXXRecordDecl *BaseRD = IElem->Base->getType()->getAsCXXRecordDecl(); 897 assert(BaseRD && "Base type should be a valid unqualified class type"); 898 // Don't check if any base has invalid declaration or has no definition 899 // since it has no layout info. 900 const CXXRecordDecl *Class = IElem->Class, 901 *ClassDefinition = Class->getDefinition(); 902 if (Class->isInvalidDecl() || !ClassDefinition || 903 !ClassDefinition->isCompleteDefinition()) 904 return; 905 906 const ASTRecordLayout &DerivedLayout = 907 Self.Context.getASTRecordLayout(Class); 908 Offset += DerivedLayout.getBaseClassOffset(BaseRD); 909 } 910 if (!IsVirtual) { 911 // Don't warn if any path is a non-virtually derived base at offset zero. 912 if (Offset.isZero()) 913 return; 914 // Offset makes sense only for non-virtual bases. 915 else 916 NonZeroOffset = true; 917 } 918 VirtualBase = VirtualBase && IsVirtual; 919 } 920 921 (void) NonZeroOffset; // Silence set but not used warning. 922 assert((VirtualBase || NonZeroOffset) && 923 "Should have returned if has non-virtual base with zero offset"); 924 925 QualType BaseType = 926 ReinterpretKind == ReinterpretUpcast? DestType : SrcType; 927 QualType DerivedType = 928 ReinterpretKind == ReinterpretUpcast? SrcType : DestType; 929 930 SourceLocation BeginLoc = OpRange.getBegin(); 931 Self.Diag(BeginLoc, diag::warn_reinterpret_different_from_static) 932 << DerivedType << BaseType << !VirtualBase << int(ReinterpretKind) 933 << OpRange; 934 Self.Diag(BeginLoc, diag::note_reinterpret_updowncast_use_static) 935 << int(ReinterpretKind) 936 << FixItHint::CreateReplacement(BeginLoc, "static_cast"); 937 } 938 939 /// CheckReinterpretCast - Check that a reinterpret_cast\<DestType\>(SrcExpr) is 940 /// valid. 941 /// Refer to C++ 5.2.10 for details. reinterpret_cast is typically used in code 942 /// like this: 943 /// char *bytes = reinterpret_cast\<char*\>(int_ptr); 944 void CastOperation::CheckReinterpretCast() { 945 if (ValueKind == VK_RValue && !isPlaceholder(BuiltinType::Overload)) 946 SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get()); 947 else 948 checkNonOverloadPlaceholders(); 949 if (SrcExpr.isInvalid()) // if conversion failed, don't report another error 950 return; 951 952 unsigned msg = diag::err_bad_cxx_cast_generic; 953 TryCastResult tcr = 954 TryReinterpretCast(Self, SrcExpr, DestType, 955 /*CStyle*/false, OpRange, msg, Kind); 956 if (tcr != TC_Success && msg != 0) { 957 if (SrcExpr.isInvalid()) // if conversion failed, don't report another error 958 return; 959 if (SrcExpr.get()->getType() == Self.Context.OverloadTy) { 960 //FIXME: &f<int>; is overloaded and resolvable 961 Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_overload) 962 << OverloadExpr::find(SrcExpr.get()).Expression->getName() 963 << DestType << OpRange; 964 Self.NoteAllOverloadCandidates(SrcExpr.get()); 965 966 } else { 967 diagnoseBadCast(Self, msg, CT_Reinterpret, OpRange, SrcExpr.get(), 968 DestType, /*listInitialization=*/false); 969 } 970 } 971 972 if (isValidCast(tcr)) { 973 if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) 974 checkObjCConversion(Sema::CCK_OtherCast); 975 DiagnoseReinterpretUpDownCast(Self, SrcExpr.get(), DestType, OpRange); 976 } else { 977 SrcExpr = ExprError(); 978 } 979 } 980 981 982 /// CheckStaticCast - Check that a static_cast\<DestType\>(SrcExpr) is valid. 983 /// Refer to C++ 5.2.9 for details. Static casts are mostly used for making 984 /// implicit conversions explicit and getting rid of data loss warnings. 985 void CastOperation::CheckStaticCast() { 986 if (isPlaceholder()) { 987 checkNonOverloadPlaceholders(); 988 if (SrcExpr.isInvalid()) 989 return; 990 } 991 992 // This test is outside everything else because it's the only case where 993 // a non-lvalue-reference target type does not lead to decay. 994 // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void". 995 if (DestType->isVoidType()) { 996 Kind = CK_ToVoid; 997 998 if (claimPlaceholder(BuiltinType::Overload)) { 999 Self.ResolveAndFixSingleFunctionTemplateSpecialization(SrcExpr, 1000 false, // Decay Function to ptr 1001 true, // Complain 1002 OpRange, DestType, diag::err_bad_static_cast_overload); 1003 if (SrcExpr.isInvalid()) 1004 return; 1005 } 1006 1007 SrcExpr = Self.IgnoredValueConversions(SrcExpr.get()); 1008 return; 1009 } 1010 1011 if (ValueKind == VK_RValue && !DestType->isRecordType() && 1012 !isPlaceholder(BuiltinType::Overload)) { 1013 SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get()); 1014 if (SrcExpr.isInvalid()) // if conversion failed, don't report another error 1015 return; 1016 } 1017 1018 unsigned msg = diag::err_bad_cxx_cast_generic; 1019 TryCastResult tcr 1020 = TryStaticCast(Self, SrcExpr, DestType, Sema::CCK_OtherCast, OpRange, msg, 1021 Kind, BasePath, /*ListInitialization=*/false); 1022 if (tcr != TC_Success && msg != 0) { 1023 if (SrcExpr.isInvalid()) 1024 return; 1025 if (SrcExpr.get()->getType() == Self.Context.OverloadTy) { 1026 OverloadExpr* oe = OverloadExpr::find(SrcExpr.get()).Expression; 1027 Self.Diag(OpRange.getBegin(), diag::err_bad_static_cast_overload) 1028 << oe->getName() << DestType << OpRange 1029 << oe->getQualifierLoc().getSourceRange(); 1030 Self.NoteAllOverloadCandidates(SrcExpr.get()); 1031 } else { 1032 diagnoseBadCast(Self, msg, CT_Static, OpRange, SrcExpr.get(), DestType, 1033 /*listInitialization=*/false); 1034 } 1035 } 1036 1037 if (isValidCast(tcr)) { 1038 if (Kind == CK_BitCast) 1039 checkCastAlign(); 1040 if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) 1041 checkObjCConversion(Sema::CCK_OtherCast); 1042 } else { 1043 SrcExpr = ExprError(); 1044 } 1045 } 1046 1047 static bool IsAddressSpaceConversion(QualType SrcType, QualType DestType) { 1048 auto *SrcPtrType = SrcType->getAs<PointerType>(); 1049 if (!SrcPtrType) 1050 return false; 1051 auto *DestPtrType = DestType->getAs<PointerType>(); 1052 if (!DestPtrType) 1053 return false; 1054 return SrcPtrType->getPointeeType().getAddressSpace() != 1055 DestPtrType->getPointeeType().getAddressSpace(); 1056 } 1057 1058 /// TryStaticCast - Check if a static cast can be performed, and do so if 1059 /// possible. If @p CStyle, ignore access restrictions on hierarchy casting 1060 /// and casting away constness. 1061 static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr, 1062 QualType DestType, 1063 Sema::CheckedConversionKind CCK, 1064 SourceRange OpRange, unsigned &msg, 1065 CastKind &Kind, CXXCastPath &BasePath, 1066 bool ListInitialization) { 1067 // Determine whether we have the semantics of a C-style cast. 1068 bool CStyle 1069 = (CCK == Sema::CCK_CStyleCast || CCK == Sema::CCK_FunctionalCast); 1070 1071 // The order the tests is not entirely arbitrary. There is one conversion 1072 // that can be handled in two different ways. Given: 1073 // struct A {}; 1074 // struct B : public A { 1075 // B(); B(const A&); 1076 // }; 1077 // const A &a = B(); 1078 // the cast static_cast<const B&>(a) could be seen as either a static 1079 // reference downcast, or an explicit invocation of the user-defined 1080 // conversion using B's conversion constructor. 1081 // DR 427 specifies that the downcast is to be applied here. 1082 1083 // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void". 1084 // Done outside this function. 1085 1086 TryCastResult tcr; 1087 1088 // C++ 5.2.9p5, reference downcast. 1089 // See the function for details. 1090 // DR 427 specifies that this is to be applied before paragraph 2. 1091 tcr = TryStaticReferenceDowncast(Self, SrcExpr.get(), DestType, CStyle, 1092 OpRange, msg, Kind, BasePath); 1093 if (tcr != TC_NotApplicable) 1094 return tcr; 1095 1096 // C++11 [expr.static.cast]p3: 1097 // A glvalue of type "cv1 T1" can be cast to type "rvalue reference to cv2 1098 // T2" if "cv2 T2" is reference-compatible with "cv1 T1". 1099 tcr = TryLValueToRValueCast(Self, SrcExpr.get(), DestType, CStyle, Kind, 1100 BasePath, msg); 1101 if (tcr != TC_NotApplicable) 1102 return tcr; 1103 1104 // C++ 5.2.9p2: An expression e can be explicitly converted to a type T 1105 // [...] if the declaration "T t(e);" is well-formed, [...]. 1106 tcr = TryStaticImplicitCast(Self, SrcExpr, DestType, CCK, OpRange, msg, 1107 Kind, ListInitialization); 1108 if (SrcExpr.isInvalid()) 1109 return TC_Failed; 1110 if (tcr != TC_NotApplicable) 1111 return tcr; 1112 1113 // C++ 5.2.9p6: May apply the reverse of any standard conversion, except 1114 // lvalue-to-rvalue, array-to-pointer, function-to-pointer, and boolean 1115 // conversions, subject to further restrictions. 1116 // Also, C++ 5.2.9p1 forbids casting away constness, which makes reversal 1117 // of qualification conversions impossible. 1118 // In the CStyle case, the earlier attempt to const_cast should have taken 1119 // care of reverse qualification conversions. 1120 1121 QualType SrcType = Self.Context.getCanonicalType(SrcExpr.get()->getType()); 1122 1123 // C++0x 5.2.9p9: A value of a scoped enumeration type can be explicitly 1124 // converted to an integral type. [...] A value of a scoped enumeration type 1125 // can also be explicitly converted to a floating-point type [...]. 1126 if (const EnumType *Enum = SrcType->getAs<EnumType>()) { 1127 if (Enum->getDecl()->isScoped()) { 1128 if (DestType->isBooleanType()) { 1129 Kind = CK_IntegralToBoolean; 1130 return TC_Success; 1131 } else if (DestType->isIntegralType(Self.Context)) { 1132 Kind = CK_IntegralCast; 1133 return TC_Success; 1134 } else if (DestType->isRealFloatingType()) { 1135 Kind = CK_IntegralToFloating; 1136 return TC_Success; 1137 } 1138 } 1139 } 1140 1141 // Reverse integral promotion/conversion. All such conversions are themselves 1142 // again integral promotions or conversions and are thus already handled by 1143 // p2 (TryDirectInitialization above). 1144 // (Note: any data loss warnings should be suppressed.) 1145 // The exception is the reverse of enum->integer, i.e. integer->enum (and 1146 // enum->enum). See also C++ 5.2.9p7. 1147 // The same goes for reverse floating point promotion/conversion and 1148 // floating-integral conversions. Again, only floating->enum is relevant. 1149 if (DestType->isEnumeralType()) { 1150 if (SrcType->isIntegralOrEnumerationType()) { 1151 Kind = CK_IntegralCast; 1152 return TC_Success; 1153 } else if (SrcType->isRealFloatingType()) { 1154 Kind = CK_FloatingToIntegral; 1155 return TC_Success; 1156 } 1157 } 1158 1159 // Reverse pointer upcast. C++ 4.10p3 specifies pointer upcast. 1160 // C++ 5.2.9p8 additionally disallows a cast path through virtual inheritance. 1161 tcr = TryStaticPointerDowncast(Self, SrcType, DestType, CStyle, OpRange, msg, 1162 Kind, BasePath); 1163 if (tcr != TC_NotApplicable) 1164 return tcr; 1165 1166 // Reverse member pointer conversion. C++ 4.11 specifies member pointer 1167 // conversion. C++ 5.2.9p9 has additional information. 1168 // DR54's access restrictions apply here also. 1169 tcr = TryStaticMemberPointerUpcast(Self, SrcExpr, SrcType, DestType, CStyle, 1170 OpRange, msg, Kind, BasePath); 1171 if (tcr != TC_NotApplicable) 1172 return tcr; 1173 1174 // Reverse pointer conversion to void*. C++ 4.10.p2 specifies conversion to 1175 // void*. C++ 5.2.9p10 specifies additional restrictions, which really is 1176 // just the usual constness stuff. 1177 if (const PointerType *SrcPointer = SrcType->getAs<PointerType>()) { 1178 QualType SrcPointee = SrcPointer->getPointeeType(); 1179 if (SrcPointee->isVoidType()) { 1180 if (const PointerType *DestPointer = DestType->getAs<PointerType>()) { 1181 QualType DestPointee = DestPointer->getPointeeType(); 1182 if (DestPointee->isIncompleteOrObjectType()) { 1183 // This is definitely the intended conversion, but it might fail due 1184 // to a qualifier violation. Note that we permit Objective-C lifetime 1185 // and GC qualifier mismatches here. 1186 if (!CStyle) { 1187 Qualifiers DestPointeeQuals = DestPointee.getQualifiers(); 1188 Qualifiers SrcPointeeQuals = SrcPointee.getQualifiers(); 1189 DestPointeeQuals.removeObjCGCAttr(); 1190 DestPointeeQuals.removeObjCLifetime(); 1191 SrcPointeeQuals.removeObjCGCAttr(); 1192 SrcPointeeQuals.removeObjCLifetime(); 1193 if (DestPointeeQuals != SrcPointeeQuals && 1194 !DestPointeeQuals.compatiblyIncludes(SrcPointeeQuals)) { 1195 msg = diag::err_bad_cxx_cast_qualifiers_away; 1196 return TC_Failed; 1197 } 1198 } 1199 Kind = IsAddressSpaceConversion(SrcType, DestType) 1200 ? CK_AddressSpaceConversion 1201 : CK_BitCast; 1202 return TC_Success; 1203 } 1204 1205 // Microsoft permits static_cast from 'pointer-to-void' to 1206 // 'pointer-to-function'. 1207 if (!CStyle && Self.getLangOpts().MSVCCompat && 1208 DestPointee->isFunctionType()) { 1209 Self.Diag(OpRange.getBegin(), diag::ext_ms_cast_fn_obj) << OpRange; 1210 Kind = CK_BitCast; 1211 return TC_Success; 1212 } 1213 } 1214 else if (DestType->isObjCObjectPointerType()) { 1215 // allow both c-style cast and static_cast of objective-c pointers as 1216 // they are pervasive. 1217 Kind = CK_CPointerToObjCPointerCast; 1218 return TC_Success; 1219 } 1220 else if (CStyle && DestType->isBlockPointerType()) { 1221 // allow c-style cast of void * to block pointers. 1222 Kind = CK_AnyPointerToBlockPointerCast; 1223 return TC_Success; 1224 } 1225 } 1226 } 1227 // Allow arbitrary objective-c pointer conversion with static casts. 1228 if (SrcType->isObjCObjectPointerType() && 1229 DestType->isObjCObjectPointerType()) { 1230 Kind = CK_BitCast; 1231 return TC_Success; 1232 } 1233 // Allow ns-pointer to cf-pointer conversion in either direction 1234 // with static casts. 1235 if (!CStyle && 1236 Self.CheckTollFreeBridgeStaticCast(DestType, SrcExpr.get(), Kind)) 1237 return TC_Success; 1238 1239 // See if it looks like the user is trying to convert between 1240 // related record types, and select a better diagnostic if so. 1241 if (auto SrcPointer = SrcType->getAs<PointerType>()) 1242 if (auto DestPointer = DestType->getAs<PointerType>()) 1243 if (SrcPointer->getPointeeType()->getAs<RecordType>() && 1244 DestPointer->getPointeeType()->getAs<RecordType>()) 1245 msg = diag::err_bad_cxx_cast_unrelated_class; 1246 1247 // We tried everything. Everything! Nothing works! :-( 1248 return TC_NotApplicable; 1249 } 1250 1251 /// Tests whether a conversion according to N2844 is valid. 1252 TryCastResult TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, 1253 QualType DestType, bool CStyle, 1254 CastKind &Kind, CXXCastPath &BasePath, 1255 unsigned &msg) { 1256 // C++11 [expr.static.cast]p3: 1257 // A glvalue of type "cv1 T1" can be cast to type "rvalue reference to 1258 // cv2 T2" if "cv2 T2" is reference-compatible with "cv1 T1". 1259 const RValueReferenceType *R = DestType->getAs<RValueReferenceType>(); 1260 if (!R) 1261 return TC_NotApplicable; 1262 1263 if (!SrcExpr->isGLValue()) 1264 return TC_NotApplicable; 1265 1266 // Because we try the reference downcast before this function, from now on 1267 // this is the only cast possibility, so we issue an error if we fail now. 1268 // FIXME: Should allow casting away constness if CStyle. 1269 bool DerivedToBase; 1270 bool ObjCConversion; 1271 bool ObjCLifetimeConversion; 1272 QualType FromType = SrcExpr->getType(); 1273 QualType ToType = R->getPointeeType(); 1274 if (CStyle) { 1275 FromType = FromType.getUnqualifiedType(); 1276 ToType = ToType.getUnqualifiedType(); 1277 } 1278 1279 Sema::ReferenceCompareResult RefResult = Self.CompareReferenceRelationship( 1280 SrcExpr->getBeginLoc(), ToType, FromType, DerivedToBase, ObjCConversion, 1281 ObjCLifetimeConversion); 1282 if (RefResult != Sema::Ref_Compatible) { 1283 if (CStyle || RefResult == Sema::Ref_Incompatible) 1284 return TC_NotApplicable; 1285 // Diagnose types which are reference-related but not compatible here since 1286 // we can provide better diagnostics. In these cases forwarding to 1287 // [expr.static.cast]p4 should never result in a well-formed cast. 1288 msg = SrcExpr->isLValue() ? diag::err_bad_lvalue_to_rvalue_cast 1289 : diag::err_bad_rvalue_to_rvalue_cast; 1290 return TC_Failed; 1291 } 1292 1293 if (DerivedToBase) { 1294 Kind = CK_DerivedToBase; 1295 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, 1296 /*DetectVirtual=*/true); 1297 if (!Self.IsDerivedFrom(SrcExpr->getBeginLoc(), SrcExpr->getType(), 1298 R->getPointeeType(), Paths)) 1299 return TC_NotApplicable; 1300 1301 Self.BuildBasePathArray(Paths, BasePath); 1302 } else 1303 Kind = CK_NoOp; 1304 1305 return TC_Success; 1306 } 1307 1308 /// Tests whether a conversion according to C++ 5.2.9p5 is valid. 1309 TryCastResult 1310 TryStaticReferenceDowncast(Sema &Self, Expr *SrcExpr, QualType DestType, 1311 bool CStyle, SourceRange OpRange, 1312 unsigned &msg, CastKind &Kind, 1313 CXXCastPath &BasePath) { 1314 // C++ 5.2.9p5: An lvalue of type "cv1 B", where B is a class type, can be 1315 // cast to type "reference to cv2 D", where D is a class derived from B, 1316 // if a valid standard conversion from "pointer to D" to "pointer to B" 1317 // exists, cv2 >= cv1, and B is not a virtual base class of D. 1318 // In addition, DR54 clarifies that the base must be accessible in the 1319 // current context. Although the wording of DR54 only applies to the pointer 1320 // variant of this rule, the intent is clearly for it to apply to the this 1321 // conversion as well. 1322 1323 const ReferenceType *DestReference = DestType->getAs<ReferenceType>(); 1324 if (!DestReference) { 1325 return TC_NotApplicable; 1326 } 1327 bool RValueRef = DestReference->isRValueReferenceType(); 1328 if (!RValueRef && !SrcExpr->isLValue()) { 1329 // We know the left side is an lvalue reference, so we can suggest a reason. 1330 msg = diag::err_bad_cxx_cast_rvalue; 1331 return TC_NotApplicable; 1332 } 1333 1334 QualType DestPointee = DestReference->getPointeeType(); 1335 1336 // FIXME: If the source is a prvalue, we should issue a warning (because the 1337 // cast always has undefined behavior), and for AST consistency, we should 1338 // materialize a temporary. 1339 return TryStaticDowncast(Self, 1340 Self.Context.getCanonicalType(SrcExpr->getType()), 1341 Self.Context.getCanonicalType(DestPointee), CStyle, 1342 OpRange, SrcExpr->getType(), DestType, msg, Kind, 1343 BasePath); 1344 } 1345 1346 /// Tests whether a conversion according to C++ 5.2.9p8 is valid. 1347 TryCastResult 1348 TryStaticPointerDowncast(Sema &Self, QualType SrcType, QualType DestType, 1349 bool CStyle, SourceRange OpRange, 1350 unsigned &msg, CastKind &Kind, 1351 CXXCastPath &BasePath) { 1352 // C++ 5.2.9p8: An rvalue of type "pointer to cv1 B", where B is a class 1353 // type, can be converted to an rvalue of type "pointer to cv2 D", where D 1354 // is a class derived from B, if a valid standard conversion from "pointer 1355 // to D" to "pointer to B" exists, cv2 >= cv1, and B is not a virtual base 1356 // class of D. 1357 // In addition, DR54 clarifies that the base must be accessible in the 1358 // current context. 1359 1360 const PointerType *DestPointer = DestType->getAs<PointerType>(); 1361 if (!DestPointer) { 1362 return TC_NotApplicable; 1363 } 1364 1365 const PointerType *SrcPointer = SrcType->getAs<PointerType>(); 1366 if (!SrcPointer) { 1367 msg = diag::err_bad_static_cast_pointer_nonpointer; 1368 return TC_NotApplicable; 1369 } 1370 1371 return TryStaticDowncast(Self, 1372 Self.Context.getCanonicalType(SrcPointer->getPointeeType()), 1373 Self.Context.getCanonicalType(DestPointer->getPointeeType()), 1374 CStyle, OpRange, SrcType, DestType, msg, Kind, 1375 BasePath); 1376 } 1377 1378 /// TryStaticDowncast - Common functionality of TryStaticReferenceDowncast and 1379 /// TryStaticPointerDowncast. Tests whether a static downcast from SrcType to 1380 /// DestType is possible and allowed. 1381 TryCastResult 1382 TryStaticDowncast(Sema &Self, CanQualType SrcType, CanQualType DestType, 1383 bool CStyle, SourceRange OpRange, QualType OrigSrcType, 1384 QualType OrigDestType, unsigned &msg, 1385 CastKind &Kind, CXXCastPath &BasePath) { 1386 // We can only work with complete types. But don't complain if it doesn't work 1387 if (!Self.isCompleteType(OpRange.getBegin(), SrcType) || 1388 !Self.isCompleteType(OpRange.getBegin(), DestType)) 1389 return TC_NotApplicable; 1390 1391 // Downcast can only happen in class hierarchies, so we need classes. 1392 if (!DestType->getAs<RecordType>() || !SrcType->getAs<RecordType>()) { 1393 return TC_NotApplicable; 1394 } 1395 1396 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, 1397 /*DetectVirtual=*/true); 1398 if (!Self.IsDerivedFrom(OpRange.getBegin(), DestType, SrcType, Paths)) { 1399 return TC_NotApplicable; 1400 } 1401 1402 // Target type does derive from source type. Now we're serious. If an error 1403 // appears now, it's not ignored. 1404 // This may not be entirely in line with the standard. Take for example: 1405 // struct A {}; 1406 // struct B : virtual A { 1407 // B(A&); 1408 // }; 1409 // 1410 // void f() 1411 // { 1412 // (void)static_cast<const B&>(*((A*)0)); 1413 // } 1414 // As far as the standard is concerned, p5 does not apply (A is virtual), so 1415 // p2 should be used instead - "const B& t(*((A*)0));" is perfectly valid. 1416 // However, both GCC and Comeau reject this example, and accepting it would 1417 // mean more complex code if we're to preserve the nice error message. 1418 // FIXME: Being 100% compliant here would be nice to have. 1419 1420 // Must preserve cv, as always, unless we're in C-style mode. 1421 if (!CStyle && !DestType.isAtLeastAsQualifiedAs(SrcType)) { 1422 msg = diag::err_bad_cxx_cast_qualifiers_away; 1423 return TC_Failed; 1424 } 1425 1426 if (Paths.isAmbiguous(SrcType.getUnqualifiedType())) { 1427 // This code is analoguous to that in CheckDerivedToBaseConversion, except 1428 // that it builds the paths in reverse order. 1429 // To sum up: record all paths to the base and build a nice string from 1430 // them. Use it to spice up the error message. 1431 if (!Paths.isRecordingPaths()) { 1432 Paths.clear(); 1433 Paths.setRecordingPaths(true); 1434 Self.IsDerivedFrom(OpRange.getBegin(), DestType, SrcType, Paths); 1435 } 1436 std::string PathDisplayStr; 1437 std::set<unsigned> DisplayedPaths; 1438 for (clang::CXXBasePath &Path : Paths) { 1439 if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) { 1440 // We haven't displayed a path to this particular base 1441 // class subobject yet. 1442 PathDisplayStr += "\n "; 1443 for (CXXBasePathElement &PE : llvm::reverse(Path)) 1444 PathDisplayStr += PE.Base->getType().getAsString() + " -> "; 1445 PathDisplayStr += QualType(DestType).getAsString(); 1446 } 1447 } 1448 1449 Self.Diag(OpRange.getBegin(), diag::err_ambiguous_base_to_derived_cast) 1450 << QualType(SrcType).getUnqualifiedType() 1451 << QualType(DestType).getUnqualifiedType() 1452 << PathDisplayStr << OpRange; 1453 msg = 0; 1454 return TC_Failed; 1455 } 1456 1457 if (Paths.getDetectedVirtual() != nullptr) { 1458 QualType VirtualBase(Paths.getDetectedVirtual(), 0); 1459 Self.Diag(OpRange.getBegin(), diag::err_static_downcast_via_virtual) 1460 << OrigSrcType << OrigDestType << VirtualBase << OpRange; 1461 msg = 0; 1462 return TC_Failed; 1463 } 1464 1465 if (!CStyle) { 1466 switch (Self.CheckBaseClassAccess(OpRange.getBegin(), 1467 SrcType, DestType, 1468 Paths.front(), 1469 diag::err_downcast_from_inaccessible_base)) { 1470 case Sema::AR_accessible: 1471 case Sema::AR_delayed: // be optimistic 1472 case Sema::AR_dependent: // be optimistic 1473 break; 1474 1475 case Sema::AR_inaccessible: 1476 msg = 0; 1477 return TC_Failed; 1478 } 1479 } 1480 1481 Self.BuildBasePathArray(Paths, BasePath); 1482 Kind = CK_BaseToDerived; 1483 return TC_Success; 1484 } 1485 1486 /// TryStaticMemberPointerUpcast - Tests whether a conversion according to 1487 /// C++ 5.2.9p9 is valid: 1488 /// 1489 /// An rvalue of type "pointer to member of D of type cv1 T" can be 1490 /// converted to an rvalue of type "pointer to member of B of type cv2 T", 1491 /// where B is a base class of D [...]. 1492 /// 1493 TryCastResult 1494 TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, QualType SrcType, 1495 QualType DestType, bool CStyle, 1496 SourceRange OpRange, 1497 unsigned &msg, CastKind &Kind, 1498 CXXCastPath &BasePath) { 1499 const MemberPointerType *DestMemPtr = DestType->getAs<MemberPointerType>(); 1500 if (!DestMemPtr) 1501 return TC_NotApplicable; 1502 1503 bool WasOverloadedFunction = false; 1504 DeclAccessPair FoundOverload; 1505 if (SrcExpr.get()->getType() == Self.Context.OverloadTy) { 1506 if (FunctionDecl *Fn 1507 = Self.ResolveAddressOfOverloadedFunction(SrcExpr.get(), DestType, false, 1508 FoundOverload)) { 1509 CXXMethodDecl *M = cast<CXXMethodDecl>(Fn); 1510 SrcType = Self.Context.getMemberPointerType(Fn->getType(), 1511 Self.Context.getTypeDeclType(M->getParent()).getTypePtr()); 1512 WasOverloadedFunction = true; 1513 } 1514 } 1515 1516 const MemberPointerType *SrcMemPtr = SrcType->getAs<MemberPointerType>(); 1517 if (!SrcMemPtr) { 1518 msg = diag::err_bad_static_cast_member_pointer_nonmp; 1519 return TC_NotApplicable; 1520 } 1521 1522 // Lock down the inheritance model right now in MS ABI, whether or not the 1523 // pointee types are the same. 1524 if (Self.Context.getTargetInfo().getCXXABI().isMicrosoft()) { 1525 (void)Self.isCompleteType(OpRange.getBegin(), SrcType); 1526 (void)Self.isCompleteType(OpRange.getBegin(), DestType); 1527 } 1528 1529 // T == T, modulo cv 1530 if (!Self.Context.hasSameUnqualifiedType(SrcMemPtr->getPointeeType(), 1531 DestMemPtr->getPointeeType())) 1532 return TC_NotApplicable; 1533 1534 // B base of D 1535 QualType SrcClass(SrcMemPtr->getClass(), 0); 1536 QualType DestClass(DestMemPtr->getClass(), 0); 1537 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, 1538 /*DetectVirtual=*/true); 1539 if (!Self.IsDerivedFrom(OpRange.getBegin(), SrcClass, DestClass, Paths)) 1540 return TC_NotApplicable; 1541 1542 // B is a base of D. But is it an allowed base? If not, it's a hard error. 1543 if (Paths.isAmbiguous(Self.Context.getCanonicalType(DestClass))) { 1544 Paths.clear(); 1545 Paths.setRecordingPaths(true); 1546 bool StillOkay = 1547 Self.IsDerivedFrom(OpRange.getBegin(), SrcClass, DestClass, Paths); 1548 assert(StillOkay); 1549 (void)StillOkay; 1550 std::string PathDisplayStr = Self.getAmbiguousPathsDisplayString(Paths); 1551 Self.Diag(OpRange.getBegin(), diag::err_ambiguous_memptr_conv) 1552 << 1 << SrcClass << DestClass << PathDisplayStr << OpRange; 1553 msg = 0; 1554 return TC_Failed; 1555 } 1556 1557 if (const RecordType *VBase = Paths.getDetectedVirtual()) { 1558 Self.Diag(OpRange.getBegin(), diag::err_memptr_conv_via_virtual) 1559 << SrcClass << DestClass << QualType(VBase, 0) << OpRange; 1560 msg = 0; 1561 return TC_Failed; 1562 } 1563 1564 if (!CStyle) { 1565 switch (Self.CheckBaseClassAccess(OpRange.getBegin(), 1566 DestClass, SrcClass, 1567 Paths.front(), 1568 diag::err_upcast_to_inaccessible_base)) { 1569 case Sema::AR_accessible: 1570 case Sema::AR_delayed: 1571 case Sema::AR_dependent: 1572 // Optimistically assume that the delayed and dependent cases 1573 // will work out. 1574 break; 1575 1576 case Sema::AR_inaccessible: 1577 msg = 0; 1578 return TC_Failed; 1579 } 1580 } 1581 1582 if (WasOverloadedFunction) { 1583 // Resolve the address of the overloaded function again, this time 1584 // allowing complaints if something goes wrong. 1585 FunctionDecl *Fn = Self.ResolveAddressOfOverloadedFunction(SrcExpr.get(), 1586 DestType, 1587 true, 1588 FoundOverload); 1589 if (!Fn) { 1590 msg = 0; 1591 return TC_Failed; 1592 } 1593 1594 SrcExpr = Self.FixOverloadedFunctionReference(SrcExpr, FoundOverload, Fn); 1595 if (!SrcExpr.isUsable()) { 1596 msg = 0; 1597 return TC_Failed; 1598 } 1599 } 1600 1601 Self.BuildBasePathArray(Paths, BasePath); 1602 Kind = CK_DerivedToBaseMemberPointer; 1603 return TC_Success; 1604 } 1605 1606 /// TryStaticImplicitCast - Tests whether a conversion according to C++ 5.2.9p2 1607 /// is valid: 1608 /// 1609 /// An expression e can be explicitly converted to a type T using a 1610 /// @c static_cast if the declaration "T t(e);" is well-formed [...]. 1611 TryCastResult 1612 TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, 1613 Sema::CheckedConversionKind CCK, 1614 SourceRange OpRange, unsigned &msg, 1615 CastKind &Kind, bool ListInitialization) { 1616 if (DestType->isRecordType()) { 1617 if (Self.RequireCompleteType(OpRange.getBegin(), DestType, 1618 diag::err_bad_dynamic_cast_incomplete) || 1619 Self.RequireNonAbstractType(OpRange.getBegin(), DestType, 1620 diag::err_allocation_of_abstract_type)) { 1621 msg = 0; 1622 return TC_Failed; 1623 } 1624 } 1625 1626 InitializedEntity Entity = InitializedEntity::InitializeTemporary(DestType); 1627 InitializationKind InitKind 1628 = (CCK == Sema::CCK_CStyleCast) 1629 ? InitializationKind::CreateCStyleCast(OpRange.getBegin(), OpRange, 1630 ListInitialization) 1631 : (CCK == Sema::CCK_FunctionalCast) 1632 ? InitializationKind::CreateFunctionalCast(OpRange, ListInitialization) 1633 : InitializationKind::CreateCast(OpRange); 1634 Expr *SrcExprRaw = SrcExpr.get(); 1635 // FIXME: Per DR242, we should check for an implicit conversion sequence 1636 // or for a constructor that could be invoked by direct-initialization 1637 // here, not for an initialization sequence. 1638 InitializationSequence InitSeq(Self, Entity, InitKind, SrcExprRaw); 1639 1640 // At this point of CheckStaticCast, if the destination is a reference, 1641 // or the expression is an overload expression this has to work. 1642 // There is no other way that works. 1643 // On the other hand, if we're checking a C-style cast, we've still got 1644 // the reinterpret_cast way. 1645 bool CStyle 1646 = (CCK == Sema::CCK_CStyleCast || CCK == Sema::CCK_FunctionalCast); 1647 if (InitSeq.Failed() && (CStyle || !DestType->isReferenceType())) 1648 return TC_NotApplicable; 1649 1650 ExprResult Result = InitSeq.Perform(Self, Entity, InitKind, SrcExprRaw); 1651 if (Result.isInvalid()) { 1652 msg = 0; 1653 return TC_Failed; 1654 } 1655 1656 if (InitSeq.isConstructorInitialization()) 1657 Kind = CK_ConstructorConversion; 1658 else 1659 Kind = CK_NoOp; 1660 1661 SrcExpr = Result; 1662 return TC_Success; 1663 } 1664 1665 /// TryConstCast - See if a const_cast from source to destination is allowed, 1666 /// and perform it if it is. 1667 static TryCastResult TryConstCast(Sema &Self, ExprResult &SrcExpr, 1668 QualType DestType, bool CStyle, 1669 unsigned &msg) { 1670 DestType = Self.Context.getCanonicalType(DestType); 1671 QualType SrcType = SrcExpr.get()->getType(); 1672 bool NeedToMaterializeTemporary = false; 1673 1674 if (const ReferenceType *DestTypeTmp =DestType->getAs<ReferenceType>()) { 1675 // C++11 5.2.11p4: 1676 // if a pointer to T1 can be explicitly converted to the type "pointer to 1677 // T2" using a const_cast, then the following conversions can also be 1678 // made: 1679 // -- an lvalue of type T1 can be explicitly converted to an lvalue of 1680 // type T2 using the cast const_cast<T2&>; 1681 // -- a glvalue of type T1 can be explicitly converted to an xvalue of 1682 // type T2 using the cast const_cast<T2&&>; and 1683 // -- if T1 is a class type, a prvalue of type T1 can be explicitly 1684 // converted to an xvalue of type T2 using the cast const_cast<T2&&>. 1685 1686 if (isa<LValueReferenceType>(DestTypeTmp) && !SrcExpr.get()->isLValue()) { 1687 // Cannot const_cast non-lvalue to lvalue reference type. But if this 1688 // is C-style, static_cast might find a way, so we simply suggest a 1689 // message and tell the parent to keep searching. 1690 msg = diag::err_bad_cxx_cast_rvalue; 1691 return TC_NotApplicable; 1692 } 1693 1694 if (isa<RValueReferenceType>(DestTypeTmp) && SrcExpr.get()->isRValue()) { 1695 if (!SrcType->isRecordType()) { 1696 // Cannot const_cast non-class prvalue to rvalue reference type. But if 1697 // this is C-style, static_cast can do this. 1698 msg = diag::err_bad_cxx_cast_rvalue; 1699 return TC_NotApplicable; 1700 } 1701 1702 // Materialize the class prvalue so that the const_cast can bind a 1703 // reference to it. 1704 NeedToMaterializeTemporary = true; 1705 } 1706 1707 // It's not completely clear under the standard whether we can 1708 // const_cast bit-field gl-values. Doing so would not be 1709 // intrinsically complicated, but for now, we say no for 1710 // consistency with other compilers and await the word of the 1711 // committee. 1712 if (SrcExpr.get()->refersToBitField()) { 1713 msg = diag::err_bad_cxx_cast_bitfield; 1714 return TC_NotApplicable; 1715 } 1716 1717 DestType = Self.Context.getPointerType(DestTypeTmp->getPointeeType()); 1718 SrcType = Self.Context.getPointerType(SrcType); 1719 } 1720 1721 // C++ 5.2.11p5: For a const_cast involving pointers to data members [...] 1722 // the rules for const_cast are the same as those used for pointers. 1723 1724 if (!DestType->isPointerType() && 1725 !DestType->isMemberPointerType() && 1726 !DestType->isObjCObjectPointerType()) { 1727 // Cannot cast to non-pointer, non-reference type. Note that, if DestType 1728 // was a reference type, we converted it to a pointer above. 1729 // The status of rvalue references isn't entirely clear, but it looks like 1730 // conversion to them is simply invalid. 1731 // C++ 5.2.11p3: For two pointer types [...] 1732 if (!CStyle) 1733 msg = diag::err_bad_const_cast_dest; 1734 return TC_NotApplicable; 1735 } 1736 if (DestType->isFunctionPointerType() || 1737 DestType->isMemberFunctionPointerType()) { 1738 // Cannot cast direct function pointers. 1739 // C++ 5.2.11p2: [...] where T is any object type or the void type [...] 1740 // T is the ultimate pointee of source and target type. 1741 if (!CStyle) 1742 msg = diag::err_bad_const_cast_dest; 1743 return TC_NotApplicable; 1744 } 1745 1746 // C++ [expr.const.cast]p3: 1747 // "For two similar types T1 and T2, [...]" 1748 // 1749 // We only allow a const_cast to change cvr-qualifiers, not other kinds of 1750 // type qualifiers. (Likewise, we ignore other changes when determining 1751 // whether a cast casts away constness.) 1752 if (!Self.Context.hasCvrSimilarType(SrcType, DestType)) 1753 return TC_NotApplicable; 1754 1755 if (NeedToMaterializeTemporary) 1756 // This is a const_cast from a class prvalue to an rvalue reference type. 1757 // Materialize a temporary to store the result of the conversion. 1758 SrcExpr = Self.CreateMaterializeTemporaryExpr(SrcExpr.get()->getType(), 1759 SrcExpr.get(), 1760 /*IsLValueReference*/ false); 1761 1762 return TC_Success; 1763 } 1764 1765 // Checks for undefined behavior in reinterpret_cast. 1766 // The cases that is checked for is: 1767 // *reinterpret_cast<T*>(&a) 1768 // reinterpret_cast<T&>(a) 1769 // where accessing 'a' as type 'T' will result in undefined behavior. 1770 void Sema::CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, 1771 bool IsDereference, 1772 SourceRange Range) { 1773 unsigned DiagID = IsDereference ? 1774 diag::warn_pointer_indirection_from_incompatible_type : 1775 diag::warn_undefined_reinterpret_cast; 1776 1777 if (Diags.isIgnored(DiagID, Range.getBegin())) 1778 return; 1779 1780 QualType SrcTy, DestTy; 1781 if (IsDereference) { 1782 if (!SrcType->getAs<PointerType>() || !DestType->getAs<PointerType>()) { 1783 return; 1784 } 1785 SrcTy = SrcType->getPointeeType(); 1786 DestTy = DestType->getPointeeType(); 1787 } else { 1788 if (!DestType->getAs<ReferenceType>()) { 1789 return; 1790 } 1791 SrcTy = SrcType; 1792 DestTy = DestType->getPointeeType(); 1793 } 1794 1795 // Cast is compatible if the types are the same. 1796 if (Context.hasSameUnqualifiedType(DestTy, SrcTy)) { 1797 return; 1798 } 1799 // or one of the types is a char or void type 1800 if (DestTy->isAnyCharacterType() || DestTy->isVoidType() || 1801 SrcTy->isAnyCharacterType() || SrcTy->isVoidType()) { 1802 return; 1803 } 1804 // or one of the types is a tag type. 1805 if (SrcTy->getAs<TagType>() || DestTy->getAs<TagType>()) { 1806 return; 1807 } 1808 1809 // FIXME: Scoped enums? 1810 if ((SrcTy->isUnsignedIntegerType() && DestTy->isSignedIntegerType()) || 1811 (SrcTy->isSignedIntegerType() && DestTy->isUnsignedIntegerType())) { 1812 if (Context.getTypeSize(DestTy) == Context.getTypeSize(SrcTy)) { 1813 return; 1814 } 1815 } 1816 1817 Diag(Range.getBegin(), DiagID) << SrcType << DestType << Range; 1818 } 1819 1820 static void DiagnoseCastOfObjCSEL(Sema &Self, const ExprResult &SrcExpr, 1821 QualType DestType) { 1822 QualType SrcType = SrcExpr.get()->getType(); 1823 if (Self.Context.hasSameType(SrcType, DestType)) 1824 return; 1825 if (const PointerType *SrcPtrTy = SrcType->getAs<PointerType>()) 1826 if (SrcPtrTy->isObjCSelType()) { 1827 QualType DT = DestType; 1828 if (isa<PointerType>(DestType)) 1829 DT = DestType->getPointeeType(); 1830 if (!DT.getUnqualifiedType()->isVoidType()) 1831 Self.Diag(SrcExpr.get()->getExprLoc(), 1832 diag::warn_cast_pointer_from_sel) 1833 << SrcType << DestType << SrcExpr.get()->getSourceRange(); 1834 } 1835 } 1836 1837 /// Diagnose casts that change the calling convention of a pointer to a function 1838 /// defined in the current TU. 1839 static void DiagnoseCallingConvCast(Sema &Self, const ExprResult &SrcExpr, 1840 QualType DstType, SourceRange OpRange) { 1841 // Check if this cast would change the calling convention of a function 1842 // pointer type. 1843 QualType SrcType = SrcExpr.get()->getType(); 1844 if (Self.Context.hasSameType(SrcType, DstType) || 1845 !SrcType->isFunctionPointerType() || !DstType->isFunctionPointerType()) 1846 return; 1847 const auto *SrcFTy = 1848 SrcType->castAs<PointerType>()->getPointeeType()->castAs<FunctionType>(); 1849 const auto *DstFTy = 1850 DstType->castAs<PointerType>()->getPointeeType()->castAs<FunctionType>(); 1851 CallingConv SrcCC = SrcFTy->getCallConv(); 1852 CallingConv DstCC = DstFTy->getCallConv(); 1853 if (SrcCC == DstCC) 1854 return; 1855 1856 // We have a calling convention cast. Check if the source is a pointer to a 1857 // known, specific function that has already been defined. 1858 Expr *Src = SrcExpr.get()->IgnoreParenImpCasts(); 1859 if (auto *UO = dyn_cast<UnaryOperator>(Src)) 1860 if (UO->getOpcode() == UO_AddrOf) 1861 Src = UO->getSubExpr()->IgnoreParenImpCasts(); 1862 auto *DRE = dyn_cast<DeclRefExpr>(Src); 1863 if (!DRE) 1864 return; 1865 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()); 1866 if (!FD) 1867 return; 1868 1869 // Only warn if we are casting from the default convention to a non-default 1870 // convention. This can happen when the programmer forgot to apply the calling 1871 // convention to the function declaration and then inserted this cast to 1872 // satisfy the type system. 1873 CallingConv DefaultCC = Self.getASTContext().getDefaultCallingConvention( 1874 FD->isVariadic(), FD->isCXXInstanceMember()); 1875 if (DstCC == DefaultCC || SrcCC != DefaultCC) 1876 return; 1877 1878 // Diagnose this cast, as it is probably bad. 1879 StringRef SrcCCName = FunctionType::getNameForCallConv(SrcCC); 1880 StringRef DstCCName = FunctionType::getNameForCallConv(DstCC); 1881 Self.Diag(OpRange.getBegin(), diag::warn_cast_calling_conv) 1882 << SrcCCName << DstCCName << OpRange; 1883 1884 // The checks above are cheaper than checking if the diagnostic is enabled. 1885 // However, it's worth checking if the warning is enabled before we construct 1886 // a fixit. 1887 if (Self.Diags.isIgnored(diag::warn_cast_calling_conv, OpRange.getBegin())) 1888 return; 1889 1890 // Try to suggest a fixit to change the calling convention of the function 1891 // whose address was taken. Try to use the latest macro for the convention. 1892 // For example, users probably want to write "WINAPI" instead of "__stdcall" 1893 // to match the Windows header declarations. 1894 SourceLocation NameLoc = FD->getFirstDecl()->getNameInfo().getLoc(); 1895 Preprocessor &PP = Self.getPreprocessor(); 1896 SmallVector<TokenValue, 6> AttrTokens; 1897 SmallString<64> CCAttrText; 1898 llvm::raw_svector_ostream OS(CCAttrText); 1899 if (Self.getLangOpts().MicrosoftExt) { 1900 // __stdcall or __vectorcall 1901 OS << "__" << DstCCName; 1902 IdentifierInfo *II = PP.getIdentifierInfo(OS.str()); 1903 AttrTokens.push_back(II->isKeyword(Self.getLangOpts()) 1904 ? TokenValue(II->getTokenID()) 1905 : TokenValue(II)); 1906 } else { 1907 // __attribute__((stdcall)) or __attribute__((vectorcall)) 1908 OS << "__attribute__((" << DstCCName << "))"; 1909 AttrTokens.push_back(tok::kw___attribute); 1910 AttrTokens.push_back(tok::l_paren); 1911 AttrTokens.push_back(tok::l_paren); 1912 IdentifierInfo *II = PP.getIdentifierInfo(DstCCName); 1913 AttrTokens.push_back(II->isKeyword(Self.getLangOpts()) 1914 ? TokenValue(II->getTokenID()) 1915 : TokenValue(II)); 1916 AttrTokens.push_back(tok::r_paren); 1917 AttrTokens.push_back(tok::r_paren); 1918 } 1919 StringRef AttrSpelling = PP.getLastMacroWithSpelling(NameLoc, AttrTokens); 1920 if (!AttrSpelling.empty()) 1921 CCAttrText = AttrSpelling; 1922 OS << ' '; 1923 Self.Diag(NameLoc, diag::note_change_calling_conv_fixit) 1924 << FD << DstCCName << FixItHint::CreateInsertion(NameLoc, CCAttrText); 1925 } 1926 1927 static void checkIntToPointerCast(bool CStyle, SourceLocation Loc, 1928 const Expr *SrcExpr, QualType DestType, 1929 Sema &Self) { 1930 QualType SrcType = SrcExpr->getType(); 1931 1932 // Not warning on reinterpret_cast, boolean, constant expressions, etc 1933 // are not explicit design choices, but consistent with GCC's behavior. 1934 // Feel free to modify them if you've reason/evidence for an alternative. 1935 if (CStyle && SrcType->isIntegralType(Self.Context) 1936 && !SrcType->isBooleanType() 1937 && !SrcType->isEnumeralType() 1938 && !SrcExpr->isIntegerConstantExpr(Self.Context) 1939 && Self.Context.getTypeSize(DestType) > 1940 Self.Context.getTypeSize(SrcType)) { 1941 // Separate between casts to void* and non-void* pointers. 1942 // Some APIs use (abuse) void* for something like a user context, 1943 // and often that value is an integer even if it isn't a pointer itself. 1944 // Having a separate warning flag allows users to control the warning 1945 // for their workflow. 1946 unsigned Diag = DestType->isVoidPointerType() ? 1947 diag::warn_int_to_void_pointer_cast 1948 : diag::warn_int_to_pointer_cast; 1949 Self.Diag(Loc, Diag) << SrcType << DestType; 1950 } 1951 } 1952 1953 static bool fixOverloadedReinterpretCastExpr(Sema &Self, QualType DestType, 1954 ExprResult &Result) { 1955 // We can only fix an overloaded reinterpret_cast if 1956 // - it is a template with explicit arguments that resolves to an lvalue 1957 // unambiguously, or 1958 // - it is the only function in an overload set that may have its address 1959 // taken. 1960 1961 Expr *E = Result.get(); 1962 // TODO: what if this fails because of DiagnoseUseOfDecl or something 1963 // like it? 1964 if (Self.ResolveAndFixSingleFunctionTemplateSpecialization( 1965 Result, 1966 Expr::getValueKindForType(DestType) == VK_RValue // Convert Fun to Ptr 1967 ) && 1968 Result.isUsable()) 1969 return true; 1970 1971 // No guarantees that ResolveAndFixSingleFunctionTemplateSpecialization 1972 // preserves Result. 1973 Result = E; 1974 if (!Self.resolveAndFixAddressOfOnlyViableOverloadCandidate( 1975 Result, /*DoFunctionPointerConversion=*/true)) 1976 return false; 1977 return Result.isUsable(); 1978 } 1979 1980 static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, 1981 QualType DestType, bool CStyle, 1982 SourceRange OpRange, 1983 unsigned &msg, 1984 CastKind &Kind) { 1985 bool IsLValueCast = false; 1986 1987 DestType = Self.Context.getCanonicalType(DestType); 1988 QualType SrcType = SrcExpr.get()->getType(); 1989 1990 // Is the source an overloaded name? (i.e. &foo) 1991 // If so, reinterpret_cast generally can not help us here (13.4, p1, bullet 5) 1992 if (SrcType == Self.Context.OverloadTy) { 1993 ExprResult FixedExpr = SrcExpr; 1994 if (!fixOverloadedReinterpretCastExpr(Self, DestType, FixedExpr)) 1995 return TC_NotApplicable; 1996 1997 assert(FixedExpr.isUsable() && "Invalid result fixing overloaded expr"); 1998 SrcExpr = FixedExpr; 1999 SrcType = SrcExpr.get()->getType(); 2000 } 2001 2002 if (const ReferenceType *DestTypeTmp = DestType->getAs<ReferenceType>()) { 2003 if (!SrcExpr.get()->isGLValue()) { 2004 // Cannot cast non-glvalue to (lvalue or rvalue) reference type. See the 2005 // similar comment in const_cast. 2006 msg = diag::err_bad_cxx_cast_rvalue; 2007 return TC_NotApplicable; 2008 } 2009 2010 if (!CStyle) { 2011 Self.CheckCompatibleReinterpretCast(SrcType, DestType, 2012 /*isDereference=*/false, OpRange); 2013 } 2014 2015 // C++ 5.2.10p10: [...] a reference cast reinterpret_cast<T&>(x) has the 2016 // same effect as the conversion *reinterpret_cast<T*>(&x) with the 2017 // built-in & and * operators. 2018 2019 const char *inappropriate = nullptr; 2020 switch (SrcExpr.get()->getObjectKind()) { 2021 case OK_Ordinary: 2022 break; 2023 case OK_BitField: 2024 msg = diag::err_bad_cxx_cast_bitfield; 2025 return TC_NotApplicable; 2026 // FIXME: Use a specific diagnostic for the rest of these cases. 2027 case OK_VectorComponent: inappropriate = "vector element"; break; 2028 case OK_ObjCProperty: inappropriate = "property expression"; break; 2029 case OK_ObjCSubscript: inappropriate = "container subscripting expression"; 2030 break; 2031 } 2032 if (inappropriate) { 2033 Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_reference) 2034 << inappropriate << DestType 2035 << OpRange << SrcExpr.get()->getSourceRange(); 2036 msg = 0; SrcExpr = ExprError(); 2037 return TC_NotApplicable; 2038 } 2039 2040 // This code does this transformation for the checked types. 2041 DestType = Self.Context.getPointerType(DestTypeTmp->getPointeeType()); 2042 SrcType = Self.Context.getPointerType(SrcType); 2043 2044 IsLValueCast = true; 2045 } 2046 2047 // Canonicalize source for comparison. 2048 SrcType = Self.Context.getCanonicalType(SrcType); 2049 2050 const MemberPointerType *DestMemPtr = DestType->getAs<MemberPointerType>(), 2051 *SrcMemPtr = SrcType->getAs<MemberPointerType>(); 2052 if (DestMemPtr && SrcMemPtr) { 2053 // C++ 5.2.10p9: An rvalue of type "pointer to member of X of type T1" 2054 // can be explicitly converted to an rvalue of type "pointer to member 2055 // of Y of type T2" if T1 and T2 are both function types or both object 2056 // types. 2057 if (DestMemPtr->isMemberFunctionPointer() != 2058 SrcMemPtr->isMemberFunctionPointer()) 2059 return TC_NotApplicable; 2060 2061 if (Self.Context.getTargetInfo().getCXXABI().isMicrosoft()) { 2062 // We need to determine the inheritance model that the class will use if 2063 // haven't yet. 2064 (void)Self.isCompleteType(OpRange.getBegin(), SrcType); 2065 (void)Self.isCompleteType(OpRange.getBegin(), DestType); 2066 } 2067 2068 // Don't allow casting between member pointers of different sizes. 2069 if (Self.Context.getTypeSize(DestMemPtr) != 2070 Self.Context.getTypeSize(SrcMemPtr)) { 2071 msg = diag::err_bad_cxx_cast_member_pointer_size; 2072 return TC_Failed; 2073 } 2074 2075 // C++ 5.2.10p2: The reinterpret_cast operator shall not cast away 2076 // constness. 2077 // A reinterpret_cast followed by a const_cast can, though, so in C-style, 2078 // we accept it. 2079 if (auto CACK = 2080 CastsAwayConstness(Self, SrcType, DestType, /*CheckCVR=*/!CStyle, 2081 /*CheckObjCLifetime=*/CStyle)) 2082 return getCastAwayConstnessCastKind(CACK, msg); 2083 2084 // A valid member pointer cast. 2085 assert(!IsLValueCast); 2086 Kind = CK_ReinterpretMemberPointer; 2087 return TC_Success; 2088 } 2089 2090 // See below for the enumeral issue. 2091 if (SrcType->isNullPtrType() && DestType->isIntegralType(Self.Context)) { 2092 // C++0x 5.2.10p4: A pointer can be explicitly converted to any integral 2093 // type large enough to hold it. A value of std::nullptr_t can be 2094 // converted to an integral type; the conversion has the same meaning 2095 // and validity as a conversion of (void*)0 to the integral type. 2096 if (Self.Context.getTypeSize(SrcType) > 2097 Self.Context.getTypeSize(DestType)) { 2098 msg = diag::err_bad_reinterpret_cast_small_int; 2099 return TC_Failed; 2100 } 2101 Kind = CK_PointerToIntegral; 2102 return TC_Success; 2103 } 2104 2105 // Allow reinterpret_casts between vectors of the same size and 2106 // between vectors and integers of the same size. 2107 bool destIsVector = DestType->isVectorType(); 2108 bool srcIsVector = SrcType->isVectorType(); 2109 if (srcIsVector || destIsVector) { 2110 // The non-vector type, if any, must have integral type. This is 2111 // the same rule that C vector casts use; note, however, that enum 2112 // types are not integral in C++. 2113 if ((!destIsVector && !DestType->isIntegralType(Self.Context)) || 2114 (!srcIsVector && !SrcType->isIntegralType(Self.Context))) 2115 return TC_NotApplicable; 2116 2117 // The size we want to consider is eltCount * eltSize. 2118 // That's exactly what the lax-conversion rules will check. 2119 if (Self.areLaxCompatibleVectorTypes(SrcType, DestType)) { 2120 Kind = CK_BitCast; 2121 return TC_Success; 2122 } 2123 2124 // Otherwise, pick a reasonable diagnostic. 2125 if (!destIsVector) 2126 msg = diag::err_bad_cxx_cast_vector_to_scalar_different_size; 2127 else if (!srcIsVector) 2128 msg = diag::err_bad_cxx_cast_scalar_to_vector_different_size; 2129 else 2130 msg = diag::err_bad_cxx_cast_vector_to_vector_different_size; 2131 2132 return TC_Failed; 2133 } 2134 2135 if (SrcType == DestType) { 2136 // C++ 5.2.10p2 has a note that mentions that, subject to all other 2137 // restrictions, a cast to the same type is allowed so long as it does not 2138 // cast away constness. In C++98, the intent was not entirely clear here, 2139 // since all other paragraphs explicitly forbid casts to the same type. 2140 // C++11 clarifies this case with p2. 2141 // 2142 // The only allowed types are: integral, enumeration, pointer, or 2143 // pointer-to-member types. We also won't restrict Obj-C pointers either. 2144 Kind = CK_NoOp; 2145 TryCastResult Result = TC_NotApplicable; 2146 if (SrcType->isIntegralOrEnumerationType() || 2147 SrcType->isAnyPointerType() || 2148 SrcType->isMemberPointerType() || 2149 SrcType->isBlockPointerType()) { 2150 Result = TC_Success; 2151 } 2152 return Result; 2153 } 2154 2155 bool destIsPtr = DestType->isAnyPointerType() || 2156 DestType->isBlockPointerType(); 2157 bool srcIsPtr = SrcType->isAnyPointerType() || 2158 SrcType->isBlockPointerType(); 2159 if (!destIsPtr && !srcIsPtr) { 2160 // Except for std::nullptr_t->integer and lvalue->reference, which are 2161 // handled above, at least one of the two arguments must be a pointer. 2162 return TC_NotApplicable; 2163 } 2164 2165 if (DestType->isIntegralType(Self.Context)) { 2166 assert(srcIsPtr && "One type must be a pointer"); 2167 // C++ 5.2.10p4: A pointer can be explicitly converted to any integral 2168 // type large enough to hold it; except in Microsoft mode, where the 2169 // integral type size doesn't matter (except we don't allow bool). 2170 bool MicrosoftException = Self.getLangOpts().MicrosoftExt && 2171 !DestType->isBooleanType(); 2172 if ((Self.Context.getTypeSize(SrcType) > 2173 Self.Context.getTypeSize(DestType)) && 2174 !MicrosoftException) { 2175 msg = diag::err_bad_reinterpret_cast_small_int; 2176 return TC_Failed; 2177 } 2178 Kind = CK_PointerToIntegral; 2179 return TC_Success; 2180 } 2181 2182 if (SrcType->isIntegralOrEnumerationType()) { 2183 assert(destIsPtr && "One type must be a pointer"); 2184 checkIntToPointerCast(CStyle, OpRange.getBegin(), SrcExpr.get(), DestType, 2185 Self); 2186 // C++ 5.2.10p5: A value of integral or enumeration type can be explicitly 2187 // converted to a pointer. 2188 // C++ 5.2.10p9: [Note: ...a null pointer constant of integral type is not 2189 // necessarily converted to a null pointer value.] 2190 Kind = CK_IntegralToPointer; 2191 return TC_Success; 2192 } 2193 2194 if (!destIsPtr || !srcIsPtr) { 2195 // With the valid non-pointer conversions out of the way, we can be even 2196 // more stringent. 2197 return TC_NotApplicable; 2198 } 2199 2200 // Cannot convert between block pointers and Objective-C object pointers. 2201 if ((SrcType->isBlockPointerType() && DestType->isObjCObjectPointerType()) || 2202 (DestType->isBlockPointerType() && SrcType->isObjCObjectPointerType())) 2203 return TC_NotApplicable; 2204 2205 // C++ 5.2.10p2: The reinterpret_cast operator shall not cast away constness. 2206 // The C-style cast operator can. 2207 TryCastResult SuccessResult = TC_Success; 2208 if (auto CACK = 2209 CastsAwayConstness(Self, SrcType, DestType, /*CheckCVR=*/!CStyle, 2210 /*CheckObjCLifetime=*/CStyle)) 2211 SuccessResult = getCastAwayConstnessCastKind(CACK, msg); 2212 2213 if (IsLValueCast) { 2214 Kind = CK_LValueBitCast; 2215 } else if (DestType->isObjCObjectPointerType()) { 2216 Kind = Self.PrepareCastToObjCObjectPointer(SrcExpr); 2217 } else if (DestType->isBlockPointerType()) { 2218 if (!SrcType->isBlockPointerType()) { 2219 Kind = CK_AnyPointerToBlockPointerCast; 2220 } else { 2221 Kind = CK_BitCast; 2222 } 2223 } else if (IsAddressSpaceConversion(SrcType, DestType)) { 2224 Kind = CK_AddressSpaceConversion; 2225 } else { 2226 Kind = CK_BitCast; 2227 } 2228 2229 // Any pointer can be cast to an Objective-C pointer type with a C-style 2230 // cast. 2231 if (CStyle && DestType->isObjCObjectPointerType()) { 2232 return SuccessResult; 2233 } 2234 if (CStyle) 2235 DiagnoseCastOfObjCSEL(Self, SrcExpr, DestType); 2236 2237 DiagnoseCallingConvCast(Self, SrcExpr, DestType, OpRange); 2238 2239 // Not casting away constness, so the only remaining check is for compatible 2240 // pointer categories. 2241 2242 if (SrcType->isFunctionPointerType()) { 2243 if (DestType->isFunctionPointerType()) { 2244 // C++ 5.2.10p6: A pointer to a function can be explicitly converted to 2245 // a pointer to a function of a different type. 2246 return SuccessResult; 2247 } 2248 2249 // C++0x 5.2.10p8: Converting a pointer to a function into a pointer to 2250 // an object type or vice versa is conditionally-supported. 2251 // Compilers support it in C++03 too, though, because it's necessary for 2252 // casting the return value of dlsym() and GetProcAddress(). 2253 // FIXME: Conditionally-supported behavior should be configurable in the 2254 // TargetInfo or similar. 2255 Self.Diag(OpRange.getBegin(), 2256 Self.getLangOpts().CPlusPlus11 ? 2257 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj) 2258 << OpRange; 2259 return SuccessResult; 2260 } 2261 2262 if (DestType->isFunctionPointerType()) { 2263 // See above. 2264 Self.Diag(OpRange.getBegin(), 2265 Self.getLangOpts().CPlusPlus11 ? 2266 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj) 2267 << OpRange; 2268 return SuccessResult; 2269 } 2270 2271 // C++ 5.2.10p7: A pointer to an object can be explicitly converted to 2272 // a pointer to an object of different type. 2273 // Void pointers are not specified, but supported by every compiler out there. 2274 // So we finish by allowing everything that remains - it's got to be two 2275 // object pointers. 2276 return SuccessResult; 2277 } 2278 2279 void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle, 2280 bool ListInitialization) { 2281 assert(Self.getLangOpts().CPlusPlus); 2282 2283 // Handle placeholders. 2284 if (isPlaceholder()) { 2285 // C-style casts can resolve __unknown_any types. 2286 if (claimPlaceholder(BuiltinType::UnknownAny)) { 2287 SrcExpr = Self.checkUnknownAnyCast(DestRange, DestType, 2288 SrcExpr.get(), Kind, 2289 ValueKind, BasePath); 2290 return; 2291 } 2292 2293 checkNonOverloadPlaceholders(); 2294 if (SrcExpr.isInvalid()) 2295 return; 2296 } 2297 2298 // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void". 2299 // This test is outside everything else because it's the only case where 2300 // a non-lvalue-reference target type does not lead to decay. 2301 if (DestType->isVoidType()) { 2302 Kind = CK_ToVoid; 2303 2304 if (claimPlaceholder(BuiltinType::Overload)) { 2305 Self.ResolveAndFixSingleFunctionTemplateSpecialization( 2306 SrcExpr, /* Decay Function to ptr */ false, 2307 /* Complain */ true, DestRange, DestType, 2308 diag::err_bad_cstyle_cast_overload); 2309 if (SrcExpr.isInvalid()) 2310 return; 2311 } 2312 2313 SrcExpr = Self.IgnoredValueConversions(SrcExpr.get()); 2314 return; 2315 } 2316 2317 // If the type is dependent, we won't do any other semantic analysis now. 2318 if (DestType->isDependentType() || SrcExpr.get()->isTypeDependent() || 2319 SrcExpr.get()->isValueDependent()) { 2320 assert(Kind == CK_Dependent); 2321 return; 2322 } 2323 2324 if (ValueKind == VK_RValue && !DestType->isRecordType() && 2325 !isPlaceholder(BuiltinType::Overload)) { 2326 SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get()); 2327 if (SrcExpr.isInvalid()) 2328 return; 2329 } 2330 2331 // AltiVec vector initialization with a single literal. 2332 if (const VectorType *vecTy = DestType->getAs<VectorType>()) 2333 if (vecTy->getVectorKind() == VectorType::AltiVecVector 2334 && (SrcExpr.get()->getType()->isIntegerType() 2335 || SrcExpr.get()->getType()->isFloatingType())) { 2336 Kind = CK_VectorSplat; 2337 SrcExpr = Self.prepareVectorSplat(DestType, SrcExpr.get()); 2338 return; 2339 } 2340 2341 // C++ [expr.cast]p5: The conversions performed by 2342 // - a const_cast, 2343 // - a static_cast, 2344 // - a static_cast followed by a const_cast, 2345 // - a reinterpret_cast, or 2346 // - a reinterpret_cast followed by a const_cast, 2347 // can be performed using the cast notation of explicit type conversion. 2348 // [...] If a conversion can be interpreted in more than one of the ways 2349 // listed above, the interpretation that appears first in the list is used, 2350 // even if a cast resulting from that interpretation is ill-formed. 2351 // In plain language, this means trying a const_cast ... 2352 unsigned msg = diag::err_bad_cxx_cast_generic; 2353 TryCastResult tcr = TryConstCast(Self, SrcExpr, DestType, 2354 /*CStyle*/true, msg); 2355 if (SrcExpr.isInvalid()) 2356 return; 2357 if (isValidCast(tcr)) 2358 Kind = CK_NoOp; 2359 2360 Sema::CheckedConversionKind CCK 2361 = FunctionalStyle? Sema::CCK_FunctionalCast 2362 : Sema::CCK_CStyleCast; 2363 if (tcr == TC_NotApplicable) { 2364 // ... or if that is not possible, a static_cast, ignoring const, ... 2365 tcr = TryStaticCast(Self, SrcExpr, DestType, CCK, OpRange, 2366 msg, Kind, BasePath, ListInitialization); 2367 if (SrcExpr.isInvalid()) 2368 return; 2369 2370 if (tcr == TC_NotApplicable) { 2371 // ... and finally a reinterpret_cast, ignoring const. 2372 tcr = TryReinterpretCast(Self, SrcExpr, DestType, /*CStyle*/true, 2373 OpRange, msg, Kind); 2374 if (SrcExpr.isInvalid()) 2375 return; 2376 } 2377 } 2378 2379 if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() && 2380 isValidCast(tcr)) 2381 checkObjCConversion(CCK); 2382 2383 if (tcr != TC_Success && msg != 0) { 2384 if (SrcExpr.get()->getType() == Self.Context.OverloadTy) { 2385 DeclAccessPair Found; 2386 FunctionDecl *Fn = Self.ResolveAddressOfOverloadedFunction(SrcExpr.get(), 2387 DestType, 2388 /*Complain*/ true, 2389 Found); 2390 if (Fn) { 2391 // If DestType is a function type (not to be confused with the function 2392 // pointer type), it will be possible to resolve the function address, 2393 // but the type cast should be considered as failure. 2394 OverloadExpr *OE = OverloadExpr::find(SrcExpr.get()).Expression; 2395 Self.Diag(OpRange.getBegin(), diag::err_bad_cstyle_cast_overload) 2396 << OE->getName() << DestType << OpRange 2397 << OE->getQualifierLoc().getSourceRange(); 2398 Self.NoteAllOverloadCandidates(SrcExpr.get()); 2399 } 2400 } else { 2401 diagnoseBadCast(Self, msg, (FunctionalStyle ? CT_Functional : CT_CStyle), 2402 OpRange, SrcExpr.get(), DestType, ListInitialization); 2403 } 2404 } 2405 2406 if (isValidCast(tcr)) { 2407 if (Kind == CK_BitCast) 2408 checkCastAlign(); 2409 } else { 2410 SrcExpr = ExprError(); 2411 } 2412 } 2413 2414 /// DiagnoseBadFunctionCast - Warn whenever a function call is cast to a 2415 /// non-matching type. Such as enum function call to int, int call to 2416 /// pointer; etc. Cast to 'void' is an exception. 2417 static void DiagnoseBadFunctionCast(Sema &Self, const ExprResult &SrcExpr, 2418 QualType DestType) { 2419 if (Self.Diags.isIgnored(diag::warn_bad_function_cast, 2420 SrcExpr.get()->getExprLoc())) 2421 return; 2422 2423 if (!isa<CallExpr>(SrcExpr.get())) 2424 return; 2425 2426 QualType SrcType = SrcExpr.get()->getType(); 2427 if (DestType.getUnqualifiedType()->isVoidType()) 2428 return; 2429 if ((SrcType->isAnyPointerType() || SrcType->isBlockPointerType()) 2430 && (DestType->isAnyPointerType() || DestType->isBlockPointerType())) 2431 return; 2432 if (SrcType->isIntegerType() && DestType->isIntegerType() && 2433 (SrcType->isBooleanType() == DestType->isBooleanType()) && 2434 (SrcType->isEnumeralType() == DestType->isEnumeralType())) 2435 return; 2436 if (SrcType->isRealFloatingType() && DestType->isRealFloatingType()) 2437 return; 2438 if (SrcType->isEnumeralType() && DestType->isEnumeralType()) 2439 return; 2440 if (SrcType->isComplexType() && DestType->isComplexType()) 2441 return; 2442 if (SrcType->isComplexIntegerType() && DestType->isComplexIntegerType()) 2443 return; 2444 2445 Self.Diag(SrcExpr.get()->getExprLoc(), 2446 diag::warn_bad_function_cast) 2447 << SrcType << DestType << SrcExpr.get()->getSourceRange(); 2448 } 2449 2450 /// Check the semantics of a C-style cast operation, in C. 2451 void CastOperation::CheckCStyleCast() { 2452 assert(!Self.getLangOpts().CPlusPlus); 2453 2454 // C-style casts can resolve __unknown_any types. 2455 if (claimPlaceholder(BuiltinType::UnknownAny)) { 2456 SrcExpr = Self.checkUnknownAnyCast(DestRange, DestType, 2457 SrcExpr.get(), Kind, 2458 ValueKind, BasePath); 2459 return; 2460 } 2461 2462 // C99 6.5.4p2: the cast type needs to be void or scalar and the expression 2463 // type needs to be scalar. 2464 if (DestType->isVoidType()) { 2465 // We don't necessarily do lvalue-to-rvalue conversions on this. 2466 SrcExpr = Self.IgnoredValueConversions(SrcExpr.get()); 2467 if (SrcExpr.isInvalid()) 2468 return; 2469 2470 // Cast to void allows any expr type. 2471 Kind = CK_ToVoid; 2472 return; 2473 } 2474 2475 // Overloads are allowed with C extensions, so we need to support them. 2476 if (SrcExpr.get()->getType() == Self.Context.OverloadTy) { 2477 DeclAccessPair DAP; 2478 if (FunctionDecl *FD = Self.ResolveAddressOfOverloadedFunction( 2479 SrcExpr.get(), DestType, /*Complain=*/true, DAP)) 2480 SrcExpr = Self.FixOverloadedFunctionReference(SrcExpr.get(), DAP, FD); 2481 else 2482 return; 2483 assert(SrcExpr.isUsable()); 2484 } 2485 SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get()); 2486 if (SrcExpr.isInvalid()) 2487 return; 2488 QualType SrcType = SrcExpr.get()->getType(); 2489 2490 assert(!SrcType->isPlaceholderType()); 2491 2492 // OpenCL v1 s6.5: Casting a pointer to address space A to a pointer to 2493 // address space B is illegal. 2494 if (Self.getLangOpts().OpenCL && DestType->isPointerType() && 2495 SrcType->isPointerType()) { 2496 const PointerType *DestPtr = DestType->getAs<PointerType>(); 2497 if (!DestPtr->isAddressSpaceOverlapping(*SrcType->getAs<PointerType>())) { 2498 Self.Diag(OpRange.getBegin(), 2499 diag::err_typecheck_incompatible_address_space) 2500 << SrcType << DestType << Sema::AA_Casting 2501 << SrcExpr.get()->getSourceRange(); 2502 SrcExpr = ExprError(); 2503 return; 2504 } 2505 } 2506 2507 if (Self.RequireCompleteType(OpRange.getBegin(), DestType, 2508 diag::err_typecheck_cast_to_incomplete)) { 2509 SrcExpr = ExprError(); 2510 return; 2511 } 2512 2513 if (!DestType->isScalarType() && !DestType->isVectorType()) { 2514 const RecordType *DestRecordTy = DestType->getAs<RecordType>(); 2515 2516 if (DestRecordTy && Self.Context.hasSameUnqualifiedType(DestType, SrcType)){ 2517 // GCC struct/union extension: allow cast to self. 2518 Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_nonscalar) 2519 << DestType << SrcExpr.get()->getSourceRange(); 2520 Kind = CK_NoOp; 2521 return; 2522 } 2523 2524 // GCC's cast to union extension. 2525 if (DestRecordTy && DestRecordTy->getDecl()->isUnion()) { 2526 RecordDecl *RD = DestRecordTy->getDecl(); 2527 if (CastExpr::getTargetFieldForToUnionCast(RD, SrcType)) { 2528 Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_to_union) 2529 << SrcExpr.get()->getSourceRange(); 2530 Kind = CK_ToUnion; 2531 return; 2532 } else { 2533 Self.Diag(OpRange.getBegin(), diag::err_typecheck_cast_to_union_no_type) 2534 << SrcType << SrcExpr.get()->getSourceRange(); 2535 SrcExpr = ExprError(); 2536 return; 2537 } 2538 } 2539 2540 // OpenCL v2.0 s6.13.10 - Allow casts from '0' to event_t type. 2541 if (Self.getLangOpts().OpenCL && DestType->isEventT()) { 2542 llvm::APSInt CastInt; 2543 if (SrcExpr.get()->EvaluateAsInt(CastInt, Self.Context)) { 2544 if (0 == CastInt) { 2545 Kind = CK_ZeroToOCLEvent; 2546 return; 2547 } 2548 Self.Diag(OpRange.getBegin(), 2549 diag::err_opencl_cast_non_zero_to_event_t) 2550 << CastInt.toString(10) << SrcExpr.get()->getSourceRange(); 2551 SrcExpr = ExprError(); 2552 return; 2553 } 2554 } 2555 2556 // Reject any other conversions to non-scalar types. 2557 Self.Diag(OpRange.getBegin(), diag::err_typecheck_cond_expect_scalar) 2558 << DestType << SrcExpr.get()->getSourceRange(); 2559 SrcExpr = ExprError(); 2560 return; 2561 } 2562 2563 // The type we're casting to is known to be a scalar or vector. 2564 2565 // Require the operand to be a scalar or vector. 2566 if (!SrcType->isScalarType() && !SrcType->isVectorType()) { 2567 Self.Diag(SrcExpr.get()->getExprLoc(), 2568 diag::err_typecheck_expect_scalar_operand) 2569 << SrcType << SrcExpr.get()->getSourceRange(); 2570 SrcExpr = ExprError(); 2571 return; 2572 } 2573 2574 if (DestType->isExtVectorType()) { 2575 SrcExpr = Self.CheckExtVectorCast(OpRange, DestType, SrcExpr.get(), Kind); 2576 return; 2577 } 2578 2579 if (const VectorType *DestVecTy = DestType->getAs<VectorType>()) { 2580 if (DestVecTy->getVectorKind() == VectorType::AltiVecVector && 2581 (SrcType->isIntegerType() || SrcType->isFloatingType())) { 2582 Kind = CK_VectorSplat; 2583 SrcExpr = Self.prepareVectorSplat(DestType, SrcExpr.get()); 2584 } else if (Self.CheckVectorCast(OpRange, DestType, SrcType, Kind)) { 2585 SrcExpr = ExprError(); 2586 } 2587 return; 2588 } 2589 2590 if (SrcType->isVectorType()) { 2591 if (Self.CheckVectorCast(OpRange, SrcType, DestType, Kind)) 2592 SrcExpr = ExprError(); 2593 return; 2594 } 2595 2596 // The source and target types are both scalars, i.e. 2597 // - arithmetic types (fundamental, enum, and complex) 2598 // - all kinds of pointers 2599 // Note that member pointers were filtered out with C++, above. 2600 2601 if (isa<ObjCSelectorExpr>(SrcExpr.get())) { 2602 Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_cast_selector_expr); 2603 SrcExpr = ExprError(); 2604 return; 2605 } 2606 2607 // If either type is a pointer, the other type has to be either an 2608 // integer or a pointer. 2609 if (!DestType->isArithmeticType()) { 2610 if (!SrcType->isIntegralType(Self.Context) && SrcType->isArithmeticType()) { 2611 Self.Diag(SrcExpr.get()->getExprLoc(), 2612 diag::err_cast_pointer_from_non_pointer_int) 2613 << SrcType << SrcExpr.get()->getSourceRange(); 2614 SrcExpr = ExprError(); 2615 return; 2616 } 2617 checkIntToPointerCast(/* CStyle */ true, OpRange.getBegin(), SrcExpr.get(), 2618 DestType, Self); 2619 } else if (!SrcType->isArithmeticType()) { 2620 if (!DestType->isIntegralType(Self.Context) && 2621 DestType->isArithmeticType()) { 2622 Self.Diag(SrcExpr.get()->getBeginLoc(), 2623 diag::err_cast_pointer_to_non_pointer_int) 2624 << DestType << SrcExpr.get()->getSourceRange(); 2625 SrcExpr = ExprError(); 2626 return; 2627 } 2628 } 2629 2630 if (Self.getLangOpts().OpenCL && 2631 !Self.getOpenCLOptions().isEnabled("cl_khr_fp16")) { 2632 if (DestType->isHalfType()) { 2633 Self.Diag(SrcExpr.get()->getBeginLoc(), diag::err_opencl_cast_to_half) 2634 << DestType << SrcExpr.get()->getSourceRange(); 2635 SrcExpr = ExprError(); 2636 return; 2637 } 2638 } 2639 2640 // ARC imposes extra restrictions on casts. 2641 if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) { 2642 checkObjCConversion(Sema::CCK_CStyleCast); 2643 if (SrcExpr.isInvalid()) 2644 return; 2645 2646 const PointerType *CastPtr = DestType->getAs<PointerType>(); 2647 if (Self.getLangOpts().ObjCAutoRefCount && CastPtr) { 2648 if (const PointerType *ExprPtr = SrcType->getAs<PointerType>()) { 2649 Qualifiers CastQuals = CastPtr->getPointeeType().getQualifiers(); 2650 Qualifiers ExprQuals = ExprPtr->getPointeeType().getQualifiers(); 2651 if (CastPtr->getPointeeType()->isObjCLifetimeType() && 2652 ExprPtr->getPointeeType()->isObjCLifetimeType() && 2653 !CastQuals.compatiblyIncludesObjCLifetime(ExprQuals)) { 2654 Self.Diag(SrcExpr.get()->getBeginLoc(), 2655 diag::err_typecheck_incompatible_ownership) 2656 << SrcType << DestType << Sema::AA_Casting 2657 << SrcExpr.get()->getSourceRange(); 2658 return; 2659 } 2660 } 2661 } 2662 else if (!Self.CheckObjCARCUnavailableWeakConversion(DestType, SrcType)) { 2663 Self.Diag(SrcExpr.get()->getBeginLoc(), 2664 diag::err_arc_convesion_of_weak_unavailable) 2665 << 1 << SrcType << DestType << SrcExpr.get()->getSourceRange(); 2666 SrcExpr = ExprError(); 2667 return; 2668 } 2669 } 2670 2671 DiagnoseCastOfObjCSEL(Self, SrcExpr, DestType); 2672 DiagnoseCallingConvCast(Self, SrcExpr, DestType, OpRange); 2673 DiagnoseBadFunctionCast(Self, SrcExpr, DestType); 2674 Kind = Self.PrepareScalarCast(SrcExpr, DestType); 2675 if (SrcExpr.isInvalid()) 2676 return; 2677 2678 if (Kind == CK_BitCast) 2679 checkCastAlign(); 2680 } 2681 2682 /// DiagnoseCastQual - Warn whenever casts discards a qualifiers, be it either 2683 /// const, volatile or both. 2684 static void DiagnoseCastQual(Sema &Self, const ExprResult &SrcExpr, 2685 QualType DestType) { 2686 if (SrcExpr.isInvalid()) 2687 return; 2688 2689 QualType SrcType = SrcExpr.get()->getType(); 2690 if (!((SrcType->isAnyPointerType() && DestType->isAnyPointerType()) || 2691 DestType->isLValueReferenceType())) 2692 return; 2693 2694 QualType TheOffendingSrcType, TheOffendingDestType; 2695 Qualifiers CastAwayQualifiers; 2696 if (CastsAwayConstness(Self, SrcType, DestType, true, false, 2697 &TheOffendingSrcType, &TheOffendingDestType, 2698 &CastAwayQualifiers) != 2699 CastAwayConstnessKind::CACK_Similar) 2700 return; 2701 2702 // FIXME: 'restrict' is not properly handled here. 2703 int qualifiers = -1; 2704 if (CastAwayQualifiers.hasConst() && CastAwayQualifiers.hasVolatile()) { 2705 qualifiers = 0; 2706 } else if (CastAwayQualifiers.hasConst()) { 2707 qualifiers = 1; 2708 } else if (CastAwayQualifiers.hasVolatile()) { 2709 qualifiers = 2; 2710 } 2711 // This is a variant of int **x; const int **y = (const int **)x; 2712 if (qualifiers == -1) 2713 Self.Diag(SrcExpr.get()->getBeginLoc(), diag::warn_cast_qual2) 2714 << SrcType << DestType; 2715 else 2716 Self.Diag(SrcExpr.get()->getBeginLoc(), diag::warn_cast_qual) 2717 << TheOffendingSrcType << TheOffendingDestType << qualifiers; 2718 } 2719 2720 ExprResult Sema::BuildCStyleCastExpr(SourceLocation LPLoc, 2721 TypeSourceInfo *CastTypeInfo, 2722 SourceLocation RPLoc, 2723 Expr *CastExpr) { 2724 CastOperation Op(*this, CastTypeInfo->getType(), CastExpr); 2725 Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange(); 2726 Op.OpRange = SourceRange(LPLoc, CastExpr->getEndLoc()); 2727 2728 if (getLangOpts().CPlusPlus) { 2729 Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ false, 2730 isa<InitListExpr>(CastExpr)); 2731 } else { 2732 Op.CheckCStyleCast(); 2733 } 2734 2735 if (Op.SrcExpr.isInvalid()) 2736 return ExprError(); 2737 2738 // -Wcast-qual 2739 DiagnoseCastQual(Op.Self, Op.SrcExpr, Op.DestType); 2740 2741 return Op.complete(CStyleCastExpr::Create(Context, Op.ResultType, 2742 Op.ValueKind, Op.Kind, Op.SrcExpr.get(), 2743 &Op.BasePath, CastTypeInfo, LPLoc, RPLoc)); 2744 } 2745 2746 ExprResult Sema::BuildCXXFunctionalCastExpr(TypeSourceInfo *CastTypeInfo, 2747 QualType Type, 2748 SourceLocation LPLoc, 2749 Expr *CastExpr, 2750 SourceLocation RPLoc) { 2751 assert(LPLoc.isValid() && "List-initialization shouldn't get here."); 2752 CastOperation Op(*this, Type, CastExpr); 2753 Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange(); 2754 Op.OpRange = SourceRange(Op.DestRange.getBegin(), CastExpr->getEndLoc()); 2755 2756 Op.CheckCXXCStyleCast(/*FunctionalStyle=*/true, /*ListInit=*/false); 2757 if (Op.SrcExpr.isInvalid()) 2758 return ExprError(); 2759 2760 auto *SubExpr = Op.SrcExpr.get(); 2761 if (auto *BindExpr = dyn_cast<CXXBindTemporaryExpr>(SubExpr)) 2762 SubExpr = BindExpr->getSubExpr(); 2763 if (auto *ConstructExpr = dyn_cast<CXXConstructExpr>(SubExpr)) 2764 ConstructExpr->setParenOrBraceRange(SourceRange(LPLoc, RPLoc)); 2765 2766 return Op.complete(CXXFunctionalCastExpr::Create(Context, Op.ResultType, 2767 Op.ValueKind, CastTypeInfo, Op.Kind, 2768 Op.SrcExpr.get(), &Op.BasePath, LPLoc, RPLoc)); 2769 } 2770