18b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl//===--- ExceptionSpecificationType.h ---------------------------*- C++ -*-===// 28b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// 38b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// The LLVM Compiler Infrastructure 48b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// 58b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// This file is distributed under the University of Illinois Open Source 68b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// License. See LICENSE.TXT for details. 78b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// 88b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl//===----------------------------------------------------------------------===// 98b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// 108b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// This file defines the ExceptionSpecificationType enumeration and various 118b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// utility functions. 128b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl// 138b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl//===----------------------------------------------------------------------===// 148b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl#ifndef LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H 158b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl#define LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H 168b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl 178b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redlnamespace clang { 188b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl 19e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith/// \brief The various types of exception specifications that exist in C++11. 208b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redlenum ExceptionSpecificationType { 217a614d8380297fcd2bc23986241905d97222948cRichard Smith EST_None, ///< no exception specification 227a614d8380297fcd2bc23986241905d97222948cRichard Smith EST_DynamicNone, ///< throw() 237a614d8380297fcd2bc23986241905d97222948cRichard Smith EST_Dynamic, ///< throw(T1, T2) 247a614d8380297fcd2bc23986241905d97222948cRichard Smith EST_MSAny, ///< Microsoft throw(...) extension 257a614d8380297fcd2bc23986241905d97222948cRichard Smith EST_BasicNoexcept, ///< noexcept 267a614d8380297fcd2bc23986241905d97222948cRichard Smith EST_ComputedNoexcept, ///< noexcept(expression) 27e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith EST_Delayed, ///< not known yet 28e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith EST_Uninstantiated ///< not instantiated yet 298b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl}; 308b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl 318b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redlinline bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType) { 3260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return ESpecType >= EST_DynamicNone && ESpecType <= EST_MSAny; 338b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl} 348b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl 358b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redlinline bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType) { 368b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl return ESpecType == EST_BasicNoexcept || ESpecType == EST_ComputedNoexcept; 378b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl} 388b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl 39e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith/// \brief Possible results from evaluation of a noexcept expression. 40e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smithenum CanThrowResult { 41e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith CT_Cannot, 42e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith CT_Dependent, 43e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith CT_Can 44e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith}; 45e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith 46e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smithinline CanThrowResult mergeCanThrow(CanThrowResult CT1, CanThrowResult CT2) { 47e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith // CanThrowResult constants are ordered so that the maximum is the correct 48e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith // merge result. 49e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith return CT1 > CT2 ? CT1 : CT2; 50e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith} 51e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith 528b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl} // end namespace clang 538b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl 548b5b4099c61a136e9a1714c4d8a593febe942268Sebastian Redl#endif // LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H 55