1221339Sdim//===--- ExceptionSpecificationType.h ---------------------------*- C++ -*-===//
2221339Sdim//
3221339Sdim//                     The LLVM Compiler Infrastructure
4221339Sdim//
5221339Sdim// This file is distributed under the University of Illinois Open Source
6221339Sdim// License. See LICENSE.TXT for details.
7221339Sdim//
8221339Sdim//===----------------------------------------------------------------------===//
9239462Sdim///
10239462Sdim/// \file
11239462Sdim/// \brief Defines the ExceptionSpecificationType enumeration and various
12239462Sdim/// utility functions.
13239462Sdim///
14221339Sdim//===----------------------------------------------------------------------===//
15221339Sdim#ifndef LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H
16221339Sdim#define LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H
17221339Sdim
18221339Sdimnamespace clang {
19221339Sdim
20234982Sdim/// \brief The various types of exception specifications that exist in C++11.
21221339Sdimenum ExceptionSpecificationType {
22223017Sdim  EST_None,             ///< no exception specification
23223017Sdim  EST_DynamicNone,      ///< throw()
24223017Sdim  EST_Dynamic,          ///< throw(T1, T2)
25223017Sdim  EST_MSAny,            ///< Microsoft throw(...) extension
26223017Sdim  EST_BasicNoexcept,    ///< noexcept
27223017Sdim  EST_ComputedNoexcept, ///< noexcept(expression)
28239462Sdim  EST_Unevaluated,      ///< not evaluated yet, for special member function
29234982Sdim  EST_Uninstantiated    ///< not instantiated yet
30221339Sdim};
31221339Sdim
32221339Sdiminline bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType) {
33221339Sdim  return ESpecType >= EST_DynamicNone && ESpecType <= EST_MSAny;
34221339Sdim}
35221339Sdim
36221339Sdiminline bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType) {
37221339Sdim  return ESpecType == EST_BasicNoexcept || ESpecType == EST_ComputedNoexcept;
38221339Sdim}
39221339Sdim
40239462Sdiminline bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType) {
41239462Sdim  return ESpecType == EST_Unevaluated || ESpecType == EST_Uninstantiated;
42239462Sdim}
43239462Sdim
44234982Sdim/// \brief Possible results from evaluation of a noexcept expression.
45234982Sdimenum CanThrowResult {
46234982Sdim  CT_Cannot,
47234982Sdim  CT_Dependent,
48234982Sdim  CT_Can
49234982Sdim};
50234982Sdim
51234982Sdiminline CanThrowResult mergeCanThrow(CanThrowResult CT1, CanThrowResult CT2) {
52234982Sdim  // CanThrowResult constants are ordered so that the maximum is the correct
53234982Sdim  // merge result.
54234982Sdim  return CT1 > CT2 ? CT1 : CT2;
55234982Sdim}
56234982Sdim
57221339Sdim} // end namespace clang
58221339Sdim
59221339Sdim#endif // LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H
60