1 //===--- SemaExceptionSpec.cpp - C++ Exception Specifications ---*- C++ -*-===// 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 provides Sema routines for C++ exception specification testing. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Sema/SemaInternal.h" 15 #include "clang/AST/ASTMutationListener.h" 16 #include "clang/AST/CXXInheritance.h" 17 #include "clang/AST/Expr.h" 18 #include "clang/AST/ExprCXX.h" 19 #include "clang/AST/TypeLoc.h" 20 #include "clang/Basic/Diagnostic.h" 21 #include "clang/Basic/SourceManager.h" 22 #include "llvm/ADT/SmallPtrSet.h" 23 #include "llvm/ADT/SmallString.h" 24 25 namespace clang { 26 27 static const FunctionProtoType *GetUnderlyingFunction(QualType T) 28 { 29 if (const PointerType *PtrTy = T->getAs<PointerType>()) 30 T = PtrTy->getPointeeType(); 31 else if (const ReferenceType *RefTy = T->getAs<ReferenceType>()) 32 T = RefTy->getPointeeType(); 33 else if (const MemberPointerType *MPTy = T->getAs<MemberPointerType>()) 34 T = MPTy->getPointeeType(); 35 return T->getAs<FunctionProtoType>(); 36 } 37 38 /// HACK: libstdc++ has a bug where it shadows std::swap with a member 39 /// swap function then tries to call std::swap unqualified from the exception 40 /// specification of that function. This function detects whether we're in 41 /// such a case and turns off delay-parsing of exception specifications. 42 bool Sema::isLibstdcxxEagerExceptionSpecHack(const Declarator &D) { 43 auto *RD = dyn_cast<CXXRecordDecl>(CurContext); 44 45 // All the problem cases are member functions named "swap" within class 46 // templates declared directly within namespace std or std::__debug or 47 // std::__profile. 48 if (!RD || !RD->getIdentifier() || !RD->getDescribedClassTemplate() || 49 !D.getIdentifier() || !D.getIdentifier()->isStr("swap")) 50 return false; 51 52 auto *ND = dyn_cast<NamespaceDecl>(RD->getDeclContext()); 53 if (!ND) 54 return false; 55 56 bool IsInStd = ND->isStdNamespace(); 57 if (!IsInStd) { 58 // This isn't a direct member of namespace std, but it might still be 59 // libstdc++'s std::__debug::array or std::__profile::array. 60 IdentifierInfo *II = ND->getIdentifier(); 61 if (!II || !(II->isStr("__debug") || II->isStr("__profile")) || 62 !ND->isInStdNamespace()) 63 return false; 64 } 65 66 // Only apply this hack within a system header. 67 if (!Context.getSourceManager().isInSystemHeader(D.getLocStart())) 68 return false; 69 70 return llvm::StringSwitch<bool>(RD->getIdentifier()->getName()) 71 .Case("array", true) 72 .Case("pair", IsInStd) 73 .Case("priority_queue", IsInStd) 74 .Case("stack", IsInStd) 75 .Case("queue", IsInStd) 76 .Default(false); 77 } 78 79 /// CheckSpecifiedExceptionType - Check if the given type is valid in an 80 /// exception specification. Incomplete types, or pointers to incomplete types 81 /// other than void are not allowed. 82 /// 83 /// \param[in,out] T The exception type. This will be decayed to a pointer type 84 /// when the input is an array or a function type. 85 bool Sema::CheckSpecifiedExceptionType(QualType &T, SourceRange Range) { 86 // C++11 [except.spec]p2: 87 // A type cv T, "array of T", or "function returning T" denoted 88 // in an exception-specification is adjusted to type T, "pointer to T", or 89 // "pointer to function returning T", respectively. 90 // 91 // We also apply this rule in C++98. 92 if (T->isArrayType()) 93 T = Context.getArrayDecayedType(T); 94 else if (T->isFunctionType()) 95 T = Context.getPointerType(T); 96 97 int Kind = 0; 98 QualType PointeeT = T; 99 if (const PointerType *PT = T->getAs<PointerType>()) { 100 PointeeT = PT->getPointeeType(); 101 Kind = 1; 102 103 // cv void* is explicitly permitted, despite being a pointer to an 104 // incomplete type. 105 if (PointeeT->isVoidType()) 106 return false; 107 } else if (const ReferenceType *RT = T->getAs<ReferenceType>()) { 108 PointeeT = RT->getPointeeType(); 109 Kind = 2; 110 111 if (RT->isRValueReferenceType()) { 112 // C++11 [except.spec]p2: 113 // A type denoted in an exception-specification shall not denote [...] 114 // an rvalue reference type. 115 Diag(Range.getBegin(), diag::err_rref_in_exception_spec) 116 << T << Range; 117 return true; 118 } 119 } 120 121 // C++11 [except.spec]p2: 122 // A type denoted in an exception-specification shall not denote an 123 // incomplete type other than a class currently being defined [...]. 124 // A type denoted in an exception-specification shall not denote a 125 // pointer or reference to an incomplete type, other than (cv) void* or a 126 // pointer or reference to a class currently being defined. 127 // In Microsoft mode, downgrade this to a warning. 128 unsigned DiagID = diag::err_incomplete_in_exception_spec; 129 bool ReturnValueOnError = true; 130 if (getLangOpts().MicrosoftExt) { 131 DiagID = diag::ext_incomplete_in_exception_spec; 132 ReturnValueOnError = false; 133 } 134 if (!(PointeeT->isRecordType() && 135 PointeeT->getAs<RecordType>()->isBeingDefined()) && 136 RequireCompleteType(Range.getBegin(), PointeeT, DiagID, Kind, Range)) 137 return ReturnValueOnError; 138 139 return false; 140 } 141 142 /// CheckDistantExceptionSpec - Check if the given type is a pointer or pointer 143 /// to member to a function with an exception specification. This means that 144 /// it is invalid to add another level of indirection. 145 bool Sema::CheckDistantExceptionSpec(QualType T) { 146 // C++17 removes this rule in favor of putting exception specifications into 147 // the type system. 148 if (getLangOpts().CPlusPlus1z) 149 return false; 150 151 if (const PointerType *PT = T->getAs<PointerType>()) 152 T = PT->getPointeeType(); 153 else if (const MemberPointerType *PT = T->getAs<MemberPointerType>()) 154 T = PT->getPointeeType(); 155 else 156 return false; 157 158 const FunctionProtoType *FnT = T->getAs<FunctionProtoType>(); 159 if (!FnT) 160 return false; 161 162 return FnT->hasExceptionSpec(); 163 } 164 165 const FunctionProtoType * 166 Sema::ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT) { 167 if (FPT->getExceptionSpecType() == EST_Unparsed) { 168 Diag(Loc, diag::err_exception_spec_not_parsed); 169 return nullptr; 170 } 171 172 if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) 173 return FPT; 174 175 FunctionDecl *SourceDecl = FPT->getExceptionSpecDecl(); 176 const FunctionProtoType *SourceFPT = 177 SourceDecl->getType()->castAs<FunctionProtoType>(); 178 179 // If the exception specification has already been resolved, just return it. 180 if (!isUnresolvedExceptionSpec(SourceFPT->getExceptionSpecType())) 181 return SourceFPT; 182 183 // Compute or instantiate the exception specification now. 184 if (SourceFPT->getExceptionSpecType() == EST_Unevaluated) 185 EvaluateImplicitExceptionSpec(Loc, cast<CXXMethodDecl>(SourceDecl)); 186 else 187 InstantiateExceptionSpec(Loc, SourceDecl); 188 189 const FunctionProtoType *Proto = 190 SourceDecl->getType()->castAs<FunctionProtoType>(); 191 if (Proto->getExceptionSpecType() == clang::EST_Unparsed) { 192 Diag(Loc, diag::err_exception_spec_not_parsed); 193 Proto = nullptr; 194 } 195 return Proto; 196 } 197 198 void 199 Sema::UpdateExceptionSpec(FunctionDecl *FD, 200 const FunctionProtoType::ExceptionSpecInfo &ESI) { 201 // If we've fully resolved the exception specification, notify listeners. 202 if (!isUnresolvedExceptionSpec(ESI.Type)) 203 if (auto *Listener = getASTMutationListener()) 204 Listener->ResolvedExceptionSpec(FD); 205 206 for (auto *Redecl : FD->redecls()) 207 Context.adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 208 } 209 210 /// Determine whether a function has an implicitly-generated exception 211 /// specification. 212 static bool hasImplicitExceptionSpec(FunctionDecl *Decl) { 213 if (!isa<CXXDestructorDecl>(Decl) && 214 Decl->getDeclName().getCXXOverloadedOperator() != OO_Delete && 215 Decl->getDeclName().getCXXOverloadedOperator() != OO_Array_Delete) 216 return false; 217 218 // For a function that the user didn't declare: 219 // - if this is a destructor, its exception specification is implicit. 220 // - if this is 'operator delete' or 'operator delete[]', the exception 221 // specification is as-if an explicit exception specification was given 222 // (per [basic.stc.dynamic]p2). 223 if (!Decl->getTypeSourceInfo()) 224 return isa<CXXDestructorDecl>(Decl); 225 226 const FunctionProtoType *Ty = 227 Decl->getTypeSourceInfo()->getType()->getAs<FunctionProtoType>(); 228 return !Ty->hasExceptionSpec(); 229 } 230 231 bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) { 232 OverloadedOperatorKind OO = New->getDeclName().getCXXOverloadedOperator(); 233 bool IsOperatorNew = OO == OO_New || OO == OO_Array_New; 234 bool MissingExceptionSpecification = false; 235 bool MissingEmptyExceptionSpecification = false; 236 237 unsigned DiagID = diag::err_mismatched_exception_spec; 238 bool ReturnValueOnError = true; 239 if (getLangOpts().MicrosoftExt) { 240 DiagID = diag::ext_mismatched_exception_spec; 241 ReturnValueOnError = false; 242 } 243 244 // Check the types as written: they must match before any exception 245 // specification adjustment is applied. 246 if (!CheckEquivalentExceptionSpec( 247 PDiag(DiagID), PDiag(diag::note_previous_declaration), 248 Old->getType()->getAs<FunctionProtoType>(), Old->getLocation(), 249 New->getType()->getAs<FunctionProtoType>(), New->getLocation(), 250 &MissingExceptionSpecification, &MissingEmptyExceptionSpecification, 251 /*AllowNoexceptAllMatchWithNoSpec=*/true, IsOperatorNew)) { 252 // C++11 [except.spec]p4 [DR1492]: 253 // If a declaration of a function has an implicit 254 // exception-specification, other declarations of the function shall 255 // not specify an exception-specification. 256 if (getLangOpts().CPlusPlus11 && getLangOpts().CXXExceptions && 257 hasImplicitExceptionSpec(Old) != hasImplicitExceptionSpec(New)) { 258 Diag(New->getLocation(), diag::ext_implicit_exception_spec_mismatch) 259 << hasImplicitExceptionSpec(Old); 260 if (Old->getLocation().isValid()) 261 Diag(Old->getLocation(), diag::note_previous_declaration); 262 } 263 return false; 264 } 265 266 // The failure was something other than an missing exception 267 // specification; return an error, except in MS mode where this is a warning. 268 if (!MissingExceptionSpecification) 269 return ReturnValueOnError; 270 271 const FunctionProtoType *NewProto = 272 New->getType()->castAs<FunctionProtoType>(); 273 274 // The new function declaration is only missing an empty exception 275 // specification "throw()". If the throw() specification came from a 276 // function in a system header that has C linkage, just add an empty 277 // exception specification to the "new" declaration. This is an 278 // egregious workaround for glibc, which adds throw() specifications 279 // to many libc functions as an optimization. Unfortunately, that 280 // optimization isn't permitted by the C++ standard, so we're forced 281 // to work around it here. 282 if (MissingEmptyExceptionSpecification && NewProto && 283 (Old->getLocation().isInvalid() || 284 Context.getSourceManager().isInSystemHeader(Old->getLocation())) && 285 Old->isExternC()) { 286 New->setType(Context.getFunctionType( 287 NewProto->getReturnType(), NewProto->getParamTypes(), 288 NewProto->getExtProtoInfo().withExceptionSpec(EST_DynamicNone))); 289 return false; 290 } 291 292 const FunctionProtoType *OldProto = 293 Old->getType()->castAs<FunctionProtoType>(); 294 295 FunctionProtoType::ExceptionSpecInfo ESI = OldProto->getExceptionSpecType(); 296 if (ESI.Type == EST_Dynamic) { 297 ESI.Exceptions = OldProto->exceptions(); 298 } 299 300 if (ESI.Type == EST_ComputedNoexcept) { 301 // For computed noexcept, we can't just take the expression from the old 302 // prototype. It likely contains references to the old prototype's 303 // parameters. 304 New->setInvalidDecl(); 305 } else { 306 // Update the type of the function with the appropriate exception 307 // specification. 308 New->setType(Context.getFunctionType( 309 NewProto->getReturnType(), NewProto->getParamTypes(), 310 NewProto->getExtProtoInfo().withExceptionSpec(ESI))); 311 } 312 313 if (getLangOpts().MicrosoftExt && ESI.Type != EST_ComputedNoexcept) { 314 // Allow missing exception specifications in redeclarations as an extension. 315 DiagID = diag::ext_ms_missing_exception_specification; 316 ReturnValueOnError = false; 317 } else if (New->isReplaceableGlobalAllocationFunction() && 318 ESI.Type != EST_ComputedNoexcept) { 319 // Allow missing exception specifications in redeclarations as an extension, 320 // when declaring a replaceable global allocation function. 321 DiagID = diag::ext_missing_exception_specification; 322 ReturnValueOnError = false; 323 } else { 324 DiagID = diag::err_missing_exception_specification; 325 ReturnValueOnError = true; 326 } 327 328 // Warn about the lack of exception specification. 329 SmallString<128> ExceptionSpecString; 330 llvm::raw_svector_ostream OS(ExceptionSpecString); 331 switch (OldProto->getExceptionSpecType()) { 332 case EST_DynamicNone: 333 OS << "throw()"; 334 break; 335 336 case EST_Dynamic: { 337 OS << "throw("; 338 bool OnFirstException = true; 339 for (const auto &E : OldProto->exceptions()) { 340 if (OnFirstException) 341 OnFirstException = false; 342 else 343 OS << ", "; 344 345 OS << E.getAsString(getPrintingPolicy()); 346 } 347 OS << ")"; 348 break; 349 } 350 351 case EST_BasicNoexcept: 352 OS << "noexcept"; 353 break; 354 355 case EST_ComputedNoexcept: 356 OS << "noexcept("; 357 assert(OldProto->getNoexceptExpr() != nullptr && "Expected non-null Expr"); 358 OldProto->getNoexceptExpr()->printPretty(OS, nullptr, getPrintingPolicy()); 359 OS << ")"; 360 break; 361 362 default: 363 llvm_unreachable("This spec type is compatible with none."); 364 } 365 366 SourceLocation FixItLoc; 367 if (TypeSourceInfo *TSInfo = New->getTypeSourceInfo()) { 368 TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens(); 369 // FIXME: Preserve enough information so that we can produce a correct fixit 370 // location when there is a trailing return type. 371 if (auto FTLoc = TL.getAs<FunctionProtoTypeLoc>()) 372 if (!FTLoc.getTypePtr()->hasTrailingReturn()) 373 FixItLoc = getLocForEndOfToken(FTLoc.getLocalRangeEnd()); 374 } 375 376 if (FixItLoc.isInvalid()) 377 Diag(New->getLocation(), DiagID) 378 << New << OS.str(); 379 else { 380 Diag(New->getLocation(), DiagID) 381 << New << OS.str() 382 << FixItHint::CreateInsertion(FixItLoc, " " + OS.str().str()); 383 } 384 385 if (Old->getLocation().isValid()) 386 Diag(Old->getLocation(), diag::note_previous_declaration); 387 388 return ReturnValueOnError; 389 } 390 391 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent 392 /// exception specifications. Exception specifications are equivalent if 393 /// they allow exactly the same set of exception types. It does not matter how 394 /// that is achieved. See C++ [except.spec]p2. 395 bool Sema::CheckEquivalentExceptionSpec( 396 const FunctionProtoType *Old, SourceLocation OldLoc, 397 const FunctionProtoType *New, SourceLocation NewLoc) { 398 unsigned DiagID = diag::err_mismatched_exception_spec; 399 if (getLangOpts().MicrosoftExt) 400 DiagID = diag::ext_mismatched_exception_spec; 401 bool Result = CheckEquivalentExceptionSpec(PDiag(DiagID), 402 PDiag(diag::note_previous_declaration), Old, OldLoc, New, NewLoc); 403 404 // In Microsoft mode, mismatching exception specifications just cause a warning. 405 if (getLangOpts().MicrosoftExt) 406 return false; 407 return Result; 408 } 409 410 /// CheckEquivalentExceptionSpec - Check if the two types have compatible 411 /// exception specifications. See C++ [except.spec]p3. 412 /// 413 /// \return \c false if the exception specifications match, \c true if there is 414 /// a problem. If \c true is returned, either a diagnostic has already been 415 /// produced or \c *MissingExceptionSpecification is set to \c true. 416 bool Sema::CheckEquivalentExceptionSpec(const PartialDiagnostic &DiagID, 417 const PartialDiagnostic &NoteID, 418 const FunctionProtoType *Old, 419 SourceLocation OldLoc, 420 const FunctionProtoType *New, 421 SourceLocation NewLoc, 422 bool *MissingExceptionSpecification, 423 bool*MissingEmptyExceptionSpecification, 424 bool AllowNoexceptAllMatchWithNoSpec, 425 bool IsOperatorNew) { 426 // Just completely ignore this under -fno-exceptions. 427 if (!getLangOpts().CXXExceptions) 428 return false; 429 430 if (MissingExceptionSpecification) 431 *MissingExceptionSpecification = false; 432 433 if (MissingEmptyExceptionSpecification) 434 *MissingEmptyExceptionSpecification = false; 435 436 Old = ResolveExceptionSpec(NewLoc, Old); 437 if (!Old) 438 return false; 439 New = ResolveExceptionSpec(NewLoc, New); 440 if (!New) 441 return false; 442 443 // C++0x [except.spec]p3: Two exception-specifications are compatible if: 444 // - both are non-throwing, regardless of their form, 445 // - both have the form noexcept(constant-expression) and the constant- 446 // expressions are equivalent, 447 // - both are dynamic-exception-specifications that have the same set of 448 // adjusted types. 449 // 450 // C++0x [except.spec]p12: An exception-specification is non-throwing if it is 451 // of the form throw(), noexcept, or noexcept(constant-expression) where the 452 // constant-expression yields true. 453 // 454 // C++0x [except.spec]p4: If any declaration of a function has an exception- 455 // specifier that is not a noexcept-specification allowing all exceptions, 456 // all declarations [...] of that function shall have a compatible 457 // exception-specification. 458 // 459 // That last point basically means that noexcept(false) matches no spec. 460 // It's considered when AllowNoexceptAllMatchWithNoSpec is true. 461 462 ExceptionSpecificationType OldEST = Old->getExceptionSpecType(); 463 ExceptionSpecificationType NewEST = New->getExceptionSpecType(); 464 465 assert(!isUnresolvedExceptionSpec(OldEST) && 466 !isUnresolvedExceptionSpec(NewEST) && 467 "Shouldn't see unknown exception specifications here"); 468 469 // Shortcut the case where both have no spec. 470 if (OldEST == EST_None && NewEST == EST_None) 471 return false; 472 473 FunctionProtoType::NoexceptResult OldNR = Old->getNoexceptSpec(Context); 474 FunctionProtoType::NoexceptResult NewNR = New->getNoexceptSpec(Context); 475 if (OldNR == FunctionProtoType::NR_BadNoexcept || 476 NewNR == FunctionProtoType::NR_BadNoexcept) 477 return false; 478 479 // Dependent noexcept specifiers are compatible with each other, but nothing 480 // else. 481 // One noexcept is compatible with another if the argument is the same 482 if (OldNR == NewNR && 483 OldNR != FunctionProtoType::NR_NoNoexcept && 484 NewNR != FunctionProtoType::NR_NoNoexcept) 485 return false; 486 if (OldNR != NewNR && 487 OldNR != FunctionProtoType::NR_NoNoexcept && 488 NewNR != FunctionProtoType::NR_NoNoexcept) { 489 Diag(NewLoc, DiagID); 490 if (NoteID.getDiagID() != 0 && OldLoc.isValid()) 491 Diag(OldLoc, NoteID); 492 return true; 493 } 494 495 // The MS extension throw(...) is compatible with itself. 496 if (OldEST == EST_MSAny && NewEST == EST_MSAny) 497 return false; 498 499 // It's also compatible with no spec. 500 if ((OldEST == EST_None && NewEST == EST_MSAny) || 501 (OldEST == EST_MSAny && NewEST == EST_None)) 502 return false; 503 504 // It's also compatible with noexcept(false). 505 if (OldEST == EST_MSAny && NewNR == FunctionProtoType::NR_Throw) 506 return false; 507 if (NewEST == EST_MSAny && OldNR == FunctionProtoType::NR_Throw) 508 return false; 509 510 // As described above, noexcept(false) matches no spec only for functions. 511 if (AllowNoexceptAllMatchWithNoSpec) { 512 if (OldEST == EST_None && NewNR == FunctionProtoType::NR_Throw) 513 return false; 514 if (NewEST == EST_None && OldNR == FunctionProtoType::NR_Throw) 515 return false; 516 } 517 518 // Any non-throwing specifications are compatible. 519 bool OldNonThrowing = OldNR == FunctionProtoType::NR_Nothrow || 520 OldEST == EST_DynamicNone; 521 bool NewNonThrowing = NewNR == FunctionProtoType::NR_Nothrow || 522 NewEST == EST_DynamicNone; 523 if (OldNonThrowing && NewNonThrowing) 524 return false; 525 526 // As a special compatibility feature, under C++0x we accept no spec and 527 // throw(std::bad_alloc) as equivalent for operator new and operator new[]. 528 // This is because the implicit declaration changed, but old code would break. 529 if (getLangOpts().CPlusPlus11 && IsOperatorNew) { 530 const FunctionProtoType *WithExceptions = nullptr; 531 if (OldEST == EST_None && NewEST == EST_Dynamic) 532 WithExceptions = New; 533 else if (OldEST == EST_Dynamic && NewEST == EST_None) 534 WithExceptions = Old; 535 if (WithExceptions && WithExceptions->getNumExceptions() == 1) { 536 // One has no spec, the other throw(something). If that something is 537 // std::bad_alloc, all conditions are met. 538 QualType Exception = *WithExceptions->exception_begin(); 539 if (CXXRecordDecl *ExRecord = Exception->getAsCXXRecordDecl()) { 540 IdentifierInfo* Name = ExRecord->getIdentifier(); 541 if (Name && Name->getName() == "bad_alloc") { 542 // It's called bad_alloc, but is it in std? 543 if (ExRecord->isInStdNamespace()) { 544 return false; 545 } 546 } 547 } 548 } 549 } 550 551 // At this point, the only remaining valid case is two matching dynamic 552 // specifications. We return here unless both specifications are dynamic. 553 if (OldEST != EST_Dynamic || NewEST != EST_Dynamic) { 554 if (MissingExceptionSpecification && Old->hasExceptionSpec() && 555 !New->hasExceptionSpec()) { 556 // The old type has an exception specification of some sort, but 557 // the new type does not. 558 *MissingExceptionSpecification = true; 559 560 if (MissingEmptyExceptionSpecification && OldNonThrowing) { 561 // The old type has a throw() or noexcept(true) exception specification 562 // and the new type has no exception specification, and the caller asked 563 // to handle this itself. 564 *MissingEmptyExceptionSpecification = true; 565 } 566 567 return true; 568 } 569 570 Diag(NewLoc, DiagID); 571 if (NoteID.getDiagID() != 0 && OldLoc.isValid()) 572 Diag(OldLoc, NoteID); 573 return true; 574 } 575 576 assert(OldEST == EST_Dynamic && NewEST == EST_Dynamic && 577 "Exception compatibility logic error: non-dynamic spec slipped through."); 578 579 bool Success = true; 580 // Both have a dynamic exception spec. Collect the first set, then compare 581 // to the second. 582 llvm::SmallPtrSet<CanQualType, 8> OldTypes, NewTypes; 583 for (const auto &I : Old->exceptions()) 584 OldTypes.insert(Context.getCanonicalType(I).getUnqualifiedType()); 585 586 for (const auto &I : New->exceptions()) { 587 CanQualType TypePtr = Context.getCanonicalType(I).getUnqualifiedType(); 588 if(OldTypes.count(TypePtr)) 589 NewTypes.insert(TypePtr); 590 else 591 Success = false; 592 } 593 594 Success = Success && OldTypes.size() == NewTypes.size(); 595 596 if (Success) { 597 return false; 598 } 599 Diag(NewLoc, DiagID); 600 if (NoteID.getDiagID() != 0 && OldLoc.isValid()) 601 Diag(OldLoc, NoteID); 602 return true; 603 } 604 605 /// CheckExceptionSpecSubset - Check whether the second function type's 606 /// exception specification is a subset (or equivalent) of the first function 607 /// type. This is used by override and pointer assignment checks. 608 bool Sema::CheckExceptionSpecSubset(const PartialDiagnostic &DiagID, 609 const PartialDiagnostic &NestedDiagID, 610 const PartialDiagnostic &NoteID, 611 const FunctionProtoType *Superset, 612 SourceLocation SuperLoc, 613 const FunctionProtoType *Subset, 614 SourceLocation SubLoc) { 615 616 // Just auto-succeed under -fno-exceptions. 617 if (!getLangOpts().CXXExceptions) 618 return false; 619 620 // FIXME: As usual, we could be more specific in our error messages, but 621 // that better waits until we've got types with source locations. 622 623 if (!SubLoc.isValid()) 624 SubLoc = SuperLoc; 625 626 // Resolve the exception specifications, if needed. 627 Superset = ResolveExceptionSpec(SuperLoc, Superset); 628 if (!Superset) 629 return false; 630 Subset = ResolveExceptionSpec(SubLoc, Subset); 631 if (!Subset) 632 return false; 633 634 ExceptionSpecificationType SuperEST = Superset->getExceptionSpecType(); 635 636 // If superset contains everything, we're done. 637 if (SuperEST == EST_None || SuperEST == EST_MSAny) 638 return CheckParamExceptionSpec(NestedDiagID, NoteID, Superset, SuperLoc, 639 Subset, SubLoc); 640 641 // If there are dependent noexcept specs, assume everything is fine. Unlike 642 // with the equivalency check, this is safe in this case, because we don't 643 // want to merge declarations. Checks after instantiation will catch any 644 // omissions we make here. 645 // We also shortcut checking if a noexcept expression was bad. 646 647 FunctionProtoType::NoexceptResult SuperNR =Superset->getNoexceptSpec(Context); 648 if (SuperNR == FunctionProtoType::NR_BadNoexcept || 649 SuperNR == FunctionProtoType::NR_Dependent) 650 return false; 651 652 // Another case of the superset containing everything. 653 if (SuperNR == FunctionProtoType::NR_Throw) 654 return CheckParamExceptionSpec(NestedDiagID, NoteID, Superset, SuperLoc, 655 Subset, SubLoc); 656 657 ExceptionSpecificationType SubEST = Subset->getExceptionSpecType(); 658 659 assert(!isUnresolvedExceptionSpec(SuperEST) && 660 !isUnresolvedExceptionSpec(SubEST) && 661 "Shouldn't see unknown exception specifications here"); 662 663 // It does not. If the subset contains everything, we've failed. 664 if (SubEST == EST_None || SubEST == EST_MSAny) { 665 Diag(SubLoc, DiagID); 666 if (NoteID.getDiagID() != 0) 667 Diag(SuperLoc, NoteID); 668 return true; 669 } 670 671 FunctionProtoType::NoexceptResult SubNR = Subset->getNoexceptSpec(Context); 672 if (SubNR == FunctionProtoType::NR_BadNoexcept || 673 SubNR == FunctionProtoType::NR_Dependent) 674 return false; 675 676 // Another case of the subset containing everything. 677 if (SubNR == FunctionProtoType::NR_Throw) { 678 Diag(SubLoc, DiagID); 679 if (NoteID.getDiagID() != 0) 680 Diag(SuperLoc, NoteID); 681 return true; 682 } 683 684 // If the subset contains nothing, we're done. 685 if (SubEST == EST_DynamicNone || SubNR == FunctionProtoType::NR_Nothrow) 686 return CheckParamExceptionSpec(NestedDiagID, NoteID, Superset, SuperLoc, 687 Subset, SubLoc); 688 689 // Otherwise, if the superset contains nothing, we've failed. 690 if (SuperEST == EST_DynamicNone || SuperNR == FunctionProtoType::NR_Nothrow) { 691 Diag(SubLoc, DiagID); 692 if (NoteID.getDiagID() != 0) 693 Diag(SuperLoc, NoteID); 694 return true; 695 } 696 697 assert(SuperEST == EST_Dynamic && SubEST == EST_Dynamic && 698 "Exception spec subset: non-dynamic case slipped through."); 699 700 // Neither contains everything or nothing. Do a proper comparison. 701 for (const auto &SubI : Subset->exceptions()) { 702 // Take one type from the subset. 703 QualType CanonicalSubT = Context.getCanonicalType(SubI); 704 // Unwrap pointers and references so that we can do checks within a class 705 // hierarchy. Don't unwrap member pointers; they don't have hierarchy 706 // conversions on the pointee. 707 bool SubIsPointer = false; 708 if (const ReferenceType *RefTy = CanonicalSubT->getAs<ReferenceType>()) 709 CanonicalSubT = RefTy->getPointeeType(); 710 if (const PointerType *PtrTy = CanonicalSubT->getAs<PointerType>()) { 711 CanonicalSubT = PtrTy->getPointeeType(); 712 SubIsPointer = true; 713 } 714 bool SubIsClass = CanonicalSubT->isRecordType(); 715 CanonicalSubT = CanonicalSubT.getLocalUnqualifiedType(); 716 717 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, 718 /*DetectVirtual=*/false); 719 720 bool Contained = false; 721 // Make sure it's in the superset. 722 for (const auto &SuperI : Superset->exceptions()) { 723 QualType CanonicalSuperT = Context.getCanonicalType(SuperI); 724 // SubT must be SuperT or derived from it, or pointer or reference to 725 // such types. 726 if (const ReferenceType *RefTy = CanonicalSuperT->getAs<ReferenceType>()) 727 CanonicalSuperT = RefTy->getPointeeType(); 728 if (SubIsPointer) { 729 if (const PointerType *PtrTy = CanonicalSuperT->getAs<PointerType>()) 730 CanonicalSuperT = PtrTy->getPointeeType(); 731 else { 732 continue; 733 } 734 } 735 CanonicalSuperT = CanonicalSuperT.getLocalUnqualifiedType(); 736 // If the types are the same, move on to the next type in the subset. 737 if (CanonicalSubT == CanonicalSuperT) { 738 Contained = true; 739 break; 740 } 741 742 // Otherwise we need to check the inheritance. 743 if (!SubIsClass || !CanonicalSuperT->isRecordType()) 744 continue; 745 746 Paths.clear(); 747 if (!IsDerivedFrom(SubLoc, CanonicalSubT, CanonicalSuperT, Paths)) 748 continue; 749 750 if (Paths.isAmbiguous(Context.getCanonicalType(CanonicalSuperT))) 751 continue; 752 753 // Do this check from a context without privileges. 754 switch (CheckBaseClassAccess(SourceLocation(), 755 CanonicalSuperT, CanonicalSubT, 756 Paths.front(), 757 /*Diagnostic*/ 0, 758 /*ForceCheck*/ true, 759 /*ForceUnprivileged*/ true)) { 760 case AR_accessible: break; 761 case AR_inaccessible: continue; 762 case AR_dependent: 763 llvm_unreachable("access check dependent for unprivileged context"); 764 case AR_delayed: 765 llvm_unreachable("access check delayed in non-declaration"); 766 } 767 768 Contained = true; 769 break; 770 } 771 if (!Contained) { 772 Diag(SubLoc, DiagID); 773 if (NoteID.getDiagID() != 0) 774 Diag(SuperLoc, NoteID); 775 return true; 776 } 777 } 778 // We've run half the gauntlet. 779 return CheckParamExceptionSpec(NestedDiagID, NoteID, Superset, SuperLoc, 780 Subset, SubLoc); 781 } 782 783 static bool 784 CheckSpecForTypesEquivalent(Sema &S, const PartialDiagnostic &DiagID, 785 const PartialDiagnostic &NoteID, QualType Target, 786 SourceLocation TargetLoc, QualType Source, 787 SourceLocation SourceLoc) { 788 const FunctionProtoType *TFunc = GetUnderlyingFunction(Target); 789 if (!TFunc) 790 return false; 791 const FunctionProtoType *SFunc = GetUnderlyingFunction(Source); 792 if (!SFunc) 793 return false; 794 795 return S.CheckEquivalentExceptionSpec(DiagID, NoteID, TFunc, TargetLoc, 796 SFunc, SourceLoc); 797 } 798 799 /// CheckParamExceptionSpec - Check if the parameter and return types of the 800 /// two functions have equivalent exception specs. This is part of the 801 /// assignment and override compatibility check. We do not check the parameters 802 /// of parameter function pointers recursively, as no sane programmer would 803 /// even be able to write such a function type. 804 bool Sema::CheckParamExceptionSpec(const PartialDiagnostic &DiagID, 805 const PartialDiagnostic &NoteID, 806 const FunctionProtoType *Target, 807 SourceLocation TargetLoc, 808 const FunctionProtoType *Source, 809 SourceLocation SourceLoc) { 810 auto RetDiag = DiagID; 811 RetDiag << 0; 812 if (CheckSpecForTypesEquivalent( 813 *this, RetDiag, PDiag(), 814 Target->getReturnType(), TargetLoc, Source->getReturnType(), 815 SourceLoc)) 816 return true; 817 818 // We shouldn't even be testing this unless the arguments are otherwise 819 // compatible. 820 assert(Target->getNumParams() == Source->getNumParams() && 821 "Functions have different argument counts."); 822 for (unsigned i = 0, E = Target->getNumParams(); i != E; ++i) { 823 auto ParamDiag = DiagID; 824 ParamDiag << 1; 825 if (CheckSpecForTypesEquivalent( 826 *this, ParamDiag, PDiag(), 827 Target->getParamType(i), TargetLoc, Source->getParamType(i), 828 SourceLoc)) 829 return true; 830 } 831 return false; 832 } 833 834 bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType) { 835 // First we check for applicability. 836 // Target type must be a function, function pointer or function reference. 837 const FunctionProtoType *ToFunc = GetUnderlyingFunction(ToType); 838 if (!ToFunc || ToFunc->hasDependentExceptionSpec()) 839 return false; 840 841 // SourceType must be a function or function pointer. 842 const FunctionProtoType *FromFunc = GetUnderlyingFunction(From->getType()); 843 if (!FromFunc || FromFunc->hasDependentExceptionSpec()) 844 return false; 845 846 unsigned DiagID = diag::err_incompatible_exception_specs; 847 unsigned NestedDiagID = diag::err_deep_exception_specs_differ; 848 // This is not an error in C++17 onwards, unless the noexceptness doesn't 849 // match, but in that case we have a full-on type mismatch, not just a 850 // type sugar mismatch. 851 if (getLangOpts().CPlusPlus1z) { 852 DiagID = diag::warn_incompatible_exception_specs; 853 NestedDiagID = diag::warn_deep_exception_specs_differ; 854 } 855 856 // Now we've got the correct types on both sides, check their compatibility. 857 // This means that the source of the conversion can only throw a subset of 858 // the exceptions of the target, and any exception specs on arguments or 859 // return types must be equivalent. 860 // 861 // FIXME: If there is a nested dependent exception specification, we should 862 // not be checking it here. This is fine: 863 // template<typename T> void f() { 864 // void (*p)(void (*) throw(T)); 865 // void (*q)(void (*) throw(int)) = p; 866 // } 867 // ... because it might be instantiated with T=int. 868 return CheckExceptionSpecSubset(PDiag(DiagID), PDiag(NestedDiagID), PDiag(), 869 ToFunc, From->getSourceRange().getBegin(), 870 FromFunc, SourceLocation()) && 871 !getLangOpts().CPlusPlus1z; 872 } 873 874 bool Sema::CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, 875 const CXXMethodDecl *Old) { 876 // If the new exception specification hasn't been parsed yet, skip the check. 877 // We'll get called again once it's been parsed. 878 if (New->getType()->castAs<FunctionProtoType>()->getExceptionSpecType() == 879 EST_Unparsed) 880 return false; 881 if (getLangOpts().CPlusPlus11 && isa<CXXDestructorDecl>(New)) { 882 // Don't check uninstantiated template destructors at all. We can only 883 // synthesize correct specs after the template is instantiated. 884 if (New->getParent()->isDependentType()) 885 return false; 886 if (New->getParent()->isBeingDefined()) { 887 // The destructor might be updated once the definition is finished. So 888 // remember it and check later. 889 DelayedExceptionSpecChecks.push_back(std::make_pair(New, Old)); 890 return false; 891 } 892 } 893 // If the old exception specification hasn't been parsed yet, remember that 894 // we need to perform this check when we get to the end of the outermost 895 // lexically-surrounding class. 896 if (Old->getType()->castAs<FunctionProtoType>()->getExceptionSpecType() == 897 EST_Unparsed) { 898 DelayedExceptionSpecChecks.push_back(std::make_pair(New, Old)); 899 return false; 900 } 901 unsigned DiagID = diag::err_override_exception_spec; 902 if (getLangOpts().MicrosoftExt) 903 DiagID = diag::ext_override_exception_spec; 904 return CheckExceptionSpecSubset(PDiag(DiagID), 905 PDiag(diag::err_deep_exception_specs_differ), 906 PDiag(diag::note_overridden_virtual_function), 907 Old->getType()->getAs<FunctionProtoType>(), 908 Old->getLocation(), 909 New->getType()->getAs<FunctionProtoType>(), 910 New->getLocation()); 911 } 912 913 static CanThrowResult canSubExprsThrow(Sema &S, const Expr *E) { 914 CanThrowResult R = CT_Cannot; 915 for (const Stmt *SubStmt : E->children()) { 916 R = mergeCanThrow(R, S.canThrow(cast<Expr>(SubStmt))); 917 if (R == CT_Can) 918 break; 919 } 920 return R; 921 } 922 923 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D) { 924 assert(D && "Expected decl"); 925 926 // See if we can get a function type from the decl somehow. 927 const ValueDecl *VD = dyn_cast<ValueDecl>(D); 928 if (!VD) { 929 // In C++17, we may have a canonical exception specification. If so, use it. 930 if (auto *FT = E->getType().getCanonicalType()->getAs<FunctionProtoType>()) 931 return FT->isNothrow(S.Context) ? CT_Cannot : CT_Can; 932 // If we have no clue what we're calling, assume the worst. 933 return CT_Can; 934 } 935 936 // As an extension, we assume that __attribute__((nothrow)) functions don't 937 // throw. 938 if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>()) 939 return CT_Cannot; 940 941 QualType T = VD->getType(); 942 const FunctionProtoType *FT; 943 if ((FT = T->getAs<FunctionProtoType>())) { 944 } else if (const PointerType *PT = T->getAs<PointerType>()) 945 FT = PT->getPointeeType()->getAs<FunctionProtoType>(); 946 else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 947 FT = RT->getPointeeType()->getAs<FunctionProtoType>(); 948 else if (const MemberPointerType *MT = T->getAs<MemberPointerType>()) 949 FT = MT->getPointeeType()->getAs<FunctionProtoType>(); 950 else if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) 951 FT = BT->getPointeeType()->getAs<FunctionProtoType>(); 952 953 if (!FT) 954 return CT_Can; 955 956 FT = S.ResolveExceptionSpec(E->getLocStart(), FT); 957 if (!FT) 958 return CT_Can; 959 960 return FT->isNothrow(S.Context) ? CT_Cannot : CT_Can; 961 } 962 963 static CanThrowResult canDynamicCastThrow(const CXXDynamicCastExpr *DC) { 964 if (DC->isTypeDependent()) 965 return CT_Dependent; 966 967 if (!DC->getTypeAsWritten()->isReferenceType()) 968 return CT_Cannot; 969 970 if (DC->getSubExpr()->isTypeDependent()) 971 return CT_Dependent; 972 973 return DC->getCastKind() == clang::CK_Dynamic? CT_Can : CT_Cannot; 974 } 975 976 static CanThrowResult canTypeidThrow(Sema &S, const CXXTypeidExpr *DC) { 977 if (DC->isTypeOperand()) 978 return CT_Cannot; 979 980 Expr *Op = DC->getExprOperand(); 981 if (Op->isTypeDependent()) 982 return CT_Dependent; 983 984 const RecordType *RT = Op->getType()->getAs<RecordType>(); 985 if (!RT) 986 return CT_Cannot; 987 988 if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic()) 989 return CT_Cannot; 990 991 if (Op->Classify(S.Context).isPRValue()) 992 return CT_Cannot; 993 994 return CT_Can; 995 } 996 997 CanThrowResult Sema::canThrow(const Expr *E) { 998 // C++ [expr.unary.noexcept]p3: 999 // [Can throw] if in a potentially-evaluated context the expression would 1000 // contain: 1001 switch (E->getStmtClass()) { 1002 case Expr::CXXThrowExprClass: 1003 // - a potentially evaluated throw-expression 1004 return CT_Can; 1005 1006 case Expr::CXXDynamicCastExprClass: { 1007 // - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v), 1008 // where T is a reference type, that requires a run-time check 1009 CanThrowResult CT = canDynamicCastThrow(cast<CXXDynamicCastExpr>(E)); 1010 if (CT == CT_Can) 1011 return CT; 1012 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1013 } 1014 1015 case Expr::CXXTypeidExprClass: 1016 // - a potentially evaluated typeid expression applied to a glvalue 1017 // expression whose type is a polymorphic class type 1018 return canTypeidThrow(*this, cast<CXXTypeidExpr>(E)); 1019 1020 // - a potentially evaluated call to a function, member function, function 1021 // pointer, or member function pointer that does not have a non-throwing 1022 // exception-specification 1023 case Expr::CallExprClass: 1024 case Expr::CXXMemberCallExprClass: 1025 case Expr::CXXOperatorCallExprClass: 1026 case Expr::UserDefinedLiteralClass: { 1027 const CallExpr *CE = cast<CallExpr>(E); 1028 CanThrowResult CT; 1029 if (E->isTypeDependent()) 1030 CT = CT_Dependent; 1031 else if (isa<CXXPseudoDestructorExpr>(CE->getCallee()->IgnoreParens())) 1032 CT = CT_Cannot; 1033 else if (CE->getCalleeDecl()) 1034 CT = canCalleeThrow(*this, E, CE->getCalleeDecl()); 1035 else 1036 CT = CT_Can; 1037 if (CT == CT_Can) 1038 return CT; 1039 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1040 } 1041 1042 case Expr::CXXConstructExprClass: 1043 case Expr::CXXTemporaryObjectExprClass: { 1044 CanThrowResult CT = canCalleeThrow(*this, E, 1045 cast<CXXConstructExpr>(E)->getConstructor()); 1046 if (CT == CT_Can) 1047 return CT; 1048 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1049 } 1050 1051 case Expr::CXXInheritedCtorInitExprClass: 1052 return canCalleeThrow(*this, E, 1053 cast<CXXInheritedCtorInitExpr>(E)->getConstructor()); 1054 1055 case Expr::LambdaExprClass: { 1056 const LambdaExpr *Lambda = cast<LambdaExpr>(E); 1057 CanThrowResult CT = CT_Cannot; 1058 for (LambdaExpr::const_capture_init_iterator 1059 Cap = Lambda->capture_init_begin(), 1060 CapEnd = Lambda->capture_init_end(); 1061 Cap != CapEnd; ++Cap) 1062 CT = mergeCanThrow(CT, canThrow(*Cap)); 1063 return CT; 1064 } 1065 1066 case Expr::CXXNewExprClass: { 1067 CanThrowResult CT; 1068 if (E->isTypeDependent()) 1069 CT = CT_Dependent; 1070 else 1071 CT = canCalleeThrow(*this, E, cast<CXXNewExpr>(E)->getOperatorNew()); 1072 if (CT == CT_Can) 1073 return CT; 1074 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1075 } 1076 1077 case Expr::CXXDeleteExprClass: { 1078 CanThrowResult CT; 1079 QualType DTy = cast<CXXDeleteExpr>(E)->getDestroyedType(); 1080 if (DTy.isNull() || DTy->isDependentType()) { 1081 CT = CT_Dependent; 1082 } else { 1083 CT = canCalleeThrow(*this, E, 1084 cast<CXXDeleteExpr>(E)->getOperatorDelete()); 1085 if (const RecordType *RT = DTy->getAs<RecordType>()) { 1086 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 1087 const CXXDestructorDecl *DD = RD->getDestructor(); 1088 if (DD) 1089 CT = mergeCanThrow(CT, canCalleeThrow(*this, E, DD)); 1090 } 1091 if (CT == CT_Can) 1092 return CT; 1093 } 1094 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1095 } 1096 1097 case Expr::CXXBindTemporaryExprClass: { 1098 // The bound temporary has to be destroyed again, which might throw. 1099 CanThrowResult CT = canCalleeThrow(*this, E, 1100 cast<CXXBindTemporaryExpr>(E)->getTemporary()->getDestructor()); 1101 if (CT == CT_Can) 1102 return CT; 1103 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1104 } 1105 1106 // ObjC message sends are like function calls, but never have exception 1107 // specs. 1108 case Expr::ObjCMessageExprClass: 1109 case Expr::ObjCPropertyRefExprClass: 1110 case Expr::ObjCSubscriptRefExprClass: 1111 return CT_Can; 1112 1113 // All the ObjC literals that are implemented as calls are 1114 // potentially throwing unless we decide to close off that 1115 // possibility. 1116 case Expr::ObjCArrayLiteralClass: 1117 case Expr::ObjCDictionaryLiteralClass: 1118 case Expr::ObjCBoxedExprClass: 1119 return CT_Can; 1120 1121 // Many other things have subexpressions, so we have to test those. 1122 // Some are simple: 1123 case Expr::CoawaitExprClass: 1124 case Expr::ConditionalOperatorClass: 1125 case Expr::CompoundLiteralExprClass: 1126 case Expr::CoyieldExprClass: 1127 case Expr::CXXConstCastExprClass: 1128 case Expr::CXXReinterpretCastExprClass: 1129 case Expr::CXXStdInitializerListExprClass: 1130 case Expr::DesignatedInitExprClass: 1131 case Expr::DesignatedInitUpdateExprClass: 1132 case Expr::ExprWithCleanupsClass: 1133 case Expr::ExtVectorElementExprClass: 1134 case Expr::InitListExprClass: 1135 case Expr::MemberExprClass: 1136 case Expr::ObjCIsaExprClass: 1137 case Expr::ObjCIvarRefExprClass: 1138 case Expr::ParenExprClass: 1139 case Expr::ParenListExprClass: 1140 case Expr::ShuffleVectorExprClass: 1141 case Expr::ConvertVectorExprClass: 1142 case Expr::VAArgExprClass: 1143 return canSubExprsThrow(*this, E); 1144 1145 // Some might be dependent for other reasons. 1146 case Expr::ArraySubscriptExprClass: 1147 case Expr::OMPArraySectionExprClass: 1148 case Expr::BinaryOperatorClass: 1149 case Expr::CompoundAssignOperatorClass: 1150 case Expr::CStyleCastExprClass: 1151 case Expr::CXXStaticCastExprClass: 1152 case Expr::CXXFunctionalCastExprClass: 1153 case Expr::ImplicitCastExprClass: 1154 case Expr::MaterializeTemporaryExprClass: 1155 case Expr::UnaryOperatorClass: { 1156 CanThrowResult CT = E->isTypeDependent() ? CT_Dependent : CT_Cannot; 1157 return mergeCanThrow(CT, canSubExprsThrow(*this, E)); 1158 } 1159 1160 // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms. 1161 case Expr::StmtExprClass: 1162 return CT_Can; 1163 1164 case Expr::CXXDefaultArgExprClass: 1165 return canThrow(cast<CXXDefaultArgExpr>(E)->getExpr()); 1166 1167 case Expr::CXXDefaultInitExprClass: 1168 return canThrow(cast<CXXDefaultInitExpr>(E)->getExpr()); 1169 1170 case Expr::ChooseExprClass: 1171 if (E->isTypeDependent() || E->isValueDependent()) 1172 return CT_Dependent; 1173 return canThrow(cast<ChooseExpr>(E)->getChosenSubExpr()); 1174 1175 case Expr::GenericSelectionExprClass: 1176 if (cast<GenericSelectionExpr>(E)->isResultDependent()) 1177 return CT_Dependent; 1178 return canThrow(cast<GenericSelectionExpr>(E)->getResultExpr()); 1179 1180 // Some expressions are always dependent. 1181 case Expr::CXXDependentScopeMemberExprClass: 1182 case Expr::CXXUnresolvedConstructExprClass: 1183 case Expr::DependentScopeDeclRefExprClass: 1184 case Expr::CXXFoldExprClass: 1185 return CT_Dependent; 1186 1187 case Expr::AsTypeExprClass: 1188 case Expr::BinaryConditionalOperatorClass: 1189 case Expr::BlockExprClass: 1190 case Expr::CUDAKernelCallExprClass: 1191 case Expr::DeclRefExprClass: 1192 case Expr::ObjCBridgedCastExprClass: 1193 case Expr::ObjCIndirectCopyRestoreExprClass: 1194 case Expr::ObjCProtocolExprClass: 1195 case Expr::ObjCSelectorExprClass: 1196 case Expr::ObjCAvailabilityCheckExprClass: 1197 case Expr::OffsetOfExprClass: 1198 case Expr::PackExpansionExprClass: 1199 case Expr::PseudoObjectExprClass: 1200 case Expr::SubstNonTypeTemplateParmExprClass: 1201 case Expr::SubstNonTypeTemplateParmPackExprClass: 1202 case Expr::FunctionParmPackExprClass: 1203 case Expr::UnaryExprOrTypeTraitExprClass: 1204 case Expr::UnresolvedLookupExprClass: 1205 case Expr::UnresolvedMemberExprClass: 1206 case Expr::TypoExprClass: 1207 // FIXME: Can any of the above throw? If so, when? 1208 return CT_Cannot; 1209 1210 case Expr::AddrLabelExprClass: 1211 case Expr::ArrayTypeTraitExprClass: 1212 case Expr::AtomicExprClass: 1213 case Expr::TypeTraitExprClass: 1214 case Expr::CXXBoolLiteralExprClass: 1215 case Expr::CXXNoexceptExprClass: 1216 case Expr::CXXNullPtrLiteralExprClass: 1217 case Expr::CXXPseudoDestructorExprClass: 1218 case Expr::CXXScalarValueInitExprClass: 1219 case Expr::CXXThisExprClass: 1220 case Expr::CXXUuidofExprClass: 1221 case Expr::CharacterLiteralClass: 1222 case Expr::ExpressionTraitExprClass: 1223 case Expr::FloatingLiteralClass: 1224 case Expr::GNUNullExprClass: 1225 case Expr::ImaginaryLiteralClass: 1226 case Expr::ImplicitValueInitExprClass: 1227 case Expr::IntegerLiteralClass: 1228 case Expr::NoInitExprClass: 1229 case Expr::ObjCEncodeExprClass: 1230 case Expr::ObjCStringLiteralClass: 1231 case Expr::ObjCBoolLiteralExprClass: 1232 case Expr::OpaqueValueExprClass: 1233 case Expr::PredefinedExprClass: 1234 case Expr::SizeOfPackExprClass: 1235 case Expr::StringLiteralClass: 1236 // These expressions can never throw. 1237 return CT_Cannot; 1238 1239 case Expr::MSPropertyRefExprClass: 1240 case Expr::MSPropertySubscriptExprClass: 1241 llvm_unreachable("Invalid class for expression"); 1242 1243 #define STMT(CLASS, PARENT) case Expr::CLASS##Class: 1244 #define STMT_RANGE(Base, First, Last) 1245 #define LAST_STMT_RANGE(BASE, FIRST, LAST) 1246 #define EXPR(CLASS, PARENT) 1247 #define ABSTRACT_STMT(STMT) 1248 #include "clang/AST/StmtNodes.inc" 1249 case Expr::NoStmtClass: 1250 llvm_unreachable("Invalid class for expression"); 1251 } 1252 llvm_unreachable("Bogus StmtClass"); 1253 } 1254 1255 } // end namespace clang 1256