Home | History | Annotate | Line # | Download | only in Basic
      1 //===--- ExceptionSpecificationType.h ---------------------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 ///
      9 /// \file
     10 /// Defines the ExceptionSpecificationType enumeration and various
     11 /// utility functions.
     12 ///
     13 //===----------------------------------------------------------------------===//
     14 #ifndef LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H
     15 #define LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H
     16 
     17 namespace clang {
     18 
     19 /// The various types of exception specifications that exist in C++11.
     20 enum ExceptionSpecificationType {
     21   EST_None,             ///< no exception specification
     22   EST_DynamicNone,      ///< throw()
     23   EST_Dynamic,          ///< throw(T1, T2)
     24   EST_MSAny,            ///< Microsoft throw(...) extension
     25   EST_NoThrow,          ///< Microsoft __declspec(nothrow) extension
     26   EST_BasicNoexcept,    ///< noexcept
     27   EST_DependentNoexcept,///< noexcept(expression), value-dependent
     28   EST_NoexceptFalse,    ///< noexcept(expression), evals to 'false'
     29   EST_NoexceptTrue,     ///< noexcept(expression), evals to 'true'
     30   EST_Unevaluated,      ///< not evaluated yet, for special member function
     31   EST_Uninstantiated,   ///< not instantiated yet
     32   EST_Unparsed          ///< not parsed yet
     33 };
     34 
     35 inline bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType) {
     36   return ESpecType >= EST_DynamicNone && ESpecType <= EST_MSAny;
     37 }
     38 
     39 inline bool isComputedNoexcept(ExceptionSpecificationType ESpecType) {
     40   return ESpecType >= EST_DependentNoexcept &&
     41          ESpecType <= EST_NoexceptTrue;
     42 }
     43 
     44 inline bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType) {
     45   return ESpecType == EST_BasicNoexcept || ESpecType == EST_NoThrow ||
     46          isComputedNoexcept(ESpecType);
     47 }
     48 
     49 inline bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType) {
     50   return ESpecType == EST_Unevaluated || ESpecType == EST_Uninstantiated;
     51 }
     52 
     53 /// Possible results from evaluation of a noexcept expression.
     54 enum CanThrowResult {
     55   CT_Cannot,
     56   CT_Dependent,
     57   CT_Can
     58 };
     59 
     60 inline CanThrowResult mergeCanThrow(CanThrowResult CT1, CanThrowResult CT2) {
     61   // CanThrowResult constants are ordered so that the maximum is the correct
     62   // merge result.
     63   return CT1 > CT2 ? CT1 : CT2;
     64 }
     65 
     66 } // end namespace clang
     67 
     68 #endif // LLVM_CLANG_BASIC_EXCEPTIONSPECIFICATIONTYPE_H
     69