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