@@ -159,6 +159,10 @@ static bool is_explicit(APValue &Result, Sema &S, EvalFn Evaluator,
159
159
QualType ResultTy, SourceRange Range,
160
160
ArrayRef<Expr *> Args);
161
161
162
+ static bool is_noexcept (APValue &Result, Sema &S, EvalFn Evaluator,
163
+ QualType ResultTy, SourceRange Range,
164
+ ArrayRef<Expr *> Args);
165
+
162
166
static bool is_bit_field (APValue &Result, Sema &S, EvalFn Evaluator,
163
167
QualType ResultTy, SourceRange Range,
164
168
ArrayRef<Expr *> Args);
@@ -396,6 +400,7 @@ static constexpr Metafunction Metafunctions[] = {
396
400
{ Metafunction::MFRK_bool, 1 , 1 , is_deleted },
397
401
{ Metafunction::MFRK_bool, 1 , 1 , is_defaulted },
398
402
{ Metafunction::MFRK_bool, 1 , 1 , is_explicit },
403
+ { Metafunction::MFRK_bool, 1 , 1 , is_noexcept },
399
404
{ Metafunction::MFRK_bool, 1 , 1 , is_bit_field },
400
405
{ Metafunction::MFRK_bool, 1 , 1 , has_static_storage_duration },
401
406
{ Metafunction::MFRK_bool, 1 , 1 , has_internal_linkage },
@@ -1103,6 +1108,25 @@ bool isAccessible(Sema &S, DeclContext *AccessDC, NamedDecl *D) {
1103
1108
return Result;
1104
1109
}
1105
1110
1111
+ static bool isFunctionOrMethodNoexcept (const QualType QT) {
1112
+ const Type* T = QT.getTypePtr ();
1113
+
1114
+ if (T->isFunctionProtoType ()) {
1115
+ // This covers (virtual) methods & functions
1116
+ const auto *FPT = T->getAs <FunctionProtoType>();
1117
+
1118
+ switch (FPT->getExceptionSpecType ()) {
1119
+ case EST_BasicNoexcept:
1120
+ case EST_NoexceptTrue:
1121
+ return true ;
1122
+ default :
1123
+ return false ;
1124
+ }
1125
+ }
1126
+
1127
+ return false ;
1128
+ }
1129
+
1106
1130
// -----------------------------------------------------------------------------
1107
1131
// Metafunction implementations
1108
1132
// -----------------------------------------------------------------------------
@@ -2645,6 +2669,39 @@ bool is_explicit(APValue &Result, Sema &S, EvalFn Evaluator, QualType ResultTy,
2645
2669
llvm_unreachable (" invalid reflection type" );
2646
2670
}
2647
2671
2672
+ bool is_noexcept (APValue &Result, Sema &S, EvalFn Evaluator, QualType ResultTy,
2673
+ SourceRange Range, ArrayRef<Expr *> Args) {
2674
+ assert (Args[0 ]->getType ()->isReflectionType ());
2675
+ assert (ResultTy == S.Context .BoolTy );
2676
+
2677
+ APValue R;
2678
+ if (!Evaluator (R, Args[0 ], true ))
2679
+ return true ;
2680
+
2681
+ switch (R.getReflection ().getKind ()) {
2682
+ case ReflectionValue::RK_null:
2683
+ case ReflectionValue::RK_expr_result:
2684
+ case ReflectionValue::RK_template:
2685
+ case ReflectionValue::RK_namespace:
2686
+ case ReflectionValue::RK_base_specifier:
2687
+ case ReflectionValue::RK_data_member_spec:
2688
+ return SetAndSucceed (Result, makeBool (S.Context , false ));
2689
+ case ReflectionValue::RK_type: {
2690
+ const QualType QT = R.getReflectedType ();
2691
+ const auto result = isFunctionOrMethodNoexcept (QT);
2692
+
2693
+ return SetAndSucceed (Result, makeBool (S.Context , result));
2694
+ }
2695
+ case ReflectionValue::RK_declaration: {
2696
+ const ValueDecl *D = R.getReflectedDecl ();
2697
+ const auto result = isFunctionOrMethodNoexcept (D->getType ());
2698
+
2699
+ return SetAndSucceed (Result, makeBool (S.Context , result));
2700
+ }
2701
+ }
2702
+ llvm_unreachable (" invalid reflection type" );
2703
+ }
2704
+
2648
2705
bool is_bit_field (APValue &Result, Sema &S, EvalFn Evaluator, QualType ResultTy,
2649
2706
SourceRange Range, ArrayRef<Expr *> Args) {
2650
2707
assert (Args[0 ]->getType ()->isReflectionType ());
0 commit comments