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