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