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