xref: /freebsd/contrib/llvm-project/clang/lib/Sema/SemaExceptionSpec.cpp (revision 82d4dc0621c92e3c05a86013eec35afbdec057a5)
1  //===--- SemaExceptionSpec.cpp - C++ Exception Specifications ---*- C++ -*-===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  // This file provides Sema routines for C++ exception specification testing.
10  //
11  //===----------------------------------------------------------------------===//
12  
13  #include "clang/Sema/SemaInternal.h"
14  #include "clang/AST/ASTMutationListener.h"
15  #include "clang/AST/CXXInheritance.h"
16  #include "clang/AST/Expr.h"
17  #include "clang/AST/ExprCXX.h"
18  #include "clang/AST/StmtObjC.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: 2014-11-14 libstdc++ had a bug where it shadows std::swap with a
39  /// member swap function then tries to call std::swap unqualified from the
40  /// exception specification of that function. This function detects whether
41  /// we're in such a case and turns off delay-parsing of exception
42  /// specifications. Libstdc++ 6.1 (released 2016-04-27) appears to have
43  /// resolved it as side-effect of commit ddb63209a8d (2015-06-05).
44  bool Sema::isLibstdcxxEagerExceptionSpecHack(const Declarator &D) {
45    auto *RD = dyn_cast<CXXRecordDecl>(CurContext);
46  
47    // All the problem cases are member functions named "swap" within class
48    // templates declared directly within namespace std or std::__debug or
49    // std::__profile.
50    if (!RD || !RD->getIdentifier() || !RD->getDescribedClassTemplate() ||
51        !D.getIdentifier() || !D.getIdentifier()->isStr("swap"))
52      return false;
53  
54    auto *ND = dyn_cast<NamespaceDecl>(RD->getDeclContext());
55    if (!ND)
56      return false;
57  
58    bool IsInStd = ND->isStdNamespace();
59    if (!IsInStd) {
60      // This isn't a direct member of namespace std, but it might still be
61      // libstdc++'s std::__debug::array or std::__profile::array.
62      IdentifierInfo *II = ND->getIdentifier();
63      if (!II || !(II->isStr("__debug") || II->isStr("__profile")) ||
64          !ND->isInStdNamespace())
65        return false;
66    }
67  
68    // Only apply this hack within a system header.
69    if (!Context.getSourceManager().isInSystemHeader(D.getBeginLoc()))
70      return false;
71  
72    return llvm::StringSwitch<bool>(RD->getIdentifier()->getName())
73        .Case("array", true)
74        .Case("pair", IsInStd)
75        .Case("priority_queue", IsInStd)
76        .Case("stack", IsInStd)
77        .Case("queue", IsInStd)
78        .Default(false);
79  }
80  
81  ExprResult Sema::ActOnNoexceptSpec(SourceLocation NoexceptLoc,
82                                     Expr *NoexceptExpr,
83                                     ExceptionSpecificationType &EST) {
84    // FIXME: This is bogus, a noexcept expression is not a condition.
85    ExprResult Converted = CheckBooleanCondition(NoexceptLoc, NoexceptExpr);
86    if (Converted.isInvalid()) {
87      EST = EST_NoexceptFalse;
88  
89      // Fill in an expression of 'false' as a fixup.
90      auto *BoolExpr = new (Context)
91          CXXBoolLiteralExpr(false, Context.BoolTy, NoexceptExpr->getBeginLoc());
92      llvm::APSInt Value{1};
93      Value = 0;
94      return ConstantExpr::Create(Context, BoolExpr, APValue{Value});
95    }
96  
97    if (Converted.get()->isValueDependent()) {
98      EST = EST_DependentNoexcept;
99      return Converted;
100    }
101  
102    llvm::APSInt Result;
103    Converted = VerifyIntegerConstantExpression(
104        Converted.get(), &Result, diag::err_noexcept_needs_constant_expression);
105    if (!Converted.isInvalid())
106      EST = !Result ? EST_NoexceptFalse : EST_NoexceptTrue;
107    return Converted;
108  }
109  
110  /// CheckSpecifiedExceptionType - Check if the given type is valid in an
111  /// exception specification. Incomplete types, or pointers to incomplete types
112  /// other than void are not allowed.
113  ///
114  /// \param[in,out] T  The exception type. This will be decayed to a pointer type
115  ///                   when the input is an array or a function type.
116  bool Sema::CheckSpecifiedExceptionType(QualType &T, SourceRange Range) {
117    // C++11 [except.spec]p2:
118    //   A type cv T, "array of T", or "function returning T" denoted
119    //   in an exception-specification is adjusted to type T, "pointer to T", or
120    //   "pointer to function returning T", respectively.
121    //
122    // We also apply this rule in C++98.
123    if (T->isArrayType())
124      T = Context.getArrayDecayedType(T);
125    else if (T->isFunctionType())
126      T = Context.getPointerType(T);
127  
128    int Kind = 0;
129    QualType PointeeT = T;
130    if (const PointerType *PT = T->getAs<PointerType>()) {
131      PointeeT = PT->getPointeeType();
132      Kind = 1;
133  
134      // cv void* is explicitly permitted, despite being a pointer to an
135      // incomplete type.
136      if (PointeeT->isVoidType())
137        return false;
138    } else if (const ReferenceType *RT = T->getAs<ReferenceType>()) {
139      PointeeT = RT->getPointeeType();
140      Kind = 2;
141  
142      if (RT->isRValueReferenceType()) {
143        // C++11 [except.spec]p2:
144        //   A type denoted in an exception-specification shall not denote [...]
145        //   an rvalue reference type.
146        Diag(Range.getBegin(), diag::err_rref_in_exception_spec)
147          << T << Range;
148        return true;
149      }
150    }
151  
152    // C++11 [except.spec]p2:
153    //   A type denoted in an exception-specification shall not denote an
154    //   incomplete type other than a class currently being defined [...].
155    //   A type denoted in an exception-specification shall not denote a
156    //   pointer or reference to an incomplete type, other than (cv) void* or a
157    //   pointer or reference to a class currently being defined.
158    // In Microsoft mode, downgrade this to a warning.
159    unsigned DiagID = diag::err_incomplete_in_exception_spec;
160    bool ReturnValueOnError = true;
161    if (getLangOpts().MSVCCompat) {
162      DiagID = diag::ext_incomplete_in_exception_spec;
163      ReturnValueOnError = false;
164    }
165    if (!(PointeeT->isRecordType() &&
166          PointeeT->castAs<RecordType>()->isBeingDefined()) &&
167        RequireCompleteType(Range.getBegin(), PointeeT, DiagID, Kind, Range))
168      return ReturnValueOnError;
169  
170    // The MSVC compatibility mode doesn't extend to sizeless types,
171    // so diagnose them separately.
172    if (PointeeT->isSizelessType() && Kind != 1) {
173      Diag(Range.getBegin(), diag::err_sizeless_in_exception_spec)
174          << (Kind == 2 ? 1 : 0) << PointeeT << Range;
175      return true;
176    }
177  
178    return false;
179  }
180  
181  /// CheckDistantExceptionSpec - Check if the given type is a pointer or pointer
182  /// to member to a function with an exception specification. This means that
183  /// it is invalid to add another level of indirection.
184  bool Sema::CheckDistantExceptionSpec(QualType T) {
185    // C++17 removes this rule in favor of putting exception specifications into
186    // the type system.
187    if (getLangOpts().CPlusPlus17)
188      return false;
189  
190    if (const PointerType *PT = T->getAs<PointerType>())
191      T = PT->getPointeeType();
192    else if (const MemberPointerType *PT = T->getAs<MemberPointerType>())
193      T = PT->getPointeeType();
194    else
195      return false;
196  
197    const FunctionProtoType *FnT = T->getAs<FunctionProtoType>();
198    if (!FnT)
199      return false;
200  
201    return FnT->hasExceptionSpec();
202  }
203  
204  const FunctionProtoType *
205  Sema::ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT) {
206    if (FPT->getExceptionSpecType() == EST_Unparsed) {
207      Diag(Loc, diag::err_exception_spec_not_parsed);
208      return nullptr;
209    }
210  
211    if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType()))
212      return FPT;
213  
214    FunctionDecl *SourceDecl = FPT->getExceptionSpecDecl();
215    const FunctionProtoType *SourceFPT =
216        SourceDecl->getType()->castAs<FunctionProtoType>();
217  
218    // If the exception specification has already been resolved, just return it.
219    if (!isUnresolvedExceptionSpec(SourceFPT->getExceptionSpecType()))
220      return SourceFPT;
221  
222    // Compute or instantiate the exception specification now.
223    if (SourceFPT->getExceptionSpecType() == EST_Unevaluated)
224      EvaluateImplicitExceptionSpec(Loc, SourceDecl);
225    else
226      InstantiateExceptionSpec(Loc, SourceDecl);
227  
228    const FunctionProtoType *Proto =
229      SourceDecl->getType()->castAs<FunctionProtoType>();
230    if (Proto->getExceptionSpecType() == clang::EST_Unparsed) {
231      Diag(Loc, diag::err_exception_spec_not_parsed);
232      Proto = nullptr;
233    }
234    return Proto;
235  }
236  
237  void
238  Sema::UpdateExceptionSpec(FunctionDecl *FD,
239                            const FunctionProtoType::ExceptionSpecInfo &ESI) {
240    // If we've fully resolved the exception specification, notify listeners.
241    if (!isUnresolvedExceptionSpec(ESI.Type))
242      if (auto *Listener = getASTMutationListener())
243        Listener->ResolvedExceptionSpec(FD);
244  
245    for (FunctionDecl *Redecl : FD->redecls())
246      Context.adjustExceptionSpec(Redecl, ESI);
247  }
248  
249  static bool exceptionSpecNotKnownYet(const FunctionDecl *FD) {
250    auto *MD = dyn_cast<CXXMethodDecl>(FD);
251    if (!MD)
252      return false;
253  
254    auto EST = MD->getType()->castAs<FunctionProtoType>()->getExceptionSpecType();
255    return EST == EST_Unparsed ||
256           (EST == EST_Unevaluated && MD->getParent()->isBeingDefined());
257  }
258  
259  static bool CheckEquivalentExceptionSpecImpl(
260      Sema &S, const PartialDiagnostic &DiagID, const PartialDiagnostic &NoteID,
261      const FunctionProtoType *Old, SourceLocation OldLoc,
262      const FunctionProtoType *New, SourceLocation NewLoc,
263      bool *MissingExceptionSpecification = nullptr,
264      bool *MissingEmptyExceptionSpecification = nullptr,
265      bool AllowNoexceptAllMatchWithNoSpec = false, bool IsOperatorNew = false);
266  
267  /// Determine whether a function has an implicitly-generated exception
268  /// specification.
269  static bool hasImplicitExceptionSpec(FunctionDecl *Decl) {
270    if (!isa<CXXDestructorDecl>(Decl) &&
271        Decl->getDeclName().getCXXOverloadedOperator() != OO_Delete &&
272        Decl->getDeclName().getCXXOverloadedOperator() != OO_Array_Delete)
273      return false;
274  
275    // For a function that the user didn't declare:
276    //  - if this is a destructor, its exception specification is implicit.
277    //  - if this is 'operator delete' or 'operator delete[]', the exception
278    //    specification is as-if an explicit exception specification was given
279    //    (per [basic.stc.dynamic]p2).
280    if (!Decl->getTypeSourceInfo())
281      return isa<CXXDestructorDecl>(Decl);
282  
283    auto *Ty = Decl->getTypeSourceInfo()->getType()->castAs<FunctionProtoType>();
284    return !Ty->hasExceptionSpec();
285  }
286  
287  bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) {
288    // Just completely ignore this under -fno-exceptions prior to C++17.
289    // In C++17 onwards, the exception specification is part of the type and
290    // we will diagnose mismatches anyway, so it's better to check for them here.
291    if (!getLangOpts().CXXExceptions && !getLangOpts().CPlusPlus17)
292      return false;
293  
294    OverloadedOperatorKind OO = New->getDeclName().getCXXOverloadedOperator();
295    bool IsOperatorNew = OO == OO_New || OO == OO_Array_New;
296    bool MissingExceptionSpecification = false;
297    bool MissingEmptyExceptionSpecification = false;
298  
299    unsigned DiagID = diag::err_mismatched_exception_spec;
300    bool ReturnValueOnError = true;
301    if (getLangOpts().MSVCCompat) {
302      DiagID = diag::ext_mismatched_exception_spec;
303      ReturnValueOnError = false;
304    }
305  
306    // If we're befriending a member function of a class that's currently being
307    // defined, we might not be able to work out its exception specification yet.
308    // If not, defer the check until later.
309    if (exceptionSpecNotKnownYet(Old) || exceptionSpecNotKnownYet(New)) {
310      DelayedEquivalentExceptionSpecChecks.push_back({New, Old});
311      return false;
312    }
313  
314    // Check the types as written: they must match before any exception
315    // specification adjustment is applied.
316    if (!CheckEquivalentExceptionSpecImpl(
317          *this, PDiag(DiagID), PDiag(diag::note_previous_declaration),
318          Old->getType()->getAs<FunctionProtoType>(), Old->getLocation(),
319          New->getType()->getAs<FunctionProtoType>(), New->getLocation(),
320          &MissingExceptionSpecification, &MissingEmptyExceptionSpecification,
321          /*AllowNoexceptAllMatchWithNoSpec=*/true, IsOperatorNew)) {
322      // C++11 [except.spec]p4 [DR1492]:
323      //   If a declaration of a function has an implicit
324      //   exception-specification, other declarations of the function shall
325      //   not specify an exception-specification.
326      if (getLangOpts().CPlusPlus11 && getLangOpts().CXXExceptions &&
327          hasImplicitExceptionSpec(Old) != hasImplicitExceptionSpec(New)) {
328        Diag(New->getLocation(), diag::ext_implicit_exception_spec_mismatch)
329          << hasImplicitExceptionSpec(Old);
330        if (Old->getLocation().isValid())
331          Diag(Old->getLocation(), diag::note_previous_declaration);
332      }
333      return false;
334    }
335  
336    // The failure was something other than an missing exception
337    // specification; return an error, except in MS mode where this is a warning.
338    if (!MissingExceptionSpecification)
339      return ReturnValueOnError;
340  
341    const FunctionProtoType *NewProto =
342      New->getType()->castAs<FunctionProtoType>();
343  
344    // The new function declaration is only missing an empty exception
345    // specification "throw()". If the throw() specification came from a
346    // function in a system header that has C linkage, just add an empty
347    // exception specification to the "new" declaration. Note that C library
348    // implementations are permitted to add these nothrow exception
349    // specifications.
350    //
351    // Likewise if the old function is a builtin.
352    if (MissingEmptyExceptionSpecification && NewProto &&
353        (Old->getLocation().isInvalid() ||
354         Context.getSourceManager().isInSystemHeader(Old->getLocation()) ||
355         Old->getBuiltinID()) &&
356        Old->isExternC()) {
357      New->setType(Context.getFunctionType(
358          NewProto->getReturnType(), NewProto->getParamTypes(),
359          NewProto->getExtProtoInfo().withExceptionSpec(EST_DynamicNone)));
360      return false;
361    }
362  
363    const FunctionProtoType *OldProto =
364      Old->getType()->castAs<FunctionProtoType>();
365  
366    FunctionProtoType::ExceptionSpecInfo ESI = OldProto->getExceptionSpecType();
367    if (ESI.Type == EST_Dynamic) {
368      // FIXME: What if the exceptions are described in terms of the old
369      // prototype's parameters?
370      ESI.Exceptions = OldProto->exceptions();
371    }
372  
373    if (ESI.Type == EST_NoexceptFalse)
374      ESI.Type = EST_None;
375    if (ESI.Type == EST_NoexceptTrue)
376      ESI.Type = EST_BasicNoexcept;
377  
378    // For dependent noexcept, we can't just take the expression from the old
379    // prototype. It likely contains references to the old prototype's parameters.
380    if (ESI.Type == EST_DependentNoexcept) {
381      New->setInvalidDecl();
382    } else {
383      // Update the type of the function with the appropriate exception
384      // specification.
385      New->setType(Context.getFunctionType(
386          NewProto->getReturnType(), NewProto->getParamTypes(),
387          NewProto->getExtProtoInfo().withExceptionSpec(ESI)));
388    }
389  
390    if (getLangOpts().MSVCCompat && ESI.Type != EST_DependentNoexcept) {
391      // Allow missing exception specifications in redeclarations as an extension.
392      DiagID = diag::ext_ms_missing_exception_specification;
393      ReturnValueOnError = false;
394    } else if (New->isReplaceableGlobalAllocationFunction() &&
395               ESI.Type != EST_DependentNoexcept) {
396      // Allow missing exception specifications in redeclarations as an extension,
397      // when declaring a replaceable global allocation function.
398      DiagID = diag::ext_missing_exception_specification;
399      ReturnValueOnError = false;
400    } else if (ESI.Type == EST_NoThrow) {
401      // Allow missing attribute 'nothrow' in redeclarations, since this is a very
402      // common omission.
403      DiagID = diag::ext_missing_exception_specification;
404      ReturnValueOnError = false;
405    } else {
406      DiagID = diag::err_missing_exception_specification;
407      ReturnValueOnError = true;
408    }
409  
410    // Warn about the lack of exception specification.
411    SmallString<128> ExceptionSpecString;
412    llvm::raw_svector_ostream OS(ExceptionSpecString);
413    switch (OldProto->getExceptionSpecType()) {
414    case EST_DynamicNone:
415      OS << "throw()";
416      break;
417  
418    case EST_Dynamic: {
419      OS << "throw(";
420      bool OnFirstException = true;
421      for (const auto &E : OldProto->exceptions()) {
422        if (OnFirstException)
423          OnFirstException = false;
424        else
425          OS << ", ";
426  
427        OS << E.getAsString(getPrintingPolicy());
428      }
429      OS << ")";
430      break;
431    }
432  
433    case EST_BasicNoexcept:
434      OS << "noexcept";
435      break;
436  
437    case EST_DependentNoexcept:
438    case EST_NoexceptFalse:
439    case EST_NoexceptTrue:
440      OS << "noexcept(";
441      assert(OldProto->getNoexceptExpr() != nullptr && "Expected non-null Expr");
442      OldProto->getNoexceptExpr()->printPretty(OS, nullptr, getPrintingPolicy());
443      OS << ")";
444      break;
445    case EST_NoThrow:
446      OS <<"__attribute__((nothrow))";
447      break;
448    case EST_None:
449    case EST_MSAny:
450    case EST_Unevaluated:
451    case EST_Uninstantiated:
452    case EST_Unparsed:
453      llvm_unreachable("This spec type is compatible with none.");
454    }
455  
456    SourceLocation FixItLoc;
457    if (TypeSourceInfo *TSInfo = New->getTypeSourceInfo()) {
458      TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
459      // FIXME: Preserve enough information so that we can produce a correct fixit
460      // location when there is a trailing return type.
461      if (auto FTLoc = TL.getAs<FunctionProtoTypeLoc>())
462        if (!FTLoc.getTypePtr()->hasTrailingReturn())
463          FixItLoc = getLocForEndOfToken(FTLoc.getLocalRangeEnd());
464    }
465  
466    if (FixItLoc.isInvalid())
467      Diag(New->getLocation(), DiagID)
468        << New << OS.str();
469    else {
470      Diag(New->getLocation(), DiagID)
471        << New << OS.str()
472        << FixItHint::CreateInsertion(FixItLoc, " " + OS.str().str());
473    }
474  
475    if (Old->getLocation().isValid())
476      Diag(Old->getLocation(), diag::note_previous_declaration);
477  
478    return ReturnValueOnError;
479  }
480  
481  /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
482  /// exception specifications. Exception specifications are equivalent if
483  /// they allow exactly the same set of exception types. It does not matter how
484  /// that is achieved. See C++ [except.spec]p2.
485  bool Sema::CheckEquivalentExceptionSpec(
486      const FunctionProtoType *Old, SourceLocation OldLoc,
487      const FunctionProtoType *New, SourceLocation NewLoc) {
488    if (!getLangOpts().CXXExceptions)
489      return false;
490  
491    unsigned DiagID = diag::err_mismatched_exception_spec;
492    if (getLangOpts().MSVCCompat)
493      DiagID = diag::ext_mismatched_exception_spec;
494    bool Result = CheckEquivalentExceptionSpecImpl(
495        *this, PDiag(DiagID), PDiag(diag::note_previous_declaration),
496        Old, OldLoc, New, NewLoc);
497  
498    // In Microsoft mode, mismatching exception specifications just cause a warning.
499    if (getLangOpts().MSVCCompat)
500      return false;
501    return Result;
502  }
503  
504  /// CheckEquivalentExceptionSpec - Check if the two types have compatible
505  /// exception specifications. See C++ [except.spec]p3.
506  ///
507  /// \return \c false if the exception specifications match, \c true if there is
508  /// a problem. If \c true is returned, either a diagnostic has already been
509  /// produced or \c *MissingExceptionSpecification is set to \c true.
510  static bool CheckEquivalentExceptionSpecImpl(
511      Sema &S, const PartialDiagnostic &DiagID, const PartialDiagnostic &NoteID,
512      const FunctionProtoType *Old, SourceLocation OldLoc,
513      const FunctionProtoType *New, SourceLocation NewLoc,
514      bool *MissingExceptionSpecification,
515      bool *MissingEmptyExceptionSpecification,
516      bool AllowNoexceptAllMatchWithNoSpec, bool IsOperatorNew) {
517    if (MissingExceptionSpecification)
518      *MissingExceptionSpecification = false;
519  
520    if (MissingEmptyExceptionSpecification)
521      *MissingEmptyExceptionSpecification = false;
522  
523    Old = S.ResolveExceptionSpec(NewLoc, Old);
524    if (!Old)
525      return false;
526    New = S.ResolveExceptionSpec(NewLoc, New);
527    if (!New)
528      return false;
529  
530    // C++0x [except.spec]p3: Two exception-specifications are compatible if:
531    //   - both are non-throwing, regardless of their form,
532    //   - both have the form noexcept(constant-expression) and the constant-
533    //     expressions are equivalent,
534    //   - both are dynamic-exception-specifications that have the same set of
535    //     adjusted types.
536    //
537    // C++0x [except.spec]p12: An exception-specification is non-throwing if it is
538    //   of the form throw(), noexcept, or noexcept(constant-expression) where the
539    //   constant-expression yields true.
540    //
541    // C++0x [except.spec]p4: If any declaration of a function has an exception-
542    //   specifier that is not a noexcept-specification allowing all exceptions,
543    //   all declarations [...] of that function shall have a compatible
544    //   exception-specification.
545    //
546    // That last point basically means that noexcept(false) matches no spec.
547    // It's considered when AllowNoexceptAllMatchWithNoSpec is true.
548  
549    ExceptionSpecificationType OldEST = Old->getExceptionSpecType();
550    ExceptionSpecificationType NewEST = New->getExceptionSpecType();
551  
552    assert(!isUnresolvedExceptionSpec(OldEST) &&
553           !isUnresolvedExceptionSpec(NewEST) &&
554           "Shouldn't see unknown exception specifications here");
555  
556    CanThrowResult OldCanThrow = Old->canThrow();
557    CanThrowResult NewCanThrow = New->canThrow();
558  
559    // Any non-throwing specifications are compatible.
560    if (OldCanThrow == CT_Cannot && NewCanThrow == CT_Cannot)
561      return false;
562  
563    // Any throws-anything specifications are usually compatible.
564    if (OldCanThrow == CT_Can && OldEST != EST_Dynamic &&
565        NewCanThrow == CT_Can && NewEST != EST_Dynamic) {
566      // The exception is that the absence of an exception specification only
567      // matches noexcept(false) for functions, as described above.
568      if (!AllowNoexceptAllMatchWithNoSpec &&
569          ((OldEST == EST_None && NewEST == EST_NoexceptFalse) ||
570           (OldEST == EST_NoexceptFalse && NewEST == EST_None))) {
571        // This is the disallowed case.
572      } else {
573        return false;
574      }
575    }
576  
577    // C++14 [except.spec]p3:
578    //   Two exception-specifications are compatible if [...] both have the form
579    //   noexcept(constant-expression) and the constant-expressions are equivalent
580    if (OldEST == EST_DependentNoexcept && NewEST == EST_DependentNoexcept) {
581      llvm::FoldingSetNodeID OldFSN, NewFSN;
582      Old->getNoexceptExpr()->Profile(OldFSN, S.Context, true);
583      New->getNoexceptExpr()->Profile(NewFSN, S.Context, true);
584      if (OldFSN == NewFSN)
585        return false;
586    }
587  
588    // Dynamic exception specifications with the same set of adjusted types
589    // are compatible.
590    if (OldEST == EST_Dynamic && NewEST == EST_Dynamic) {
591      bool Success = true;
592      // Both have a dynamic exception spec. Collect the first set, then compare
593      // to the second.
594      llvm::SmallPtrSet<CanQualType, 8> OldTypes, NewTypes;
595      for (const auto &I : Old->exceptions())
596        OldTypes.insert(S.Context.getCanonicalType(I).getUnqualifiedType());
597  
598      for (const auto &I : New->exceptions()) {
599        CanQualType TypePtr = S.Context.getCanonicalType(I).getUnqualifiedType();
600        if (OldTypes.count(TypePtr))
601          NewTypes.insert(TypePtr);
602        else {
603          Success = false;
604          break;
605        }
606      }
607  
608      if (Success && OldTypes.size() == NewTypes.size())
609        return false;
610    }
611  
612    // As a special compatibility feature, under C++0x we accept no spec and
613    // throw(std::bad_alloc) as equivalent for operator new and operator new[].
614    // This is because the implicit declaration changed, but old code would break.
615    if (S.getLangOpts().CPlusPlus11 && IsOperatorNew) {
616      const FunctionProtoType *WithExceptions = nullptr;
617      if (OldEST == EST_None && NewEST == EST_Dynamic)
618        WithExceptions = New;
619      else if (OldEST == EST_Dynamic && NewEST == EST_None)
620        WithExceptions = Old;
621      if (WithExceptions && WithExceptions->getNumExceptions() == 1) {
622        // One has no spec, the other throw(something). If that something is
623        // std::bad_alloc, all conditions are met.
624        QualType Exception = *WithExceptions->exception_begin();
625        if (CXXRecordDecl *ExRecord = Exception->getAsCXXRecordDecl()) {
626          IdentifierInfo* Name = ExRecord->getIdentifier();
627          if (Name && Name->getName() == "bad_alloc") {
628            // It's called bad_alloc, but is it in std?
629            if (ExRecord->isInStdNamespace()) {
630              return false;
631            }
632          }
633        }
634      }
635    }
636  
637    // If the caller wants to handle the case that the new function is
638    // incompatible due to a missing exception specification, let it.
639    if (MissingExceptionSpecification && OldEST != EST_None &&
640        NewEST == EST_None) {
641      // The old type has an exception specification of some sort, but
642      // the new type does not.
643      *MissingExceptionSpecification = true;
644  
645      if (MissingEmptyExceptionSpecification && OldCanThrow == CT_Cannot) {
646        // The old type has a throw() or noexcept(true) exception specification
647        // and the new type has no exception specification, and the caller asked
648        // to handle this itself.
649        *MissingEmptyExceptionSpecification = true;
650      }
651  
652      return true;
653    }
654  
655    S.Diag(NewLoc, DiagID);
656    if (NoteID.getDiagID() != 0 && OldLoc.isValid())
657      S.Diag(OldLoc, NoteID);
658    return true;
659  }
660  
661  bool Sema::CheckEquivalentExceptionSpec(const PartialDiagnostic &DiagID,
662                                          const PartialDiagnostic &NoteID,
663                                          const FunctionProtoType *Old,
664                                          SourceLocation OldLoc,
665                                          const FunctionProtoType *New,
666                                          SourceLocation NewLoc) {
667    if (!getLangOpts().CXXExceptions)
668      return false;
669    return CheckEquivalentExceptionSpecImpl(*this, DiagID, NoteID, Old, OldLoc,
670                                            New, NewLoc);
671  }
672  
673  bool Sema::handlerCanCatch(QualType HandlerType, QualType ExceptionType) {
674    // [except.handle]p3:
675    //   A handler is a match for an exception object of type E if:
676  
677    // HandlerType must be ExceptionType or derived from it, or pointer or
678    // reference to such types.
679    const ReferenceType *RefTy = HandlerType->getAs<ReferenceType>();
680    if (RefTy)
681      HandlerType = RefTy->getPointeeType();
682  
683    //   -- the handler is of type cv T or cv T& and E and T are the same type
684    if (Context.hasSameUnqualifiedType(ExceptionType, HandlerType))
685      return true;
686  
687    // FIXME: ObjC pointer types?
688    if (HandlerType->isPointerType() || HandlerType->isMemberPointerType()) {
689      if (RefTy && (!HandlerType.isConstQualified() ||
690                    HandlerType.isVolatileQualified()))
691        return false;
692  
693      // -- the handler is of type cv T or const T& where T is a pointer or
694      //    pointer to member type and E is std::nullptr_t
695      if (ExceptionType->isNullPtrType())
696        return true;
697  
698      // -- the handler is of type cv T or const T& where T is a pointer or
699      //    pointer to member type and E is a pointer or pointer to member type
700      //    that can be converted to T by one or more of
701      //    -- a qualification conversion
702      //    -- a function pointer conversion
703      bool LifetimeConv;
704      QualType Result;
705      // FIXME: Should we treat the exception as catchable if a lifetime
706      // conversion is required?
707      if (IsQualificationConversion(ExceptionType, HandlerType, false,
708                                    LifetimeConv) ||
709          IsFunctionConversion(ExceptionType, HandlerType, Result))
710        return true;
711  
712      //    -- a standard pointer conversion [...]
713      if (!ExceptionType->isPointerType() || !HandlerType->isPointerType())
714        return false;
715  
716      // Handle the "qualification conversion" portion.
717      Qualifiers EQuals, HQuals;
718      ExceptionType = Context.getUnqualifiedArrayType(
719          ExceptionType->getPointeeType(), EQuals);
720      HandlerType = Context.getUnqualifiedArrayType(
721          HandlerType->getPointeeType(), HQuals);
722      if (!HQuals.compatiblyIncludes(EQuals))
723        return false;
724  
725      if (HandlerType->isVoidType() && ExceptionType->isObjectType())
726        return true;
727  
728      // The only remaining case is a derived-to-base conversion.
729    }
730  
731    //   -- the handler is of type cg T or cv T& and T is an unambiguous public
732    //      base class of E
733    if (!ExceptionType->isRecordType() || !HandlerType->isRecordType())
734      return false;
735    CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
736                       /*DetectVirtual=*/false);
737    if (!IsDerivedFrom(SourceLocation(), ExceptionType, HandlerType, Paths) ||
738        Paths.isAmbiguous(Context.getCanonicalType(HandlerType)))
739      return false;
740  
741    // Do this check from a context without privileges.
742    switch (CheckBaseClassAccess(SourceLocation(), HandlerType, ExceptionType,
743                                 Paths.front(),
744                                 /*Diagnostic*/ 0,
745                                 /*ForceCheck*/ true,
746                                 /*ForceUnprivileged*/ true)) {
747    case AR_accessible: return true;
748    case AR_inaccessible: return false;
749    case AR_dependent:
750      llvm_unreachable("access check dependent for unprivileged context");
751    case AR_delayed:
752      llvm_unreachable("access check delayed in non-declaration");
753    }
754    llvm_unreachable("unexpected access check result");
755  }
756  
757  /// CheckExceptionSpecSubset - Check whether the second function type's
758  /// exception specification is a subset (or equivalent) of the first function
759  /// type. This is used by override and pointer assignment checks.
760  bool Sema::CheckExceptionSpecSubset(const PartialDiagnostic &DiagID,
761                                      const PartialDiagnostic &NestedDiagID,
762                                      const PartialDiagnostic &NoteID,
763                                      const PartialDiagnostic &NoThrowDiagID,
764                                      const FunctionProtoType *Superset,
765                                      SourceLocation SuperLoc,
766                                      const FunctionProtoType *Subset,
767                                      SourceLocation SubLoc) {
768  
769    // Just auto-succeed under -fno-exceptions.
770    if (!getLangOpts().CXXExceptions)
771      return false;
772  
773    // FIXME: As usual, we could be more specific in our error messages, but
774    // that better waits until we've got types with source locations.
775  
776    if (!SubLoc.isValid())
777      SubLoc = SuperLoc;
778  
779    // Resolve the exception specifications, if needed.
780    Superset = ResolveExceptionSpec(SuperLoc, Superset);
781    if (!Superset)
782      return false;
783    Subset = ResolveExceptionSpec(SubLoc, Subset);
784    if (!Subset)
785      return false;
786  
787    ExceptionSpecificationType SuperEST = Superset->getExceptionSpecType();
788    ExceptionSpecificationType SubEST = Subset->getExceptionSpecType();
789    assert(!isUnresolvedExceptionSpec(SuperEST) &&
790           !isUnresolvedExceptionSpec(SubEST) &&
791           "Shouldn't see unknown exception specifications here");
792  
793    // If there are dependent noexcept specs, assume everything is fine. Unlike
794    // with the equivalency check, this is safe in this case, because we don't
795    // want to merge declarations. Checks after instantiation will catch any
796    // omissions we make here.
797    if (SuperEST == EST_DependentNoexcept || SubEST == EST_DependentNoexcept)
798      return false;
799  
800    CanThrowResult SuperCanThrow = Superset->canThrow();
801    CanThrowResult SubCanThrow = Subset->canThrow();
802  
803    // If the superset contains everything or the subset contains nothing, we're
804    // done.
805    if ((SuperCanThrow == CT_Can && SuperEST != EST_Dynamic) ||
806        SubCanThrow == CT_Cannot)
807      return CheckParamExceptionSpec(NestedDiagID, NoteID, Superset, SuperLoc,
808                                     Subset, SubLoc);
809  
810    // Allow __declspec(nothrow) to be missing on redeclaration as an extension in
811    // some cases.
812    if (NoThrowDiagID.getDiagID() != 0 && SubCanThrow == CT_Can &&
813        SuperCanThrow == CT_Cannot && SuperEST == EST_NoThrow) {
814      Diag(SubLoc, NoThrowDiagID);
815      if (NoteID.getDiagID() != 0)
816        Diag(SuperLoc, NoteID);
817      return true;
818    }
819  
820    // If the subset contains everything or the superset contains nothing, we've
821    // failed.
822    if ((SubCanThrow == CT_Can && SubEST != EST_Dynamic) ||
823        SuperCanThrow == CT_Cannot) {
824      Diag(SubLoc, DiagID);
825      if (NoteID.getDiagID() != 0)
826        Diag(SuperLoc, NoteID);
827      return true;
828    }
829  
830    assert(SuperEST == EST_Dynamic && SubEST == EST_Dynamic &&
831           "Exception spec subset: non-dynamic case slipped through.");
832  
833    // Neither contains everything or nothing. Do a proper comparison.
834    for (QualType SubI : Subset->exceptions()) {
835      if (const ReferenceType *RefTy = SubI->getAs<ReferenceType>())
836        SubI = RefTy->getPointeeType();
837  
838      // Make sure it's in the superset.
839      bool Contained = false;
840      for (QualType SuperI : Superset->exceptions()) {
841        // [except.spec]p5:
842        //   the target entity shall allow at least the exceptions allowed by the
843        //   source
844        //
845        // We interpret this as meaning that a handler for some target type would
846        // catch an exception of each source type.
847        if (handlerCanCatch(SuperI, SubI)) {
848          Contained = true;
849          break;
850        }
851      }
852      if (!Contained) {
853        Diag(SubLoc, DiagID);
854        if (NoteID.getDiagID() != 0)
855          Diag(SuperLoc, NoteID);
856        return true;
857      }
858    }
859    // We've run half the gauntlet.
860    return CheckParamExceptionSpec(NestedDiagID, NoteID, Superset, SuperLoc,
861                                   Subset, SubLoc);
862  }
863  
864  static bool
865  CheckSpecForTypesEquivalent(Sema &S, const PartialDiagnostic &DiagID,
866                              const PartialDiagnostic &NoteID, QualType Target,
867                              SourceLocation TargetLoc, QualType Source,
868                              SourceLocation SourceLoc) {
869    const FunctionProtoType *TFunc = GetUnderlyingFunction(Target);
870    if (!TFunc)
871      return false;
872    const FunctionProtoType *SFunc = GetUnderlyingFunction(Source);
873    if (!SFunc)
874      return false;
875  
876    return S.CheckEquivalentExceptionSpec(DiagID, NoteID, TFunc, TargetLoc,
877                                          SFunc, SourceLoc);
878  }
879  
880  /// CheckParamExceptionSpec - Check if the parameter and return types of the
881  /// two functions have equivalent exception specs. This is part of the
882  /// assignment and override compatibility check. We do not check the parameters
883  /// of parameter function pointers recursively, as no sane programmer would
884  /// even be able to write such a function type.
885  bool Sema::CheckParamExceptionSpec(const PartialDiagnostic &DiagID,
886                                     const PartialDiagnostic &NoteID,
887                                     const FunctionProtoType *Target,
888                                     SourceLocation TargetLoc,
889                                     const FunctionProtoType *Source,
890                                     SourceLocation SourceLoc) {
891    auto RetDiag = DiagID;
892    RetDiag << 0;
893    if (CheckSpecForTypesEquivalent(
894            *this, RetDiag, PDiag(),
895            Target->getReturnType(), TargetLoc, Source->getReturnType(),
896            SourceLoc))
897      return true;
898  
899    // We shouldn't even be testing this unless the arguments are otherwise
900    // compatible.
901    assert(Target->getNumParams() == Source->getNumParams() &&
902           "Functions have different argument counts.");
903    for (unsigned i = 0, E = Target->getNumParams(); i != E; ++i) {
904      auto ParamDiag = DiagID;
905      ParamDiag << 1;
906      if (CheckSpecForTypesEquivalent(
907              *this, ParamDiag, PDiag(),
908              Target->getParamType(i), TargetLoc, Source->getParamType(i),
909              SourceLoc))
910        return true;
911    }
912    return false;
913  }
914  
915  bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType) {
916    // First we check for applicability.
917    // Target type must be a function, function pointer or function reference.
918    const FunctionProtoType *ToFunc = GetUnderlyingFunction(ToType);
919    if (!ToFunc || ToFunc->hasDependentExceptionSpec())
920      return false;
921  
922    // SourceType must be a function or function pointer.
923    const FunctionProtoType *FromFunc = GetUnderlyingFunction(From->getType());
924    if (!FromFunc || FromFunc->hasDependentExceptionSpec())
925      return false;
926  
927    unsigned DiagID = diag::err_incompatible_exception_specs;
928    unsigned NestedDiagID = diag::err_deep_exception_specs_differ;
929    // This is not an error in C++17 onwards, unless the noexceptness doesn't
930    // match, but in that case we have a full-on type mismatch, not just a
931    // type sugar mismatch.
932    if (getLangOpts().CPlusPlus17) {
933      DiagID = diag::warn_incompatible_exception_specs;
934      NestedDiagID = diag::warn_deep_exception_specs_differ;
935    }
936  
937    // Now we've got the correct types on both sides, check their compatibility.
938    // This means that the source of the conversion can only throw a subset of
939    // the exceptions of the target, and any exception specs on arguments or
940    // return types must be equivalent.
941    //
942    // FIXME: If there is a nested dependent exception specification, we should
943    // not be checking it here. This is fine:
944    //   template<typename T> void f() {
945    //     void (*p)(void (*) throw(T));
946    //     void (*q)(void (*) throw(int)) = p;
947    //   }
948    // ... because it might be instantiated with T=int.
949    return CheckExceptionSpecSubset(
950               PDiag(DiagID), PDiag(NestedDiagID), PDiag(), PDiag(), ToFunc,
951               From->getSourceRange().getBegin(), FromFunc, SourceLocation()) &&
952           !getLangOpts().CPlusPlus17;
953  }
954  
955  bool Sema::CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New,
956                                                  const CXXMethodDecl *Old) {
957    // If the new exception specification hasn't been parsed yet, skip the check.
958    // We'll get called again once it's been parsed.
959    if (New->getType()->castAs<FunctionProtoType>()->getExceptionSpecType() ==
960        EST_Unparsed)
961      return false;
962  
963    // Don't check uninstantiated template destructors at all. We can only
964    // synthesize correct specs after the template is instantiated.
965    if (isa<CXXDestructorDecl>(New) && New->getParent()->isDependentType())
966      return false;
967  
968    // If the old exception specification hasn't been parsed yet, or the new
969    // exception specification can't be computed yet, remember that we need to
970    // perform this check when we get to the end of the outermost
971    // lexically-surrounding class.
972    if (exceptionSpecNotKnownYet(Old) || exceptionSpecNotKnownYet(New)) {
973      DelayedOverridingExceptionSpecChecks.push_back({New, Old});
974      return false;
975    }
976  
977    unsigned DiagID = diag::err_override_exception_spec;
978    if (getLangOpts().MSVCCompat)
979      DiagID = diag::ext_override_exception_spec;
980    return CheckExceptionSpecSubset(PDiag(DiagID),
981                                    PDiag(diag::err_deep_exception_specs_differ),
982                                    PDiag(diag::note_overridden_virtual_function),
983                                    PDiag(diag::ext_override_exception_spec),
984                                    Old->getType()->castAs<FunctionProtoType>(),
985                                    Old->getLocation(),
986                                    New->getType()->castAs<FunctionProtoType>(),
987                                    New->getLocation());
988  }
989  
990  static CanThrowResult canSubStmtsThrow(Sema &Self, const Stmt *S) {
991    CanThrowResult R = CT_Cannot;
992    for (const Stmt *SubStmt : S->children()) {
993      if (!SubStmt)
994        continue;
995      R = mergeCanThrow(R, Self.canThrow(SubStmt));
996      if (R == CT_Can)
997        break;
998    }
999    return R;
1000  }
1001  
1002  CanThrowResult Sema::canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
1003                                      SourceLocation Loc) {
1004    // As an extension, we assume that __attribute__((nothrow)) functions don't
1005    // throw.
1006    if (D && isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>())
1007      return CT_Cannot;
1008  
1009    QualType T;
1010  
1011    // In C++1z, just look at the function type of the callee.
1012    if (S.getLangOpts().CPlusPlus17 && E && isa<CallExpr>(E)) {
1013      E = cast<CallExpr>(E)->getCallee();
1014      T = E->getType();
1015      if (T->isSpecificPlaceholderType(BuiltinType::BoundMember)) {
1016        // Sadly we don't preserve the actual type as part of the "bound member"
1017        // placeholder, so we need to reconstruct it.
1018        E = E->IgnoreParenImpCasts();
1019  
1020        // Could be a call to a pointer-to-member or a plain member access.
1021        if (auto *Op = dyn_cast<BinaryOperator>(E)) {
1022          assert(Op->getOpcode() == BO_PtrMemD || Op->getOpcode() == BO_PtrMemI);
1023          T = Op->getRHS()->getType()
1024                ->castAs<MemberPointerType>()->getPointeeType();
1025        } else {
1026          T = cast<MemberExpr>(E)->getMemberDecl()->getType();
1027        }
1028      }
1029    } else if (const ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D))
1030      T = VD->getType();
1031    else
1032      // If we have no clue what we're calling, assume the worst.
1033      return CT_Can;
1034  
1035    const FunctionProtoType *FT;
1036    if ((FT = T->getAs<FunctionProtoType>())) {
1037    } else if (const PointerType *PT = T->getAs<PointerType>())
1038      FT = PT->getPointeeType()->getAs<FunctionProtoType>();
1039    else if (const ReferenceType *RT = T->getAs<ReferenceType>())
1040      FT = RT->getPointeeType()->getAs<FunctionProtoType>();
1041    else if (const MemberPointerType *MT = T->getAs<MemberPointerType>())
1042      FT = MT->getPointeeType()->getAs<FunctionProtoType>();
1043    else if (const BlockPointerType *BT = T->getAs<BlockPointerType>())
1044      FT = BT->getPointeeType()->getAs<FunctionProtoType>();
1045  
1046    if (!FT)
1047      return CT_Can;
1048  
1049    if (Loc.isValid() || (Loc.isInvalid() && E))
1050      FT = S.ResolveExceptionSpec(Loc.isInvalid() ? E->getBeginLoc() : Loc, FT);
1051    if (!FT)
1052      return CT_Can;
1053  
1054    return FT->canThrow();
1055  }
1056  
1057  static CanThrowResult canVarDeclThrow(Sema &Self, const VarDecl *VD) {
1058    CanThrowResult CT = CT_Cannot;
1059  
1060    // Initialization might throw.
1061    if (!VD->isUsableInConstantExpressions(Self.Context))
1062      if (const Expr *Init = VD->getInit())
1063        CT = mergeCanThrow(CT, Self.canThrow(Init));
1064  
1065    // Destructor might throw.
1066    if (VD->needsDestruction(Self.Context) == QualType::DK_cxx_destructor) {
1067      if (auto *RD =
1068              VD->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl()) {
1069        if (auto *Dtor = RD->getDestructor()) {
1070          CT = mergeCanThrow(
1071              CT, Sema::canCalleeThrow(Self, nullptr, Dtor, VD->getLocation()));
1072        }
1073      }
1074    }
1075  
1076    // If this is a decomposition declaration, bindings might throw.
1077    if (auto *DD = dyn_cast<DecompositionDecl>(VD))
1078      for (auto *B : DD->bindings())
1079        if (auto *HD = B->getHoldingVar())
1080          CT = mergeCanThrow(CT, canVarDeclThrow(Self, HD));
1081  
1082    return CT;
1083  }
1084  
1085  static CanThrowResult canDynamicCastThrow(const CXXDynamicCastExpr *DC) {
1086    if (DC->isTypeDependent())
1087      return CT_Dependent;
1088  
1089    if (!DC->getTypeAsWritten()->isReferenceType())
1090      return CT_Cannot;
1091  
1092    if (DC->getSubExpr()->isTypeDependent())
1093      return CT_Dependent;
1094  
1095    return DC->getCastKind() == clang::CK_Dynamic? CT_Can : CT_Cannot;
1096  }
1097  
1098  static CanThrowResult canTypeidThrow(Sema &S, const CXXTypeidExpr *DC) {
1099    if (DC->isTypeOperand())
1100      return CT_Cannot;
1101  
1102    Expr *Op = DC->getExprOperand();
1103    if (Op->isTypeDependent())
1104      return CT_Dependent;
1105  
1106    const RecordType *RT = Op->getType()->getAs<RecordType>();
1107    if (!RT)
1108      return CT_Cannot;
1109  
1110    if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic())
1111      return CT_Cannot;
1112  
1113    if (Op->Classify(S.Context).isPRValue())
1114      return CT_Cannot;
1115  
1116    return CT_Can;
1117  }
1118  
1119  CanThrowResult Sema::canThrow(const Stmt *S) {
1120    // C++ [expr.unary.noexcept]p3:
1121    //   [Can throw] if in a potentially-evaluated context the expression would
1122    //   contain:
1123    switch (S->getStmtClass()) {
1124    case Expr::ConstantExprClass:
1125      return canThrow(cast<ConstantExpr>(S)->getSubExpr());
1126  
1127    case Expr::CXXThrowExprClass:
1128      //   - a potentially evaluated throw-expression
1129      return CT_Can;
1130  
1131    case Expr::CXXDynamicCastExprClass: {
1132      //   - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1133      //     where T is a reference type, that requires a run-time check
1134      auto *CE = cast<CXXDynamicCastExpr>(S);
1135      // FIXME: Properly determine whether a variably-modified type can throw.
1136      if (CE->getType()->isVariablyModifiedType())
1137        return CT_Can;
1138      CanThrowResult CT = canDynamicCastThrow(CE);
1139      if (CT == CT_Can)
1140        return CT;
1141      return mergeCanThrow(CT, canSubStmtsThrow(*this, CE));
1142    }
1143  
1144    case Expr::CXXTypeidExprClass:
1145      //   - a potentially evaluated typeid expression applied to a glvalue
1146      //     expression whose type is a polymorphic class type
1147      return canTypeidThrow(*this, cast<CXXTypeidExpr>(S));
1148  
1149      //   - a potentially evaluated call to a function, member function, function
1150      //     pointer, or member function pointer that does not have a non-throwing
1151      //     exception-specification
1152    case Expr::CallExprClass:
1153    case Expr::CXXMemberCallExprClass:
1154    case Expr::CXXOperatorCallExprClass:
1155    case Expr::UserDefinedLiteralClass: {
1156      const CallExpr *CE = cast<CallExpr>(S);
1157      CanThrowResult CT;
1158      if (CE->isTypeDependent())
1159        CT = CT_Dependent;
1160      else if (isa<CXXPseudoDestructorExpr>(CE->getCallee()->IgnoreParens()))
1161        CT = CT_Cannot;
1162      else
1163        CT = canCalleeThrow(*this, CE, CE->getCalleeDecl());
1164      if (CT == CT_Can)
1165        return CT;
1166      return mergeCanThrow(CT, canSubStmtsThrow(*this, CE));
1167    }
1168  
1169    case Expr::CXXConstructExprClass:
1170    case Expr::CXXTemporaryObjectExprClass: {
1171      auto *CE = cast<CXXConstructExpr>(S);
1172      // FIXME: Properly determine whether a variably-modified type can throw.
1173      if (CE->getType()->isVariablyModifiedType())
1174        return CT_Can;
1175      CanThrowResult CT = canCalleeThrow(*this, CE, CE->getConstructor());
1176      if (CT == CT_Can)
1177        return CT;
1178      return mergeCanThrow(CT, canSubStmtsThrow(*this, CE));
1179    }
1180  
1181    case Expr::CXXInheritedCtorInitExprClass: {
1182      auto *ICIE = cast<CXXInheritedCtorInitExpr>(S);
1183      return canCalleeThrow(*this, ICIE, ICIE->getConstructor());
1184    }
1185  
1186    case Expr::LambdaExprClass: {
1187      const LambdaExpr *Lambda = cast<LambdaExpr>(S);
1188      CanThrowResult CT = CT_Cannot;
1189      for (LambdaExpr::const_capture_init_iterator
1190               Cap = Lambda->capture_init_begin(),
1191               CapEnd = Lambda->capture_init_end();
1192           Cap != CapEnd; ++Cap)
1193        CT = mergeCanThrow(CT, canThrow(*Cap));
1194      return CT;
1195    }
1196  
1197    case Expr::CXXNewExprClass: {
1198      auto *NE = cast<CXXNewExpr>(S);
1199      CanThrowResult CT;
1200      if (NE->isTypeDependent())
1201        CT = CT_Dependent;
1202      else
1203        CT = canCalleeThrow(*this, NE, NE->getOperatorNew());
1204      if (CT == CT_Can)
1205        return CT;
1206      return mergeCanThrow(CT, canSubStmtsThrow(*this, NE));
1207    }
1208  
1209    case Expr::CXXDeleteExprClass: {
1210      auto *DE = cast<CXXDeleteExpr>(S);
1211      CanThrowResult CT;
1212      QualType DTy = DE->getDestroyedType();
1213      if (DTy.isNull() || DTy->isDependentType()) {
1214        CT = CT_Dependent;
1215      } else {
1216        CT = canCalleeThrow(*this, DE, DE->getOperatorDelete());
1217        if (const RecordType *RT = DTy->getAs<RecordType>()) {
1218          const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
1219          const CXXDestructorDecl *DD = RD->getDestructor();
1220          if (DD)
1221            CT = mergeCanThrow(CT, canCalleeThrow(*this, DE, DD));
1222        }
1223        if (CT == CT_Can)
1224          return CT;
1225      }
1226      return mergeCanThrow(CT, canSubStmtsThrow(*this, DE));
1227    }
1228  
1229    case Expr::CXXBindTemporaryExprClass: {
1230      auto *BTE = cast<CXXBindTemporaryExpr>(S);
1231      // The bound temporary has to be destroyed again, which might throw.
1232      CanThrowResult CT =
1233          canCalleeThrow(*this, BTE, BTE->getTemporary()->getDestructor());
1234      if (CT == CT_Can)
1235        return CT;
1236      return mergeCanThrow(CT, canSubStmtsThrow(*this, BTE));
1237    }
1238  
1239    case Expr::PseudoObjectExprClass: {
1240      auto *POE = cast<PseudoObjectExpr>(S);
1241      CanThrowResult CT = CT_Cannot;
1242      for (const Expr *E : POE->semantics()) {
1243        CT = mergeCanThrow(CT, canThrow(E));
1244        if (CT == CT_Can)
1245          break;
1246      }
1247      return CT;
1248    }
1249  
1250      // ObjC message sends are like function calls, but never have exception
1251      // specs.
1252    case Expr::ObjCMessageExprClass:
1253    case Expr::ObjCPropertyRefExprClass:
1254    case Expr::ObjCSubscriptRefExprClass:
1255      return CT_Can;
1256  
1257      // All the ObjC literals that are implemented as calls are
1258      // potentially throwing unless we decide to close off that
1259      // possibility.
1260    case Expr::ObjCArrayLiteralClass:
1261    case Expr::ObjCDictionaryLiteralClass:
1262    case Expr::ObjCBoxedExprClass:
1263      return CT_Can;
1264  
1265      // Many other things have subexpressions, so we have to test those.
1266      // Some are simple:
1267    case Expr::CoawaitExprClass:
1268    case Expr::ConditionalOperatorClass:
1269    case Expr::CoyieldExprClass:
1270    case Expr::CXXRewrittenBinaryOperatorClass:
1271    case Expr::CXXStdInitializerListExprClass:
1272    case Expr::DesignatedInitExprClass:
1273    case Expr::DesignatedInitUpdateExprClass:
1274    case Expr::ExprWithCleanupsClass:
1275    case Expr::ExtVectorElementExprClass:
1276    case Expr::InitListExprClass:
1277    case Expr::ArrayInitLoopExprClass:
1278    case Expr::MemberExprClass:
1279    case Expr::ObjCIsaExprClass:
1280    case Expr::ObjCIvarRefExprClass:
1281    case Expr::ParenExprClass:
1282    case Expr::ParenListExprClass:
1283    case Expr::ShuffleVectorExprClass:
1284    case Expr::StmtExprClass:
1285    case Expr::ConvertVectorExprClass:
1286    case Expr::VAArgExprClass:
1287      return canSubStmtsThrow(*this, S);
1288  
1289    case Expr::CompoundLiteralExprClass:
1290    case Expr::CXXConstCastExprClass:
1291    case Expr::CXXAddrspaceCastExprClass:
1292    case Expr::CXXReinterpretCastExprClass:
1293    case Expr::BuiltinBitCastExprClass:
1294        // FIXME: Properly determine whether a variably-modified type can throw.
1295      if (cast<Expr>(S)->getType()->isVariablyModifiedType())
1296        return CT_Can;
1297      return canSubStmtsThrow(*this, S);
1298  
1299      // Some might be dependent for other reasons.
1300    case Expr::ArraySubscriptExprClass:
1301    case Expr::MatrixSubscriptExprClass:
1302    case Expr::OMPArraySectionExprClass:
1303    case Expr::OMPArrayShapingExprClass:
1304    case Expr::OMPIteratorExprClass:
1305    case Expr::BinaryOperatorClass:
1306    case Expr::DependentCoawaitExprClass:
1307    case Expr::CompoundAssignOperatorClass:
1308    case Expr::CStyleCastExprClass:
1309    case Expr::CXXStaticCastExprClass:
1310    case Expr::CXXFunctionalCastExprClass:
1311    case Expr::ImplicitCastExprClass:
1312    case Expr::MaterializeTemporaryExprClass:
1313    case Expr::UnaryOperatorClass: {
1314      // FIXME: Properly determine whether a variably-modified type can throw.
1315      if (auto *CE = dyn_cast<CastExpr>(S))
1316        if (CE->getType()->isVariablyModifiedType())
1317          return CT_Can;
1318      CanThrowResult CT =
1319          cast<Expr>(S)->isTypeDependent() ? CT_Dependent : CT_Cannot;
1320      return mergeCanThrow(CT, canSubStmtsThrow(*this, S));
1321    }
1322  
1323    case Expr::CXXDefaultArgExprClass:
1324      return canThrow(cast<CXXDefaultArgExpr>(S)->getExpr());
1325  
1326    case Expr::CXXDefaultInitExprClass:
1327      return canThrow(cast<CXXDefaultInitExpr>(S)->getExpr());
1328  
1329    case Expr::ChooseExprClass: {
1330      auto *CE = cast<ChooseExpr>(S);
1331      if (CE->isTypeDependent() || CE->isValueDependent())
1332        return CT_Dependent;
1333      return canThrow(CE->getChosenSubExpr());
1334    }
1335  
1336    case Expr::GenericSelectionExprClass:
1337      if (cast<GenericSelectionExpr>(S)->isResultDependent())
1338        return CT_Dependent;
1339      return canThrow(cast<GenericSelectionExpr>(S)->getResultExpr());
1340  
1341      // Some expressions are always dependent.
1342    case Expr::CXXDependentScopeMemberExprClass:
1343    case Expr::CXXUnresolvedConstructExprClass:
1344    case Expr::DependentScopeDeclRefExprClass:
1345    case Expr::CXXFoldExprClass:
1346    case Expr::RecoveryExprClass:
1347      return CT_Dependent;
1348  
1349    case Expr::AsTypeExprClass:
1350    case Expr::BinaryConditionalOperatorClass:
1351    case Expr::BlockExprClass:
1352    case Expr::CUDAKernelCallExprClass:
1353    case Expr::DeclRefExprClass:
1354    case Expr::ObjCBridgedCastExprClass:
1355    case Expr::ObjCIndirectCopyRestoreExprClass:
1356    case Expr::ObjCProtocolExprClass:
1357    case Expr::ObjCSelectorExprClass:
1358    case Expr::ObjCAvailabilityCheckExprClass:
1359    case Expr::OffsetOfExprClass:
1360    case Expr::PackExpansionExprClass:
1361    case Expr::SubstNonTypeTemplateParmExprClass:
1362    case Expr::SubstNonTypeTemplateParmPackExprClass:
1363    case Expr::FunctionParmPackExprClass:
1364    case Expr::UnaryExprOrTypeTraitExprClass:
1365    case Expr::UnresolvedLookupExprClass:
1366    case Expr::UnresolvedMemberExprClass:
1367    case Expr::TypoExprClass:
1368      // FIXME: Many of the above can throw.
1369      return CT_Cannot;
1370  
1371    case Expr::AddrLabelExprClass:
1372    case Expr::ArrayTypeTraitExprClass:
1373    case Expr::AtomicExprClass:
1374    case Expr::TypeTraitExprClass:
1375    case Expr::CXXBoolLiteralExprClass:
1376    case Expr::CXXNoexceptExprClass:
1377    case Expr::CXXNullPtrLiteralExprClass:
1378    case Expr::CXXPseudoDestructorExprClass:
1379    case Expr::CXXScalarValueInitExprClass:
1380    case Expr::CXXThisExprClass:
1381    case Expr::CXXUuidofExprClass:
1382    case Expr::CharacterLiteralClass:
1383    case Expr::ExpressionTraitExprClass:
1384    case Expr::FloatingLiteralClass:
1385    case Expr::GNUNullExprClass:
1386    case Expr::ImaginaryLiteralClass:
1387    case Expr::ImplicitValueInitExprClass:
1388    case Expr::IntegerLiteralClass:
1389    case Expr::FixedPointLiteralClass:
1390    case Expr::ArrayInitIndexExprClass:
1391    case Expr::NoInitExprClass:
1392    case Expr::ObjCEncodeExprClass:
1393    case Expr::ObjCStringLiteralClass:
1394    case Expr::ObjCBoolLiteralExprClass:
1395    case Expr::OpaqueValueExprClass:
1396    case Expr::PredefinedExprClass:
1397    case Expr::SizeOfPackExprClass:
1398    case Expr::StringLiteralClass:
1399    case Expr::SourceLocExprClass:
1400    case Expr::ConceptSpecializationExprClass:
1401    case Expr::RequiresExprClass:
1402      // These expressions can never throw.
1403      return CT_Cannot;
1404  
1405    case Expr::MSPropertyRefExprClass:
1406    case Expr::MSPropertySubscriptExprClass:
1407      llvm_unreachable("Invalid class for expression");
1408  
1409      // Most statements can throw if any substatement can throw.
1410    case Stmt::AttributedStmtClass:
1411    case Stmt::BreakStmtClass:
1412    case Stmt::CapturedStmtClass:
1413    case Stmt::CaseStmtClass:
1414    case Stmt::CompoundStmtClass:
1415    case Stmt::ContinueStmtClass:
1416    case Stmt::CoreturnStmtClass:
1417    case Stmt::CoroutineBodyStmtClass:
1418    case Stmt::CXXCatchStmtClass:
1419    case Stmt::CXXForRangeStmtClass:
1420    case Stmt::DefaultStmtClass:
1421    case Stmt::DoStmtClass:
1422    case Stmt::ForStmtClass:
1423    case Stmt::GCCAsmStmtClass:
1424    case Stmt::GotoStmtClass:
1425    case Stmt::IndirectGotoStmtClass:
1426    case Stmt::LabelStmtClass:
1427    case Stmt::MSAsmStmtClass:
1428    case Stmt::MSDependentExistsStmtClass:
1429    case Stmt::NullStmtClass:
1430    case Stmt::ObjCAtCatchStmtClass:
1431    case Stmt::ObjCAtFinallyStmtClass:
1432    case Stmt::ObjCAtSynchronizedStmtClass:
1433    case Stmt::ObjCAutoreleasePoolStmtClass:
1434    case Stmt::ObjCForCollectionStmtClass:
1435    case Stmt::OMPAtomicDirectiveClass:
1436    case Stmt::OMPBarrierDirectiveClass:
1437    case Stmt::OMPCancelDirectiveClass:
1438    case Stmt::OMPCancellationPointDirectiveClass:
1439    case Stmt::OMPCriticalDirectiveClass:
1440    case Stmt::OMPDistributeDirectiveClass:
1441    case Stmt::OMPDistributeParallelForDirectiveClass:
1442    case Stmt::OMPDistributeParallelForSimdDirectiveClass:
1443    case Stmt::OMPDistributeSimdDirectiveClass:
1444    case Stmt::OMPFlushDirectiveClass:
1445    case Stmt::OMPDepobjDirectiveClass:
1446    case Stmt::OMPScanDirectiveClass:
1447    case Stmt::OMPForDirectiveClass:
1448    case Stmt::OMPForSimdDirectiveClass:
1449    case Stmt::OMPMasterDirectiveClass:
1450    case Stmt::OMPMasterTaskLoopDirectiveClass:
1451    case Stmt::OMPMasterTaskLoopSimdDirectiveClass:
1452    case Stmt::OMPOrderedDirectiveClass:
1453    case Stmt::OMPCanonicalLoopClass:
1454    case Stmt::OMPParallelDirectiveClass:
1455    case Stmt::OMPParallelForDirectiveClass:
1456    case Stmt::OMPParallelForSimdDirectiveClass:
1457    case Stmt::OMPParallelMasterDirectiveClass:
1458    case Stmt::OMPParallelMasterTaskLoopDirectiveClass:
1459    case Stmt::OMPParallelMasterTaskLoopSimdDirectiveClass:
1460    case Stmt::OMPParallelSectionsDirectiveClass:
1461    case Stmt::OMPSectionDirectiveClass:
1462    case Stmt::OMPSectionsDirectiveClass:
1463    case Stmt::OMPSimdDirectiveClass:
1464    case Stmt::OMPTileDirectiveClass:
1465    case Stmt::OMPUnrollDirectiveClass:
1466    case Stmt::OMPSingleDirectiveClass:
1467    case Stmt::OMPTargetDataDirectiveClass:
1468    case Stmt::OMPTargetDirectiveClass:
1469    case Stmt::OMPTargetEnterDataDirectiveClass:
1470    case Stmt::OMPTargetExitDataDirectiveClass:
1471    case Stmt::OMPTargetParallelDirectiveClass:
1472    case Stmt::OMPTargetParallelForDirectiveClass:
1473    case Stmt::OMPTargetParallelForSimdDirectiveClass:
1474    case Stmt::OMPTargetSimdDirectiveClass:
1475    case Stmt::OMPTargetTeamsDirectiveClass:
1476    case Stmt::OMPTargetTeamsDistributeDirectiveClass:
1477    case Stmt::OMPTargetTeamsDistributeParallelForDirectiveClass:
1478    case Stmt::OMPTargetTeamsDistributeParallelForSimdDirectiveClass:
1479    case Stmt::OMPTargetTeamsDistributeSimdDirectiveClass:
1480    case Stmt::OMPTargetUpdateDirectiveClass:
1481    case Stmt::OMPTaskDirectiveClass:
1482    case Stmt::OMPTaskgroupDirectiveClass:
1483    case Stmt::OMPTaskLoopDirectiveClass:
1484    case Stmt::OMPTaskLoopSimdDirectiveClass:
1485    case Stmt::OMPTaskwaitDirectiveClass:
1486    case Stmt::OMPTaskyieldDirectiveClass:
1487    case Stmt::OMPTeamsDirectiveClass:
1488    case Stmt::OMPTeamsDistributeDirectiveClass:
1489    case Stmt::OMPTeamsDistributeParallelForDirectiveClass:
1490    case Stmt::OMPTeamsDistributeParallelForSimdDirectiveClass:
1491    case Stmt::OMPTeamsDistributeSimdDirectiveClass:
1492    case Stmt::OMPInteropDirectiveClass:
1493    case Stmt::OMPDispatchDirectiveClass:
1494    case Stmt::OMPMaskedDirectiveClass:
1495    case Stmt::ReturnStmtClass:
1496    case Stmt::SEHExceptStmtClass:
1497    case Stmt::SEHFinallyStmtClass:
1498    case Stmt::SEHLeaveStmtClass:
1499    case Stmt::SEHTryStmtClass:
1500    case Stmt::SwitchStmtClass:
1501    case Stmt::WhileStmtClass:
1502      return canSubStmtsThrow(*this, S);
1503  
1504    case Stmt::DeclStmtClass: {
1505      CanThrowResult CT = CT_Cannot;
1506      for (const Decl *D : cast<DeclStmt>(S)->decls()) {
1507        if (auto *VD = dyn_cast<VarDecl>(D))
1508          CT = mergeCanThrow(CT, canVarDeclThrow(*this, VD));
1509  
1510        // FIXME: Properly determine whether a variably-modified type can throw.
1511        if (auto *TND = dyn_cast<TypedefNameDecl>(D))
1512          if (TND->getUnderlyingType()->isVariablyModifiedType())
1513            return CT_Can;
1514        if (auto *VD = dyn_cast<ValueDecl>(D))
1515          if (VD->getType()->isVariablyModifiedType())
1516            return CT_Can;
1517      }
1518      return CT;
1519    }
1520  
1521    case Stmt::IfStmtClass: {
1522      auto *IS = cast<IfStmt>(S);
1523      CanThrowResult CT = CT_Cannot;
1524      if (const Stmt *Init = IS->getInit())
1525        CT = mergeCanThrow(CT, canThrow(Init));
1526      if (const Stmt *CondDS = IS->getConditionVariableDeclStmt())
1527        CT = mergeCanThrow(CT, canThrow(CondDS));
1528      CT = mergeCanThrow(CT, canThrow(IS->getCond()));
1529  
1530      // For 'if constexpr', consider only the non-discarded case.
1531      // FIXME: We should add a DiscardedStmt marker to the AST.
1532      if (Optional<const Stmt *> Case = IS->getNondiscardedCase(Context))
1533        return *Case ? mergeCanThrow(CT, canThrow(*Case)) : CT;
1534  
1535      CanThrowResult Then = canThrow(IS->getThen());
1536      CanThrowResult Else = IS->getElse() ? canThrow(IS->getElse()) : CT_Cannot;
1537      if (Then == Else)
1538        return mergeCanThrow(CT, Then);
1539  
1540      // For a dependent 'if constexpr', the result is dependent if it depends on
1541      // the value of the condition.
1542      return mergeCanThrow(CT, IS->isConstexpr() ? CT_Dependent
1543                                                 : mergeCanThrow(Then, Else));
1544    }
1545  
1546    case Stmt::CXXTryStmtClass: {
1547      auto *TS = cast<CXXTryStmt>(S);
1548      // try /*...*/ catch (...) { H } can throw only if H can throw.
1549      // Any other try-catch can throw if any substatement can throw.
1550      const CXXCatchStmt *FinalHandler = TS->getHandler(TS->getNumHandlers() - 1);
1551      if (!FinalHandler->getExceptionDecl())
1552        return canThrow(FinalHandler->getHandlerBlock());
1553      return canSubStmtsThrow(*this, S);
1554    }
1555  
1556    case Stmt::ObjCAtThrowStmtClass:
1557      return CT_Can;
1558  
1559    case Stmt::ObjCAtTryStmtClass: {
1560      auto *TS = cast<ObjCAtTryStmt>(S);
1561  
1562      // @catch(...) need not be last in Objective-C. Walk backwards until we
1563      // see one or hit the @try.
1564      CanThrowResult CT = CT_Cannot;
1565      if (const Stmt *Finally = TS->getFinallyStmt())
1566        CT = mergeCanThrow(CT, canThrow(Finally));
1567      for (unsigned I = TS->getNumCatchStmts(); I != 0; --I) {
1568        const ObjCAtCatchStmt *Catch = TS->getCatchStmt(I - 1);
1569        CT = mergeCanThrow(CT, canThrow(Catch));
1570        // If we reach a @catch(...), no earlier exceptions can escape.
1571        if (Catch->hasEllipsis())
1572          return CT;
1573      }
1574  
1575      // Didn't find an @catch(...). Exceptions from the @try body can escape.
1576      return mergeCanThrow(CT, canThrow(TS->getTryBody()));
1577    }
1578  
1579    case Stmt::SYCLUniqueStableNameExprClass:
1580      return CT_Cannot;
1581    case Stmt::NoStmtClass:
1582      llvm_unreachable("Invalid class for statement");
1583    }
1584    llvm_unreachable("Bogus StmtClass");
1585  }
1586  
1587  } // end namespace clang
1588