1 //===--- ExceptionSpecificationType.h ---------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// \brief Defines the ExceptionSpecificationType enumeration and various 12 /// utility functions. 13 /// 14 //===----------------------------------------------------------------------===// 15 #ifndef LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H 16 #define LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H 17 18 namespace clang { 19 20 /// \brief The various types of exception specifications that exist in C++11. 21 enum ExceptionSpecificationType { 22 EST_None, ///< no exception specification 23 EST_DynamicNone, ///< throw() 24 EST_Dynamic, ///< throw(T1, T2) 25 EST_MSAny, ///< Microsoft throw(...) extension 26 EST_BasicNoexcept, ///< noexcept 27 EST_ComputedNoexcept, ///< noexcept(expression) 28 EST_Unevaluated, ///< not evaluated yet, for special member function 29 EST_Uninstantiated, ///< not instantiated yet 30 EST_Unparsed ///< not parsed yet 31 }; 32 33 inline bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType) { 34 return ESpecType >= EST_DynamicNone && ESpecType <= EST_MSAny; 35 } 36 37 inline bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType) { 38 return ESpecType == EST_BasicNoexcept || ESpecType == EST_ComputedNoexcept; 39 } 40 41 inline bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType) { 42 return ESpecType == EST_Unevaluated || ESpecType == EST_Uninstantiated; 43 } 44 45 /// \brief Possible results from evaluation of a noexcept expression. 46 enum CanThrowResult { 47 CT_Cannot, 48 CT_Dependent, 49 CT_Can 50 }; 51 52 inline CanThrowResult mergeCanThrow(CanThrowResult CT1, CanThrowResult CT2) { 53 // CanThrowResult constants are ordered so that the maximum is the correct 54 // merge result. 55 return CT1 > CT2 ? CT1 : CT2; 56 } 57 58 } // end namespace clang 59 60 #endif // LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H 61