https://gcc.gnu.org/g:2c30d0bddaec0590356f348b7cf5f8e7c88c4a82
commit r16-8371-g2c30d0bddaec0590356f348b7cf5f8e7c88c4a82 Author: Jakub Jelinek <[email protected]> Date: Tue Mar 31 23:42:38 2026 +0200 c++, libstdc++: Implement current_{function,class,namespace} metafn addition from P3795R2 The following patch implements addition of std::meta::current_function, std::meta::current_class, std::meta::current_namespace metafunctions from P3795R2 - Miscellaneous Reflection Cleanup paper. 2026-03-31 Jakub Jelinek <[email protected]> gcc/cp/ * metafns.gperf (enum metafn_code): Add METAFN_CURRENT_FUNCTION, METAFN_CURRENT_CLASS and METAFN_CURRENT_NAMESPACE. (enum metafn_kind): Add METAFN_KIND_INFO_VOID. (current_function, current_class, current_namespace): New metafunctions. * pt.cc (value_dependent_expression_p): Make current_function(), current_class() and current_namespace() calls dependent if they are inside of template. * reflect.cc (reflect_current_scope, eval_current_function, eval_current_class, eval_current_namespace): New functions. (eval_access_context_current): Use reflect_current_scope. (process_metafunction): Handle METAFN_CURRENT_FUNCTION, METAFN_CURRENT_CLASS and METAFN_CURRENT_NAMESPACE. * metafns.h: Regenerate. gcc/testsuite/ * g++.dg/reflect/current_function1.C: New test. * g++.dg/reflect/current_function2.C: New test. * g++.dg/reflect/current_class1.C: New test. * g++.dg/reflect/current_class2.C: New test. * g++.dg/reflect/current_namespace1.C: New test. libstdc++-v3/ * include/std/meta (std::meta::current_function, std::meta::current_class, std::meta::current_namespace): New declarations. * src/c++23/std.cc.in: Export those 3. Reviewed-by: Jason Merrill <[email protected]> Reviewed-by: Jonathan Wakely <[email protected]> Diff: --- gcc/cp/metafns.gperf | 8 + gcc/cp/metafns.h | 944 +++++++++++----------- gcc/cp/pt.cc | 19 +- gcc/cp/reflect.cc | 75 +- gcc/testsuite/g++.dg/reflect/current_class1.C | 70 ++ gcc/testsuite/g++.dg/reflect/current_class2.C | 73 ++ gcc/testsuite/g++.dg/reflect/current_function1.C | 76 ++ gcc/testsuite/g++.dg/reflect/current_function2.C | 78 ++ gcc/testsuite/g++.dg/reflect/current_namespace1.C | 93 +++ libstdc++-v3/include/std/meta | 5 + libstdc++-v3/src/c++23/std.cc.in | 3 + 11 files changed, 962 insertions(+), 482 deletions(-) diff --git a/gcc/cp/metafns.gperf b/gcc/cp/metafns.gperf index c395291e0115..0e919687c605 100644 --- a/gcc/cp/metafns.gperf +++ b/gcc/cp/metafns.gperf @@ -119,6 +119,9 @@ enum metafn_code { METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_HAS_INACCESSIBLE_BASES, METAFN_HAS_INACCESSIBLE_SUBOBJECTS, + METAFN_CURRENT_FUNCTION, + METAFN_CURRENT_CLASS, + METAFN_CURRENT_NAMESPACE, METAFN_MEMBERS_OF, METAFN_BASES_OF, METAFN_STATIC_DATA_MEMBERS_OF, @@ -363,6 +366,8 @@ enum metafn_kind { METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET = (METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL, + METAFN_KIND_INFO_VOID + = (METAFN_KIND_ARGS_VOID << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO, METAFN_KIND_INFO_INFO = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO, METAFN_KIND_INFO_TINFO @@ -554,6 +559,9 @@ is_accessible, METAFN_IS_ACCESSIBLE, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT, has_inaccessible_nonstatic_data_members, METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT, has_inaccessible_bases, METAFN_HAS_INACCESSIBLE_BASES, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT, has_inaccessible_subobjects, METAFN_HAS_INACCESSIBLE_SUBOBJECTS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT, +current_function, METAFN_CURRENT_FUNCTION, METAFN_KIND_INFO_VOID, +current_class, METAFN_CURRENT_CLASS, METAFN_KIND_INFO_VOID, +current_namespace, METAFN_CURRENT_NAMESPACE, METAFN_KIND_INFO_VOID, members_of, METAFN_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT, bases_of, METAFN_BASES_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT, static_data_members_of, METAFN_STATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT, diff --git a/gcc/cp/metafns.h b/gcc/cp/metafns.h index 5beabdcef13f..611e0587f437 100644 --- a/gcc/cp/metafns.h +++ b/gcc/cp/metafns.h @@ -147,6 +147,9 @@ enum metafn_code { METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_HAS_INACCESSIBLE_BASES, METAFN_HAS_INACCESSIBLE_SUBOBJECTS, + METAFN_CURRENT_FUNCTION, + METAFN_CURRENT_CLASS, + METAFN_CURRENT_NAMESPACE, METAFN_MEMBERS_OF, METAFN_BASES_OF, METAFN_STATIC_DATA_MEMBERS_OF, @@ -391,6 +394,8 @@ enum metafn_kind { METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET = (METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL, + METAFN_KIND_INFO_VOID + = (METAFN_KIND_ARGS_VOID << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO, METAFN_KIND_INFO_INFO = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO, METAFN_KIND_INFO_TINFO @@ -472,7 +477,7 @@ enum metafn_kind { = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT) | METAFN_KIND_RET_U8STRING_VIEW }; -#line 448 "metafns.gperf" +#line 453 "metafns.gperf" struct metafn_info { /* A name within "std::meta::" (or "std::meta::access_context::"). */ @@ -484,7 +489,7 @@ struct metafn_info /* METAFN_KIND_ kind of arguments and return type. */ metafn_kind kind; }; -/* maximum key range = 879, duplicates = 0 */ +/* maximum key range = 782, duplicates = 0 */ class metafn_lookup { @@ -499,32 +504,32 @@ metafn_lookup::hash (const char *str, size_t len) { static const unsigned short asso_values[] = { - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 0, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 5, 100, 145, 10, 45, - 165, 5, 55, 50, 72, 20, 248, 0, 55, 105, - 0, 205, 0, 45, 35, 55, 25, 195, 5, 199, - 20, 311, 80, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, - 918, 918, 918, 918, 918, 918, 918 + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 0, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 5, 45, 145, 10, 45, + 190, 5, 55, 35, 115, 20, 346, 0, 60, 110, + 0, 219, 0, 40, 35, 20, 25, 160, 5, 80, + 0, 183, 45, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821 }; unsigned int hval = len; @@ -583,11 +588,11 @@ metafn_lookup::find (const char *str, size_t len) { enum { - TOTAL_KEYWORDS = 234, + TOTAL_KEYWORDS = 237, MIN_WORD_LENGTH = 4, MAX_WORD_LENGTH = 40, MIN_HASH_VALUE = 39, - MAX_HASH_VALUE = 917 + MAX_HASH_VALUE = 820 }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) @@ -596,474 +601,480 @@ metafn_lookup::find (const char *str, size_t len) #endif static const struct metafn_info wordlist[] = { -#line 648 "metafns.gperf" +#line 656 "metafns.gperf" {"rank", METAFN_RANK, METAFN_KIND_SIZE_T_TINFO,}, -#line 578 "metafns.gperf" +#line 586 "metafns.gperf" {"is_void_type", METAFN_IS_VOID_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 583 "metafns.gperf" +#line 591 "metafns.gperf" {"is_pointer_type", METAFN_IS_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 489 "metafns.gperf" +#line 494 "metafns.gperf" {"is_volatile", METAFN_IS_VOLATILE, METAFN_KIND_BOOL_INFO,}, -#line 535 "metafns.gperf" +#line 540 "metafns.gperf" {"is_value", METAFN_IS_VALUE, METAFN_KIND_BOOL_INFO,}, -#line 542 "metafns.gperf" +#line 547 "metafns.gperf" {"is_base", METAFN_IS_BASE, METAFN_KIND_BOOL_INFO,}, -#line 503 "metafns.gperf" +#line 479 "metafns.gperf" + {"is_private", METAFN_IS_PRIVATE, METAFN_KIND_BOOL_INFO,}, +#line 508 "metafns.gperf" {"is_variable", METAFN_IS_VARIABLE, METAFN_KIND_BOOL_INFO,}, -#line 654 "metafns.gperf" +#line 662 "metafns.gperf" {"is_nothrow_convertible_type", METAFN_IS_NOTHROW_CONVERTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 633 "metafns.gperf" +#line 641 "metafns.gperf" {"is_nothrow_constructible_type", METAFN_IS_NOTHROW_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,}, -#line 659 "metafns.gperf" +#line 667 "metafns.gperf" {"is_nothrow_invocable_type", METAFN_IS_NOTHROW_INVOCABLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,}, -#line 638 "metafns.gperf" +#line 646 "metafns.gperf" {"is_nothrow_copy_assignable_type", METAFN_IS_NOTHROW_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 660 "metafns.gperf" +#line 668 "metafns.gperf" {"is_nothrow_invocable_r_type", METAFN_IS_NOTHROW_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,}, -#line 635 "metafns.gperf" +#line 643 "metafns.gperf" {"is_nothrow_copy_constructible_type", METAFN_IS_NOTHROW_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 651 "metafns.gperf" +#line 659 "metafns.gperf" {"is_base_of_type", METAFN_IS_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 639 "metafns.gperf" +#line 647 "metafns.gperf" {"is_nothrow_move_assignable_type", METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 636 "metafns.gperf" +#line 658 "metafns.gperf" + {"is_same_type", METAFN_IS_SAME_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, +#line 644 "metafns.gperf" {"is_nothrow_move_constructible_type", METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 527 "metafns.gperf" +#line 532 "metafns.gperf" {"is_variable_template", METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 579 "metafns.gperf" +#line 587 "metafns.gperf" {"is_null_pointer_type", METAFN_IS_NULL_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 472 "metafns.gperf" +#line 645 "metafns.gperf" + {"is_nothrow_assignable_type", METAFN_IS_NOTHROW_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, +#line 650 "metafns.gperf" + {"is_nothrow_destructible_type", METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 477 "metafns.gperf" {"is_public", METAFN_IS_PUBLIC, METAFN_KIND_BOOL_INFO,}, -#line 484 "metafns.gperf" +#line 489 "metafns.gperf" {"is_noexcept", METAFN_IS_NOEXCEPT, METAFN_KIND_BOOL_INFO,}, -#line 567 "metafns.gperf" +#line 575 "metafns.gperf" {"extract", METAFN_EXTRACT, METAFN_KIND_TEMPLATE_PARM_INFO,}, -#line 687 "metafns.gperf" +#line 695 "metafns.gperf" {"variant_alternative", METAFN_VARIANT_ALTERNATIVE, METAFN_KIND_INFO_SIZE_T_TINFO,}, -#line 605 "metafns.gperf" +#line 613 "metafns.gperf" {"is_polymorphic_type", METAFN_IS_POLYMORPHIC_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 474 "metafns.gperf" - {"is_private", METAFN_IS_PRIVATE, METAFN_KIND_BOOL_INFO,}, -#line 508 "metafns.gperf" +#line 513 "metafns.gperf" {"is_function", METAFN_IS_FUNCTION, METAFN_KIND_BOOL_INFO,}, -#line 505 "metafns.gperf" +#line 510 "metafns.gperf" {"is_namespace", METAFN_IS_NAMESPACE, METAFN_KIND_BOOL_INFO,}, -#line 656 "metafns.gperf" +#line 466 "metafns.gperf" + {"symbol_of", METAFN_SYMBOL_OF, METAFN_KIND_STRING_VIEW_OPERATORS,}, +#line 664 "metafns.gperf" {"is_pointer_interconvertible_base_of_type", METAFN_IS_POINTER_INTERCONVERTIBLE_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 612 "metafns.gperf" +#line 620 "metafns.gperf" {"is_bounded_array_type", METAFN_IS_BOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 488 "metafns.gperf" +#line 694 "metafns.gperf" + {"variant_size", METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,}, +#line 493 "metafns.gperf" {"is_const", METAFN_IS_CONST, METAFN_KIND_BOOL_INFO,}, -#line 534 "metafns.gperf" +#line 539 "metafns.gperf" {"is_concept", METAFN_IS_CONCEPT, METAFN_KIND_BOOL_INFO,}, -#line 650 "metafns.gperf" - {"is_same_type", METAFN_IS_SAME_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 558 "metafns.gperf" +#line 509 "metafns.gperf" + {"is_type", METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,}, +#line 566 "metafns.gperf" {"bases_of", METAFN_BASES_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, -#line 497 "metafns.gperf" - {"has_module_linkage", METAFN_HAS_MODULE_LINKAGE, METAFN_KIND_BOOL_INFO,}, -#line 526 "metafns.gperf" +#line 531 "metafns.gperf" {"is_function_template", METAFN_IS_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 637 "metafns.gperf" - {"is_nothrow_assignable_type", METAFN_IS_NOTHROW_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 509 "metafns.gperf" +#line 514 "metafns.gperf" {"is_conversion_function", METAFN_IS_CONVERSION_FUNCTION, METAFN_KIND_BOOL_INFO,}, -#line 642 "metafns.gperf" - {"is_nothrow_destructible_type", METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 653 "metafns.gperf" +#line 628 "metafns.gperf" + {"is_copy_assignable_type", METAFN_IS_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 661 "metafns.gperf" {"is_convertible_type", METAFN_IS_CONVERTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 643 "metafns.gperf" +#line 651 "metafns.gperf" {"is_implicit_lifetime_type", METAFN_IS_IMPLICIT_LIFETIME_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 525 "metafns.gperf" +#line 696 "metafns.gperf" + {"type_order", METAFN_TYPE_ORDER, METAFN_KIND_STRONG_ORDERING_TINFO_TINFO,}, +#line 530 "metafns.gperf" {"is_template", METAFN_IS_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 634 "metafns.gperf" +#line 642 "metafns.gperf" {"is_nothrow_default_constructible_type", METAFN_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 568 "metafns.gperf" +#line 576 "metafns.gperf" {"can_substitute", METAFN_CAN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,}, -#line 530 "metafns.gperf" +#line 535 "metafns.gperf" {"is_conversion_function_template", METAFN_IS_CONVERSION_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 461 "metafns.gperf" - {"symbol_of", METAFN_SYMBOL_OF, METAFN_KIND_STRING_VIEW_OPERATORS,}, -#line 617 "metafns.gperf" +#line 523 "metafns.gperf" + {"is_copy_assignment", METAFN_IS_COPY_ASSIGNMENT, METAFN_KIND_BOOL_INFO,}, +#line 625 "metafns.gperf" {"is_copy_constructible_type", METAFN_IS_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 686 "metafns.gperf" - {"variant_size", METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,}, -#line 504 "metafns.gperf" - {"is_type", METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,}, -#line 615 "metafns.gperf" +#line 572 "metafns.gperf" + {"size_of", METAFN_SIZE_OF, METAFN_KIND_SIZE_T_INFO,}, +#line 474 "metafns.gperf" + {"type_of", METAFN_TYPE_OF, METAFN_KIND_INFO_INFO,}, +#line 511 "metafns.gperf" + {"is_type_alias", METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,}, +#line 623 "metafns.gperf" {"is_constructible_type", METAFN_IS_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,}, -#line 495 "metafns.gperf" - {"has_automatic_storage_duration", METAFN_HAS_AUTOMATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,}, -#line 620 "metafns.gperf" - {"is_copy_assignable_type", METAFN_IS_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 684 "metafns.gperf" - {"tuple_size", METAFN_TUPLE_SIZE, METAFN_KIND_SIZE_T_TINFO,}, -#line 524 "metafns.gperf" +#line 631 "metafns.gperf" + {"is_swappable_type", METAFN_IS_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 502 "metafns.gperf" + {"has_module_linkage", METAFN_HAS_MODULE_LINKAGE, METAFN_KIND_BOOL_INFO,}, +#line 529 "metafns.gperf" {"is_vararg_function", METAFN_IS_VARARG_FUNCTION, METAFN_KIND_BOOL_INFO,}, -#line 515 "metafns.gperf" +#line 520 "metafns.gperf" {"is_copy_constructor", METAFN_IS_COPY_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,}, -#line 551 "metafns.gperf" +#line 692 "metafns.gperf" + {"tuple_size", METAFN_TUPLE_SIZE, METAFN_KIND_SIZE_T_TINFO,}, +#line 556 "metafns.gperf" {"variable_of", METAFN_VARIABLE_OF, METAFN_KIND_INFO_INFO,}, -#line 544 "metafns.gperf" - {"has_parent", METAFN_HAS_PARENT, METAFN_KIND_BOOL_INFO,}, -#line 592 "metafns.gperf" +#line 600 "metafns.gperf" {"is_reflection_type", METAFN_IS_REFLECTION_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 595 "metafns.gperf" +#line 574 "metafns.gperf" + {"bit_size_of", METAFN_BIT_SIZE_OF, METAFN_KIND_SIZE_T_INFO,}, +#line 603 "metafns.gperf" {"is_fundamental_type", METAFN_IS_FUNDAMENTAL_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 655 "metafns.gperf" +#line 663 "metafns.gperf" {"is_layout_compatible_type", METAFN_IS_LAYOUT_COMPATIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 566 "metafns.gperf" - {"bit_size_of", METAFN_BIT_SIZE_OF, METAFN_KIND_SIZE_T_INFO,}, -#line 518 "metafns.gperf" - {"is_copy_assignment", METAFN_IS_COPY_ASSIGNMENT, METAFN_KIND_BOOL_INFO,}, -#line 691 "metafns.gperf" +#line 699 "metafns.gperf" {"current", METAFN_ACCESS_CONTEXT_CURRENT, METAFN_KIND_ACCESS_CONTEXT_VOID,}, -#line 678 "metafns.gperf" - {"common_type", METAFN_COMMON_TYPE, METAFN_KIND_INFO_REFLECTION_RANGET,}, -#line 533 "metafns.gperf" +#line 562 "metafns.gperf" + {"current_function", METAFN_CURRENT_FUNCTION, METAFN_KIND_INFO_VOID,}, +#line 538 "metafns.gperf" {"is_constructor_template", METAFN_IS_CONSTRUCTOR_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 688 "metafns.gperf" - {"type_order", METAFN_TYPE_ORDER, METAFN_KIND_STRONG_ORDERING_TINFO_TINFO,}, -#line 679 "metafns.gperf" +#line 686 "metafns.gperf" + {"common_type", METAFN_COMMON_TYPE, METAFN_KIND_INFO_REFLECTION_RANGET,}, +#line 629 "metafns.gperf" + {"is_move_assignable_type", METAFN_IS_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 687 "metafns.gperf" {"common_reference", METAFN_COMMON_REFERENCE, METAFN_KIND_INFO_REFLECTION_RANGET,}, -#line 543 "metafns.gperf" - {"has_default_member_initializer", METAFN_HAS_DEFAULT_MEMBER_INITIALIZER, METAFN_KIND_BOOL_INFO,}, -#line 685 "metafns.gperf" +#line 693 "metafns.gperf" {"tuple_element", METAFN_TUPLE_ELEMENT, METAFN_KIND_INFO_SIZE_T_TINFO,}, -#line 572 "metafns.gperf" +#line 580 "metafns.gperf" {"reflect_function", METAFN_REFLECT_FUNCTION, METAFN_KIND_INFO_TEMPLATE_PARM_REF,}, -#line 523 "metafns.gperf" - {"has_default_argument", METAFN_HAS_DEFAULT_ARGUMENT, METAFN_KIND_BOOL_INFO,}, -#line 618 "metafns.gperf" - {"is_move_constructible_type", METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 469 "metafns.gperf" - {"type_of", METAFN_TYPE_OF, METAFN_KIND_INFO_INFO,}, -#line 513 "metafns.gperf" +#line 500 "metafns.gperf" + {"has_automatic_storage_duration", METAFN_HAS_AUTOMATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,}, +#line 524 "metafns.gperf" + {"is_move_assignment", METAFN_IS_MOVE_ASSIGNMENT, METAFN_KIND_BOOL_INFO,}, +#line 518 "metafns.gperf" {"is_constructor", METAFN_IS_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,}, -#line 623 "metafns.gperf" - {"is_swappable_type", METAFN_IS_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 641 "metafns.gperf" +#line 549 "metafns.gperf" + {"has_parent", METAFN_HAS_PARENT, METAFN_KIND_BOOL_INFO,}, +#line 626 "metafns.gperf" + {"is_move_constructible_type", METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 649 "metafns.gperf" {"is_nothrow_swappable_type", METAFN_IS_NOTHROW_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 593 "metafns.gperf" +#line 610 "metafns.gperf" + {"is_trivially_copyable_type", METAFN_IS_TRIVIALLY_COPYABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 601 "metafns.gperf" {"is_reference_type", METAFN_IS_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 500 "metafns.gperf" - {"has_linkage", METAFN_HAS_LINKAGE, METAFN_KIND_BOOL_INFO,}, -#line 640 "metafns.gperf" +#line 593 "metafns.gperf" + {"is_rvalue_reference_type", METAFN_IS_RVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 648 "metafns.gperf" {"is_nothrow_swappable_with_type", METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 599 "metafns.gperf" +#line 633 "metafns.gperf" + {"is_trivially_constructible_type", METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,}, +#line 630 "metafns.gperf" + {"is_swappable_with_type", METAFN_IS_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, +#line 638 "metafns.gperf" + {"is_trivially_copy_assignable_type", METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 688 "metafns.gperf" + {"underlying_type", METAFN_UNDERLYING_TYPE, METAFN_KIND_INFO_TINFO,}, +#line 635 "metafns.gperf" + {"is_trivially_copy_constructible_type", METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 607 "metafns.gperf" {"is_member_pointer_type", METAFN_IS_MEMBER_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 621 "metafns.gperf" - {"is_move_assignable_type", METAFN_IS_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 506 "metafns.gperf" - {"is_type_alias", METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,}, -#line 516 "metafns.gperf" - {"is_move_constructor", METAFN_IS_MOVE_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,}, -#line 550 "metafns.gperf" +#line 577 "metafns.gperf" + {"substitute", METAFN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,}, +#line 555 "metafns.gperf" {"parameters_of", METAFN_PARAMETERS_OF, METAFN_KIND_VECTOR_INFO_INFO,}, -#line 564 "metafns.gperf" - {"size_of", METAFN_SIZE_OF, METAFN_KIND_SIZE_T_INFO,}, -#line 519 "metafns.gperf" - {"is_move_assignment", METAFN_IS_MOVE_ASSIGNMENT, METAFN_KIND_BOOL_INFO,}, -#line 619 "metafns.gperf" +#line 521 "metafns.gperf" + {"is_move_constructor", METAFN_IS_MOVE_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,}, +#line 548 "metafns.gperf" + {"has_default_member_initializer", METAFN_HAS_DEFAULT_MEMBER_INITIALIZER, METAFN_KIND_BOOL_INFO,}, +#line 517 "metafns.gperf" + {"is_special_member_function", METAFN_IS_SPECIAL_MEMBER_FUNCTION, METAFN_KIND_BOOL_INFO,}, +#line 612 "metafns.gperf" + {"is_empty_type", METAFN_IS_EMPTY_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 627 "metafns.gperf" {"is_assignable_type", METAFN_IS_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 538 "metafns.gperf" +#line 592 "metafns.gperf" + {"is_lvalue_reference_type", METAFN_IS_LVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 528 "metafns.gperf" + {"has_default_argument", METAFN_HAS_DEFAULT_ARGUMENT, METAFN_KIND_BOOL_INFO,}, +#line 690 "metafns.gperf" + {"unwrap_reference", METAFN_UNWRAP_REFERENCE, METAFN_KIND_INFO_TINFO,}, +#line 522 "metafns.gperf" + {"is_assignment", METAFN_IS_ASSIGNMENT, METAFN_KIND_BOOL_INFO,}, +#line 609 "metafns.gperf" + {"is_volatile_type", METAFN_IS_VOLATILE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 543 "metafns.gperf" {"is_class_member", METAFN_IS_CLASS_MEMBER, METAFN_KIND_BOOL_INFO,}, #line 602 "metafns.gperf" - {"is_trivially_copyable_type", METAFN_IS_TRIVIALLY_COPYABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 517 "metafns.gperf" - {"is_assignment", METAFN_IS_ASSIGNMENT, METAFN_KIND_BOOL_INFO,}, -#line 539 "metafns.gperf" + {"is_arithmetic_type", METAFN_IS_ARITHMETIC_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 544 "metafns.gperf" {"is_namespace_member", METAFN_IS_NAMESPACE_MEMBER, METAFN_KIND_BOOL_INFO,}, -#line 557 "metafns.gperf" +#line 565 "metafns.gperf" {"members_of", METAFN_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, -#line 625 "metafns.gperf" - {"is_trivially_constructible_type", METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,}, -#line 630 "metafns.gperf" - {"is_trivially_copy_assignable_type", METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 627 "metafns.gperf" - {"is_trivially_copy_constructible_type", METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 649 "metafns.gperf" - {"extent", METAFN_EXTENT, METAFN_KIND_SIZE_T_TINFO_UNSIGNED,}, -#line 588 "metafns.gperf" - {"is_enum_type", METAFN_IS_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 548 "metafns.gperf" - {"template_of", METAFN_TEMPLATE_OF, METAFN_KIND_INFO_INFO,}, -#line 528 "metafns.gperf" - {"is_class_template", METAFN_IS_CLASS_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 512 "metafns.gperf" - {"is_special_member_function", METAFN_IS_SPECIAL_MEMBER_FUNCTION, METAFN_KIND_BOOL_INFO,}, -#line 473 "metafns.gperf" +#line 478 "metafns.gperf" {"is_protected", METAFN_IS_PROTECTED, METAFN_KIND_BOOL_INFO,}, -#line 540 "metafns.gperf" - {"is_nonstatic_data_member", METAFN_IS_NONSTATIC_DATA_MEMBER, METAFN_KIND_BOOL_INFO,}, -#line 682 "metafns.gperf" - {"unwrap_reference", METAFN_UNWRAP_REFERENCE, METAFN_KIND_INFO_TINFO,}, -#line 502 "metafns.gperf" - {"is_enumerable_type", METAFN_IS_ENUMERABLE_TYPE, METAFN_KIND_BOOL_INFO,}, -#line 594 "metafns.gperf" - {"is_arithmetic_type", METAFN_IS_ARITHMETIC_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 545 "metafns.gperf" - {"parent_of", METAFN_PARENT_OF, METAFN_KIND_INFO_INFO,}, -#line 476 "metafns.gperf" - {"is_pure_virtual", METAFN_IS_PURE_VIRTUAL, METAFN_KIND_BOOL_INFO,}, -#line 675 "metafns.gperf" - {"add_pointer", METAFN_ADD_POINTER, METAFN_KIND_INFO_TINFO,}, -#line 616 "metafns.gperf" - {"is_default_constructible_type", METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 680 "metafns.gperf" - {"underlying_type", METAFN_UNDERLYING_TYPE, METAFN_KIND_INFO_TINFO,}, -#line 521 "metafns.gperf" - {"is_function_parameter", METAFN_IS_FUNCTION_PARAMETER, METAFN_KIND_BOOL_INFO,}, -#line 464 "metafns.gperf" +#line 505 "metafns.gperf" + {"has_linkage", METAFN_HAS_LINKAGE, METAFN_KIND_BOOL_INFO,}, +#line 469 "metafns.gperf" {"identifier_of", METAFN_IDENTIFIER_OF, METAFN_KIND_STRING_VIEW_INFO,}, -#line 597 "metafns.gperf" - {"is_scalar_type", METAFN_IS_SCALAR_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 669 "metafns.gperf" +#line 677 "metafns.gperf" {"add_rvalue_reference", METAFN_ADD_RVALUE_REFERENCE, METAFN_KIND_INFO_TINFO,}, -#line 490 "metafns.gperf" - {"is_mutable_member", METAFN_IS_MUTABLE_MEMBER, METAFN_KIND_BOOL_INFO,}, -#line 507 "metafns.gperf" +#line 553 "metafns.gperf" + {"template_of", METAFN_TEMPLATE_OF, METAFN_KIND_INFO_INFO,}, +#line 512 "metafns.gperf" {"is_namespace_alias", METAFN_IS_NAMESPACE_ALIAS, METAFN_KIND_BOOL_INFO,}, -#line 631 "metafns.gperf" +#line 657 "metafns.gperf" + {"extent", METAFN_EXTENT, METAFN_KIND_SIZE_T_TINFO_UNSIGNED,}, +#line 596 "metafns.gperf" + {"is_enum_type", METAFN_IS_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 533 "metafns.gperf" + {"is_class_template", METAFN_IS_CLASS_TEMPLATE, METAFN_KIND_BOOL_INFO,}, +#line 608 "metafns.gperf" + {"is_const_type", METAFN_IS_CONST_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 564 "metafns.gperf" + {"current_namespace", METAFN_CURRENT_NAMESPACE, METAFN_KIND_INFO_VOID,}, +#line 488 "metafns.gperf" + {"is_explicit", METAFN_IS_EXPLICIT, METAFN_KIND_BOOL_INFO,}, +#line 683 "metafns.gperf" + {"add_pointer", METAFN_ADD_POINTER, METAFN_KIND_INFO_TINFO,}, +#line 639 "metafns.gperf" {"is_trivially_move_assignable_type", METAFN_IS_TRIVIALLY_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 628 "metafns.gperf" +#line 506 "metafns.gperf" + {"is_complete_type", METAFN_IS_COMPLETE_TYPE, METAFN_KIND_BOOL_INFO,}, +#line 636 "metafns.gperf" {"is_trivially_move_constructible_type", METAFN_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 514 "metafns.gperf" - {"is_default_constructor", METAFN_IS_DEFAULT_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,}, -#line 486 "metafns.gperf" +#line 605 "metafns.gperf" + {"is_scalar_type", METAFN_IS_SCALAR_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 481 "metafns.gperf" + {"is_pure_virtual", METAFN_IS_PURE_VIRTUAL, METAFN_KIND_BOOL_INFO,}, +#line 526 "metafns.gperf" + {"is_function_parameter", METAFN_IS_FUNCTION_PARAMETER, METAFN_KIND_BOOL_INFO,}, +#line 507 "metafns.gperf" + {"is_enumerable_type", METAFN_IS_ENUMERABLE_TYPE, METAFN_KIND_BOOL_INFO,}, +#line 599 "metafns.gperf" + {"is_function_type", METAFN_IS_FUNCTION_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 550 "metafns.gperf" + {"parent_of", METAFN_PARENT_OF, METAFN_KIND_INFO_INFO,}, +#line 545 "metafns.gperf" + {"is_nonstatic_data_member", METAFN_IS_NONSTATIC_DATA_MEMBER, METAFN_KIND_BOOL_INFO,}, +#line 542 "metafns.gperf" + {"is_structured_binding", METAFN_IS_STRUCTURED_BINDING, METAFN_KIND_BOOL_INFO,}, +#line 495 "metafns.gperf" + {"is_mutable_member", METAFN_IS_MUTABLE_MEMBER, METAFN_KIND_BOOL_INFO,}, +#line 637 "metafns.gperf" + {"is_trivially_assignable_type", METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, +#line 624 "metafns.gperf" + {"is_default_constructible_type", METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 527 "metafns.gperf" + {"is_explicit_object_parameter", METAFN_IS_EXPLICIT_OBJECT_PARAMETER, METAFN_KIND_BOOL_INFO,}, +#line 673 "metafns.gperf" + {"add_volatile", METAFN_ADD_VOLATILE, METAFN_KIND_INFO_TINFO,}, +#line 563 "metafns.gperf" + {"current_class", METAFN_CURRENT_CLASS, METAFN_KIND_INFO_VOID,}, +#line 570 "metafns.gperf" + {"enumerators_of", METAFN_ENUMERATORS_OF, METAFN_KIND_VECTOR_INFO_INFO,}, +#line 491 "metafns.gperf" {"is_enumerator", METAFN_IS_ENUMERATOR, METAFN_KIND_BOOL_INFO,}, -#line 536 "metafns.gperf" +#line 541 "metafns.gperf" {"is_object", METAFN_IS_OBJECT, METAFN_KIND_BOOL_INFO,}, -#line 608 "metafns.gperf" - {"is_aggregate_type", METAFN_IS_AGGREGATE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 520 "metafns.gperf" - {"is_destructor", METAFN_IS_DESTRUCTOR, METAFN_KIND_BOOL_INFO,}, -#line 587 "metafns.gperf" +#line 472 "metafns.gperf" + {"u8display_string_of", METAFN_U8DISPLAY_STRING_OF, METAFN_KIND_U8STRING_VIEW_INFO,}, +#line 595 "metafns.gperf" {"is_member_function_pointer_type", METAFN_IS_MEMBER_FUNCTION_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 596 "metafns.gperf" +#line 652 "metafns.gperf" + {"has_virtual_destructor", METAFN_HAS_VIRTUAL_DESTRUCTOR, METAFN_KIND_BOOL_TINFO,}, +#line 655 "metafns.gperf" + {"reference_converts_from_temporary", METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,}, +#line 519 "metafns.gperf" + {"is_default_constructor", METAFN_IS_DEFAULT_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,}, +#line 604 "metafns.gperf" {"is_object_type", METAFN_IS_OBJECT_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 569 "metafns.gperf" - {"substitute", METAFN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,}, -#line 585 "metafns.gperf" - {"is_rvalue_reference_type", METAFN_IS_RVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 666 "metafns.gperf" - {"add_cv", METAFN_ADD_CV, METAFN_KIND_INFO_TINFO,}, -#line 570 "metafns.gperf" +#line 578 "metafns.gperf" {"reflect_constant", METAFN_REFLECT_CONSTANT, METAFN_KIND_INFO_TEMPLATE_PARM,}, -#line 629 "metafns.gperf" - {"is_trivially_assignable_type", METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 475 "metafns.gperf" - {"is_virtual", METAFN_IS_VIRTUAL, METAFN_KIND_BOOL_INFO,}, -#line 493 "metafns.gperf" - {"has_static_storage_duration", METAFN_HAS_STATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,}, -#line 668 "metafns.gperf" +#line 525 "metafns.gperf" + {"is_destructor", METAFN_IS_DESTRUCTOR, METAFN_KIND_BOOL_INFO,}, +#line 482 "metafns.gperf" + {"is_override", METAFN_IS_OVERRIDE, METAFN_KIND_BOOL_INFO,}, +#line 654 "metafns.gperf" + {"reference_constructs_from_temporary", METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,}, +#line 557 "metafns.gperf" + {"return_type_of", METAFN_RETURN_TYPE_OF, METAFN_KIND_INFO_INFO,}, +#line 676 "metafns.gperf" {"add_lvalue_reference", METAFN_ADD_LVALUE_REFERENCE, METAFN_KIND_INFO_TINFO,}, -#line 584 "metafns.gperf" - {"is_lvalue_reference_type", METAFN_IS_LVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 562 "metafns.gperf" - {"enumerators_of", METAFN_ENUMERATORS_OF, METAFN_KIND_VECTOR_INFO_INFO,}, -#line 624 "metafns.gperf" - {"is_destructible_type", METAFN_IS_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 549 "metafns.gperf" +#line 476 "metafns.gperf" + {"constant_of", METAFN_CONSTANT_OF, METAFN_KIND_INFO_INFO,}, +#line 671 "metafns.gperf" + {"remove_cv", METAFN_REMOVE_CV, METAFN_KIND_INFO_TINFO,}, +#line 640 "metafns.gperf" + {"is_trivially_destructible_type", METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 674 "metafns.gperf" + {"add_cv", METAFN_ADD_CV, METAFN_KIND_INFO_TINFO,}, +#line 616 "metafns.gperf" + {"is_aggregate_type", METAFN_IS_AGGREGATE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 581 "metafns.gperf" + {"reflect_constant_string", METAFN_REFLECT_CONSTANT_STRING, METAFN_KIND_INFO_INPUT_RANGE,}, +#line 554 "metafns.gperf" {"template_arguments_of", METAFN_TEMPLATE_ARGUMENTS_OF, METAFN_KIND_VECTOR_INFO_INFO,}, -#line 657 "metafns.gperf" +#line 569 "metafns.gperf" + {"subobjects_of", METAFN_SUBOBJECTS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, +#line 571 "metafns.gperf" + {"offset_of", METAFN_OFFSET_OF, METAFN_KIND_MEMBER_OFFSET_INFO,}, +#line 634 "metafns.gperf" + {"is_trivially_default_constructible_type", METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 675 "metafns.gperf" + {"remove_reference", METAFN_REMOVE_REFERENCE, METAFN_KIND_INFO_TINFO,}, +#line 534 "metafns.gperf" + {"is_alias_template", METAFN_IS_ALIAS_TEMPLATE, METAFN_KIND_BOOL_INFO,}, +#line 679 "metafns.gperf" + {"make_unsigned", METAFN_MAKE_UNSIGNED, METAFN_KIND_INFO_TINFO,}, +#line 665 "metafns.gperf" {"is_invocable_type", METAFN_IS_INVOCABLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,}, -#line 664 "metafns.gperf" +#line 622 "metafns.gperf" + {"is_scoped_enum_type", METAFN_IS_SCOPED_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 546 "metafns.gperf" + {"is_static_member", METAFN_IS_STATIC_MEMBER, METAFN_KIND_BOOL_INFO,}, +#line 672 "metafns.gperf" {"add_const", METAFN_ADD_CONST, METAFN_KIND_INFO_TINFO,}, -#line 529 "metafns.gperf" - {"is_alias_template", METAFN_IS_ALIAS_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 604 "metafns.gperf" - {"is_empty_type", METAFN_IS_EMPTY_TYPE, METAFN_KIND_BOOL_TINFO,}, #line 632 "metafns.gperf" - {"is_trivially_destructible_type", METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, + {"is_destructible_type", METAFN_IS_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 598 "metafns.gperf" + {"is_class_type", METAFN_IS_CLASS_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 680 "metafns.gperf" + {"remove_extent", METAFN_REMOVE_EXTENT, METAFN_KIND_INFO_TINFO,}, +#line 666 "metafns.gperf" + {"is_invocable_r_type", METAFN_IS_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,}, +#line 558 "metafns.gperf" + {"is_accessible", METAFN_IS_ACCESSIBLE, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, +#line 465 "metafns.gperf" + {"operator_of", METAFN_OPERATOR_OF, METAFN_KIND_OPERATORS_INFO,}, +#line 590 "metafns.gperf" + {"is_array_type", METAFN_IS_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 669 "metafns.gperf" + {"remove_const", METAFN_REMOVE_CONST, METAFN_KIND_INFO_TINFO,}, +#line 497 "metafns.gperf" + {"is_rvalue_reference_qualified", METAFN_IS_RVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,}, #line 498 "metafns.gperf" + {"has_static_storage_duration", METAFN_HAS_STATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,}, +#line 681 "metafns.gperf" + {"remove_all_extents", METAFN_REMOVE_ALL_EXTENTS, METAFN_KIND_INFO_TINFO,}, +#line 503 "metafns.gperf" {"has_external_linkage", METAFN_HAS_EXTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,}, -#line 553 "metafns.gperf" - {"is_accessible", METAFN_IS_ACCESSIBLE, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, -#line 658 "metafns.gperf" - {"is_invocable_r_type", METAFN_IS_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,}, -#line 652 "metafns.gperf" +#line 684 "metafns.gperf" + {"remove_cvref", METAFN_REMOVE_CVREF, METAFN_KIND_INFO_TINFO,}, +#line 492 "metafns.gperf" + {"is_annotation", METAFN_IS_ANNOTATION, METAFN_KIND_BOOL_INFO,}, +#line 682 "metafns.gperf" + {"remove_pointer", METAFN_REMOVE_POINTER, METAFN_KIND_INFO_TINFO,}, +#line 496 "metafns.gperf" + {"is_lvalue_reference_qualified", METAFN_IS_LVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,}, +#line 660 "metafns.gperf" {"is_virtual_base_of_type", METAFN_IS_VIRTUAL_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 601 "metafns.gperf" - {"is_volatile_type", METAFN_IS_VOLATILE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 573 "metafns.gperf" - {"reflect_constant_string", METAFN_REFLECT_CONSTANT_STRING, METAFN_KIND_INFO_INPUT_RANGE,}, -#line 626 "metafns.gperf" - {"is_trivially_default_constructible_type", METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 532 "metafns.gperf" - {"is_literal_operator_template", METAFN_IS_LITERAL_OPERATOR_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 460 "metafns.gperf" - {"operator_of", METAFN_OPERATOR_OF, METAFN_KIND_OPERATORS_INFO,}, -#line 610 "metafns.gperf" +#line 584 "metafns.gperf" + {"is_data_member_spec", METAFN_IS_DATA_MEMBER_SPEC, METAFN_KIND_BOOL_INFO,}, +#line 618 "metafns.gperf" {"is_signed_type", METAFN_IS_SIGNED_TYPE, METAFN_KIND_BOOL_TINFO,}, #line 614 "metafns.gperf" - {"is_scoped_enum_type", METAFN_IS_SCOPED_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 622 "metafns.gperf" - {"is_swappable_with_type", METAFN_IS_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 561 "metafns.gperf" - {"subobjects_of", METAFN_SUBOBJECTS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, -#line 563 "metafns.gperf" - {"offset_of", METAFN_OFFSET_OF, METAFN_KIND_MEMBER_OFFSET_INFO,}, -#line 537 "metafns.gperf" - {"is_structured_binding", METAFN_IS_STRUCTURED_BINDING, METAFN_KIND_BOOL_INFO,}, -#line 478 "metafns.gperf" - {"is_final", METAFN_IS_FINAL, METAFN_KIND_BOOL_INFO,}, -#line 511 "metafns.gperf" - {"is_literal_operator", METAFN_IS_LITERAL_OPERATOR, METAFN_KIND_BOOL_INFO,}, -#line 671 "metafns.gperf" - {"make_unsigned", METAFN_MAKE_UNSIGNED, METAFN_KIND_INFO_TINFO,}, -#line 467 "metafns.gperf" - {"u8display_string_of", METAFN_U8DISPLAY_STRING_OF, METAFN_KIND_U8STRING_VIEW_INFO,}, -#line 644 "metafns.gperf" - {"has_virtual_destructor", METAFN_HAS_VIRTUAL_DESTRUCTOR, METAFN_KIND_BOOL_TINFO,}, -#line 600 "metafns.gperf" - {"is_const_type", METAFN_IS_CONST_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 483 "metafns.gperf" - {"is_explicit", METAFN_IS_EXPLICIT, METAFN_KIND_BOOL_INFO,}, -#line 576 "metafns.gperf" - {"is_data_member_spec", METAFN_IS_DATA_MEMBER_SPEC, METAFN_KIND_BOOL_INFO,}, -#line 501 "metafns.gperf" - {"is_complete_type", METAFN_IS_COMPLETE_TYPE, METAFN_KIND_BOOL_INFO,}, -#line 487 "metafns.gperf" - {"is_annotation", METAFN_IS_ANNOTATION, METAFN_KIND_BOOL_INFO,}, -#line 591 "metafns.gperf" - {"is_function_type", METAFN_IS_FUNCTION_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 552 "metafns.gperf" - {"return_type_of", METAFN_RETURN_TYPE_OF, METAFN_KIND_INFO_INFO,}, -#line 479 "metafns.gperf" - {"is_deleted", METAFN_IS_DELETED, METAFN_KIND_BOOL_INFO,}, -#line 471 "metafns.gperf" - {"constant_of", METAFN_CONSTANT_OF, METAFN_KIND_INFO_INFO,}, -#line 665 "metafns.gperf" - {"add_volatile", METAFN_ADD_VOLATILE, METAFN_KIND_INFO_TINFO,}, + {"is_abstract_type", METAFN_IS_ABSTRACT_TYPE, METAFN_KIND_BOOL_TINFO,}, #line 480 "metafns.gperf" - {"is_defaulted", METAFN_IS_DEFAULTED, METAFN_KIND_BOOL_INFO,}, -#line 645 "metafns.gperf" - {"has_unique_object_representations", METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS, METAFN_KIND_BOOL_TINFO,}, -#line 586 "metafns.gperf" - {"is_member_object_pointer_type", METAFN_IS_MEMBER_OBJECT_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 466 "metafns.gperf" + {"is_virtual", METAFN_IS_VIRTUAL, METAFN_KIND_BOOL_INFO,}, +#line 471 "metafns.gperf" {"display_string_of", METAFN_DISPLAY_STRING_OF, METAFN_KIND_STRING_VIEW_INFO,}, -#line 522 "metafns.gperf" - {"is_explicit_object_parameter", METAFN_IS_EXPLICIT_OBJECT_PARAMETER, METAFN_KIND_BOOL_INFO,}, -#line 541 "metafns.gperf" - {"is_static_member", METAFN_IS_STATIC_MEMBER, METAFN_KIND_BOOL_INFO,}, -#line 470 "metafns.gperf" - {"object_of", METAFN_OBJECT_OF, METAFN_KIND_INFO_INFO,}, -#line 609 "metafns.gperf" +#line 594 "metafns.gperf" + {"is_member_object_pointer_type", METAFN_IS_MEMBER_OBJECT_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 691 "metafns.gperf" + {"unwrap_ref_decay", METAFN_UNWRAP_REF_DECAY, METAFN_KIND_INFO_TINFO,}, +#line 617 "metafns.gperf" {"is_consteval_only_type", METAFN_IS_CONSTEVAL_ONLY_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 477 "metafns.gperf" - {"is_override", METAFN_IS_OVERRIDE, METAFN_KIND_BOOL_INFO,}, -#line 663 "metafns.gperf" - {"remove_cv", METAFN_REMOVE_CV, METAFN_KIND_INFO_TINFO,}, -#line 571 "metafns.gperf" - {"reflect_object", METAFN_REFLECT_OBJECT, METAFN_KIND_INFO_TEMPLATE_PARM_REF,}, -#line 581 "metafns.gperf" +#line 606 "metafns.gperf" + {"is_compound_type", METAFN_IS_COMPOUND_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 467 "metafns.gperf" + {"u8symbol_of", METAFN_U8SYMBOL_OF, METAFN_KIND_U8STRING_VIEW_OPERATORS,}, +#line 484 "metafns.gperf" + {"is_deleted", METAFN_IS_DELETED, METAFN_KIND_BOOL_INFO,}, +#line 589 "metafns.gperf" {"is_floating_point_type", METAFN_IS_FLOATING_POINT_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 463 "metafns.gperf" - {"has_identifier", METAFN_HAS_IDENTIFIER, METAFN_KIND_BOOL_INFO,}, -#line 667 "metafns.gperf" - {"remove_reference", METAFN_REMOVE_REFERENCE, METAFN_KIND_INFO_TINFO,}, -#line 555 "metafns.gperf" - {"has_inaccessible_bases", METAFN_HAS_INACCESSIBLE_BASES, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, -#line 499 "metafns.gperf" - {"has_c_language_linkage", METAFN_HAS_C_LANGUAGE_LINKAGE, METAFN_KIND_BOOL_INFO,}, -#line 556 "metafns.gperf" - {"has_inaccessible_subobjects", METAFN_HAS_INACCESSIBLE_SUBOBJECTS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, -#line 672 "metafns.gperf" - {"remove_extent", METAFN_REMOVE_EXTENT, METAFN_KIND_INFO_TINFO,}, -#line 554 "metafns.gperf" - {"has_inaccessible_nonstatic_data_members", METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, -#line 492 "metafns.gperf" - {"is_rvalue_reference_qualified", METAFN_IS_RVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,}, -#line 647 "metafns.gperf" - {"reference_converts_from_temporary", METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 590 "metafns.gperf" - {"is_class_type", METAFN_IS_CLASS_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 482 "metafns.gperf" - {"is_user_declared", METAFN_IS_USER_DECLARED, METAFN_KIND_BOOL_INFO,}, -#line 575 "metafns.gperf" - {"data_member_spec", METAFN_DATA_MEMBER_SPEC, METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS,}, -#line 491 "metafns.gperf" - {"is_lvalue_reference_qualified", METAFN_IS_LVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,}, -#line 494 "metafns.gperf" - {"has_thread_storage_duration", METAFN_HAS_THREAD_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,}, +#line 537 "metafns.gperf" + {"is_literal_operator_template", METAFN_IS_LITERAL_OPERATOR_TEMPLATE, METAFN_KIND_BOOL_INFO,}, #line 485 "metafns.gperf" - {"is_bit_field", METAFN_IS_BIT_FIELD, METAFN_KIND_BOOL_INFO,}, -#line 676 "metafns.gperf" - {"remove_cvref", METAFN_REMOVE_CVREF, METAFN_KIND_INFO_TINFO,}, -#line 681 "metafns.gperf" - {"invoke_result", METAFN_INVOKE_RESULT, METAFN_KIND_INFO_TINFO_REFLECTION_RANGET,}, -#line 547 "metafns.gperf" + {"is_defaulted", METAFN_IS_DEFAULTED, METAFN_KIND_BOOL_INFO,}, +#line 583 "metafns.gperf" + {"data_member_spec", METAFN_DATA_MEMBER_SPEC, METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS,}, +#line 475 "metafns.gperf" + {"object_of", METAFN_OBJECT_OF, METAFN_KIND_INFO_INFO,}, +#line 700 "metafns.gperf" + {"_S_exception_cvt_to_utf8", METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8, METAFN_KIND_U8STRING_VIEW_INPUT_RANGE,}, +#line 701 "metafns.gperf" + {"_S_exception_cvt_from_utf8", METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8, METAFN_KIND_STRING_VIEW_INPUT_RANGE,}, +#line 483 "metafns.gperf" + {"is_final", METAFN_IS_FINAL, METAFN_KIND_BOOL_INFO,}, +#line 516 "metafns.gperf" + {"is_literal_operator", METAFN_IS_LITERAL_OPERATOR, METAFN_KIND_BOOL_INFO,}, +#line 487 "metafns.gperf" + {"is_user_declared", METAFN_IS_USER_DECLARED, METAFN_KIND_BOOL_INFO,}, +#line 552 "metafns.gperf" {"has_template_arguments", METAFN_HAS_TEMPLATE_ARGUMENTS, METAFN_KIND_BOOL_INFO,}, -#line 510 "metafns.gperf" +#line 515 "metafns.gperf" {"is_operator_function", METAFN_IS_OPERATOR_FUNCTION, METAFN_KIND_BOOL_INFO,}, -#line 674 "metafns.gperf" - {"remove_pointer", METAFN_REMOVE_POINTER, METAFN_KIND_INFO_TINFO,}, -#line 546 "metafns.gperf" - {"dealias", METAFN_DEALIAS, METAFN_KIND_INFO_INFO,}, -#line 661 "metafns.gperf" - {"remove_const", METAFN_REMOVE_CONST, METAFN_KIND_INFO_TINFO,}, -#line 531 "metafns.gperf" - {"is_operator_function_template", METAFN_IS_OPERATOR_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,}, -#line 646 "metafns.gperf" - {"reference_constructs_from_temporary", METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,}, -#line 673 "metafns.gperf" - {"remove_all_extents", METAFN_REMOVE_ALL_EXTENTS, METAFN_KIND_INFO_TINFO,}, +#line 689 "metafns.gperf" + {"invoke_result", METAFN_INVOKE_RESULT, METAFN_KIND_INFO_TINFO_REFLECTION_RANGET,}, #line 582 "metafns.gperf" - {"is_array_type", METAFN_IS_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 496 "metafns.gperf" - {"has_internal_linkage", METAFN_HAS_INTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,}, -#line 670 "metafns.gperf" - {"make_signed", METAFN_MAKE_SIGNED, METAFN_KIND_INFO_TINFO,}, -#line 559 "metafns.gperf" - {"static_data_members_of", METAFN_STATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, -#line 598 "metafns.gperf" - {"is_compound_type", METAFN_IS_COMPOUND_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 606 "metafns.gperf" - {"is_abstract_type", METAFN_IS_ABSTRACT_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 577 "metafns.gperf" - {"define_aggregate", METAFN_DEFINE_AGGREGATE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,}, -#line 692 "metafns.gperf" - {"_S_exception_cvt_to_utf8", METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8, METAFN_KIND_U8STRING_VIEW_INPUT_RANGE,}, -#line 693 "metafns.gperf" - {"_S_exception_cvt_from_utf8", METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8, METAFN_KIND_STRING_VIEW_INPUT_RANGE,}, -#line 613 "metafns.gperf" - {"is_unbounded_array_type", METAFN_IS_UNBOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 603 "metafns.gperf" - {"is_standard_layout_type", METAFN_IS_STANDARD_LAYOUT_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 683 "metafns.gperf" - {"unwrap_ref_decay", METAFN_UNWRAP_REF_DECAY, METAFN_KIND_INFO_TINFO,}, -#line 574 "metafns.gperf" {"reflect_constant_array", METAFN_REFLECT_CONSTANT_ARRAY, METAFN_KIND_INFO_INPUT_RANGE,}, -#line 462 "metafns.gperf" - {"u8symbol_of", METAFN_U8SYMBOL_OF, METAFN_KIND_U8STRING_VIEW_OPERATORS,}, -#line 580 "metafns.gperf" +#line 504 "metafns.gperf" + {"has_c_language_linkage", METAFN_HAS_C_LANGUAGE_LINKAGE, METAFN_KIND_BOOL_INFO,}, +#line 536 "metafns.gperf" + {"is_operator_function_template", METAFN_IS_OPERATOR_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,}, +#line 588 "metafns.gperf" {"is_integral_type", METAFN_IS_INTEGRAL_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 653 "metafns.gperf" + {"has_unique_object_representations", METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS, METAFN_KIND_BOOL_TINFO,}, +#line 499 "metafns.gperf" + {"has_thread_storage_duration", METAFN_HAS_THREAD_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,}, #line 560 "metafns.gperf" - {"nonstatic_data_members_of", METAFN_NONSTATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, -#line 607 "metafns.gperf" - {"is_final_type", METAFN_IS_FINAL_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 662 "metafns.gperf" + {"has_inaccessible_bases", METAFN_HAS_INACCESSIBLE_BASES, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, +#line 561 "metafns.gperf" + {"has_inaccessible_subobjects", METAFN_HAS_INACCESSIBLE_SUBOBJECTS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, +#line 678 "metafns.gperf" + {"make_signed", METAFN_MAKE_SIGNED, METAFN_KIND_INFO_TINFO,}, +#line 559 "metafns.gperf" + {"has_inaccessible_nonstatic_data_members", METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,}, +#line 670 "metafns.gperf" {"remove_volatile", METAFN_REMOVE_VOLATILE, METAFN_KIND_INFO_TINFO,}, -#line 565 "metafns.gperf" - {"alignment_of", METAFN_ALIGNMENT_OF, METAFN_KIND_SIZE_T_INFO,}, +#line 579 "metafns.gperf" + {"reflect_object", METAFN_REFLECT_OBJECT, METAFN_KIND_INFO_TEMPLATE_PARM_REF,}, +#line 611 "metafns.gperf" + {"is_standard_layout_type", METAFN_IS_STANDARD_LAYOUT_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 685 "metafns.gperf" + {"decay", METAFN_DECAY, METAFN_KIND_INFO_TINFO,}, +#line 621 "metafns.gperf" + {"is_unbounded_array_type", METAFN_IS_UNBOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 568 "metafns.gperf" + {"nonstatic_data_members_of", METAFN_NONSTATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, +#line 597 "metafns.gperf" + {"is_union_type", METAFN_IS_UNION_TYPE, METAFN_KIND_BOOL_TINFO,}, #line 468 "metafns.gperf" - {"source_location_of", METAFN_SOURCE_LOCATION_OF, METAFN_KIND_SOURCE_LOCATION_INFO,}, -#line 690 "metafns.gperf" + {"has_identifier", METAFN_HAS_IDENTIFIER, METAFN_KIND_BOOL_INFO,}, +#line 567 "metafns.gperf" + {"static_data_members_of", METAFN_STATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,}, +#line 615 "metafns.gperf" + {"is_final_type", METAFN_IS_FINAL_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 551 "metafns.gperf" + {"dealias", METAFN_DEALIAS, METAFN_KIND_INFO_INFO,}, +#line 698 "metafns.gperf" {"annotations_of_with_type", METAFN_ANNOTATIONS_OF_WITH_TYPE, METAFN_KIND_VECTOR_INFO_INFO_INFO,}, -#line 465 "metafns.gperf" - {"u8identifier_of", METAFN_U8IDENTIFIER_OF, METAFN_KIND_U8STRING_VIEW_INFO,}, -#line 677 "metafns.gperf" - {"decay", METAFN_DECAY, METAFN_KIND_INFO_TINFO,}, -#line 689 "metafns.gperf" +#line 585 "metafns.gperf" + {"define_aggregate", METAFN_DEFINE_AGGREGATE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,}, +#line 490 "metafns.gperf" + {"is_bit_field", METAFN_IS_BIT_FIELD, METAFN_KIND_BOOL_INFO,}, +#line 697 "metafns.gperf" {"annotations_of", METAFN_ANNOTATIONS_OF, METAFN_KIND_VECTOR_INFO_INFO,}, -#line 589 "metafns.gperf" - {"is_union_type", METAFN_IS_UNION_TYPE, METAFN_KIND_BOOL_TINFO,}, -#line 481 "metafns.gperf" - {"is_user_provided", METAFN_IS_USER_PROVIDED, METAFN_KIND_BOOL_INFO,}, -#line 611 "metafns.gperf" - {"is_unsigned_type", METAFN_IS_UNSIGNED_TYPE, METAFN_KIND_BOOL_TINFO,} +#line 473 "metafns.gperf" + {"source_location_of", METAFN_SOURCE_LOCATION_OF, METAFN_KIND_SOURCE_LOCATION_INFO,}, +#line 573 "metafns.gperf" + {"alignment_of", METAFN_ALIGNMENT_OF, METAFN_KIND_SIZE_T_INFO,}, +#line 501 "metafns.gperf" + {"has_internal_linkage", METAFN_HAS_INTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,}, +#line 470 "metafns.gperf" + {"u8identifier_of", METAFN_U8IDENTIFIER_OF, METAFN_KIND_U8STRING_VIEW_INFO,}, +#line 619 "metafns.gperf" + {"is_unsigned_type", METAFN_IS_UNSIGNED_TYPE, METAFN_KIND_BOOL_TINFO,}, +#line 486 "metafns.gperf" + {"is_user_provided", METAFN_IS_USER_PROVIDED, METAFN_KIND_BOOL_INFO,} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop @@ -1076,81 +1087,71 @@ metafn_lookup::find (const char *str, size_t len) -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, -1, 2, 3, -1, 4, -1, - -1, -1, 5, -1, -1, -1, 6, 7, -1, 8, - 9, 10, 11, -1, 12, 13, 14, -1, -1, 15, - 16, -1, -1, -1, -1, 17, -1, -1, -1, 18, - -1, 19, 20, -1, 21, -1, -1, -1, -1, 22, - 23, 24, 25, -1, -1, 26, 27, -1, 28, -1, - 29, -1, 30, 31, -1, 32, -1, -1, -1, -1, - 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, - -1, 39, 40, -1, 41, -1, 42, -1, -1, 43, - -1, 44, 45, -1, -1, -1, -1, 46, -1, -1, - -1, -1, -1, -1, -1, -1, 47, 48, 49, -1, - 50, -1, -1, 51, 52, -1, 53, 54, 55, 56, - 57, 58, -1, 59, -1, -1, -1, 60, -1, -1, - -1, 61, -1, 62, -1, 63, 64, 65, 66, -1, - -1, 67, -1, -1, -1, -1, -1, 68, -1, -1, - -1, 69, 70, -1, 71, -1, -1, 72, -1, -1, - 73, -1, 74, 75, -1, 76, -1, 77, 78, -1, - -1, -1, -1, 79, 80, -1, -1, -1, 81, -1, - -1, -1, 82, 83, -1, -1, -1, -1, 84, -1, - 85, 86, -1, 87, 88, 89, 90, -1, 91, -1, - -1, 92, -1, -1, -1, -1, 93, 94, -1, -1, - -1, 95, 96, -1, -1, -1, 97, 98, -1, -1, - -1, -1, -1, -1, 99, -1, 100, -1, 101, -1, - -1, -1, -1, 102, 103, 104, 105, -1, -1, 106, - 107, 108, -1, -1, -1, -1, -1, -1, 109, 110, - 111, -1, 112, 113, -1, -1, -1, -1, 114, -1, - -1, 115, 116, 117, 118, -1, -1, -1, -1, 119, - -1, -1, -1, 120, -1, -1, 121, -1, -1, 122, - 123, -1, -1, 124, -1, -1, 125, -1, -1, -1, - -1, 126, -1, 127, -1, -1, -1, -1, 128, 129, - 130, -1, -1, 131, 132, 133, 134, 135, -1, 136, - -1, -1, 137, -1, 138, 139, -1, 140, 141, 142, - -1, 143, 144, 145, 146, -1, 147, -1, -1, -1, - -1, 148, 149, -1, 150, -1, 151, -1, 152, 153, - -1, 154, -1, -1, -1, -1, 155, 156, 157, 158, - -1, -1, -1, 159, 160, -1, -1, 161, -1, 162, - -1, -1, 163, 164, -1, -1, -1, -1, -1, -1, - -1, -1, 165, -1, 166, 167, 168, -1, -1, -1, - -1, 169, 170, 171, 172, -1, -1, 173, -1, -1, - -1, -1, -1, -1, 174, -1, 175, -1, -1, 176, - -1, -1, 177, -1, -1, 178, -1, -1, -1, -1, - -1, -1, -1, 179, -1, -1, -1, 180, -1, -1, - -1, -1, 181, -1, 182, 183, -1, 184, -1, 185, - -1, -1, 186, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 187, -1, 188, -1, -1, -1, 189, 190, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 191, - -1, 192, -1, -1, -1, -1, 193, -1, 194, 195, - 196, 197, -1, 198, -1, -1, -1, -1, -1, 199, - 200, -1, -1, 201, -1, -1, -1, -1, -1, -1, - 202, 203, -1, -1, 204, -1, -1, -1, -1, -1, - -1, 205, 206, -1, -1, -1, -1, -1, -1, 207, - 208, 209, -1, -1, -1, 210, -1, -1, -1, -1, - -1, -1, 211, -1, -1, -1, -1, 212, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 213, -1, -1, -1, 214, -1, 215, 216, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 217, -1, - -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, - -1, -1, -1, 219, -1, -1, -1, 220, -1, -1, - -1, -1, 221, -1, -1, -1, -1, -1, -1, -1, - 222, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 223, -1, -1, -1, -1, -1, -1, 224, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 225, -1, -1, -1, -1, -1, 226, -1, - -1, -1, -1, -1, 227, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 228, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 229, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, 5, -1, -1, 6, 7, 8, -1, 9, + 10, 11, 12, -1, 13, 14, 15, 16, -1, 17, + 18, -1, -1, -1, -1, 19, 20, -1, 21, 22, + -1, 23, 24, -1, 25, -1, -1, -1, -1, 26, + -1, 27, 28, -1, 29, 30, 31, 32, 33, -1, + 34, -1, 35, 36, -1, -1, -1, -1, -1, -1, + 37, -1, 38, 39, 40, 41, -1, -1, -1, -1, + 42, 43, 44, -1, 45, -1, 46, -1, 47, -1, + -1, 48, 49, -1, -1, -1, -1, 50, -1, -1, + -1, -1, -1, 51, -1, -1, 52, 53, 54, -1, + -1, -1, -1, 55, 56, 57, 58, -1, 59, -1, + -1, 60, -1, -1, 61, 62, -1, 63, -1, -1, + -1, 64, -1, 65, -1, -1, 66, -1, 67, -1, + -1, 68, -1, 69, -1, -1, 70, -1, -1, -1, + 71, -1, -1, 72, 73, 74, 75, -1, -1, -1, + 76, 77, 78, -1, 79, 80, 81, 82, 83, -1, + 84, 85, 86, -1, -1, 87, -1, -1, 88, 89, + 90, 91, -1, -1, -1, -1, 92, -1, 93, 94, + 95, 96, -1, 97, 98, 99, -1, -1, 100, 101, + 102, -1, -1, -1, -1, -1, -1, 103, -1, -1, + -1, 104, -1, 105, -1, 106, 107, -1, 108, -1, + 109, 110, 111, -1, -1, -1, 112, 113, -1, 114, + -1, 115, -1, 116, 117, -1, 118, -1, -1, 119, + 120, 121, 122, -1, 123, -1, -1, -1, 124, 125, + -1, -1, -1, -1, -1, -1, 126, -1, -1, -1, + -1, -1, 127, 128, 129, -1, 130, 131, -1, -1, + -1, -1, -1, 132, 133, -1, -1, 134, 135, 136, + -1, 137, 138, -1, -1, -1, 139, 140, -1, -1, + -1, -1, -1, 141, -1, -1, 142, -1, 143, -1, + 144, -1, -1, 145, 146, 147, 148, -1, 149, -1, + 150, 151, 152, 153, -1, -1, 154, 155, 156, 157, + 158, -1, 159, 160, -1, -1, 161, -1, -1, 162, + -1, 163, -1, -1, 164, 165, 166, 167, 168, -1, + -1, -1, -1, 169, -1, 170, 171, -1, -1, -1, + -1, 172, -1, -1, 173, -1, 174, -1, -1, -1, + -1, -1, 175, -1, -1, 176, 177, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 178, 179, 180, + -1, -1, -1, -1, 181, -1, -1, -1, -1, 182, + -1, -1, -1, -1, -1, 183, -1, -1, -1, 184, + -1, 185, 186, 187, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, 189, -1, -1, 190, + -1, -1, -1, -1, 191, 192, 193, -1, -1, 194, + -1, -1, 195, -1, -1, -1, 196, -1, 197, -1, + -1, 198, -1, 199, -1, -1, -1, -1, -1, 200, + 201, 202, 203, -1, 204, -1, -1, 205, -1, -1, + 206, -1, 207, -1, -1, -1, -1, -1, 208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 231, + -1, -1, -1, 209, -1, -1, -1, -1, -1, 210, + -1, 211, -1, -1, -1, -1, -1, -1, 212, -1, + -1, -1, -1, 213, -1, -1, -1, -1, -1, -1, + -1, 214, -1, -1, -1, 215, -1, -1, -1, 216, + 217, -1, -1, 218, -1, -1, -1, -1, 219, -1, + -1, -1, -1, -1, -1, -1, -1, 220, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 221, -1, -1, -1, -1, + 222, -1, -1, -1, -1, 223, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 224, -1, + -1, -1, 225, 226, -1, -1, -1, -1, 227, -1, + 228, -1, -1, -1, -1, -1, -1, -1, 229, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 232, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 231, -1, -1, 232, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 233, -1, -1, 234, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1160,9 +1161,10 @@ metafn_lookup::find (const char *str, size_t len) -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 235, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 233 + 236 }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 020a70c11121..ab88488be4b5 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -29794,12 +29794,19 @@ value_dependent_expression_p (tree expression) is enclosed by a scope corresponding to a templated entity. */ if (flag_reflection && fn - && metafunction_p (fn) - && id_equal (DECL_NAME (fn), "current") - && DECL_CLASS_SCOPE_P (fn) - && id_equal (TYPE_IDENTIFIER (DECL_CONTEXT (fn)), - "access_context")) - return true; + && metafunction_p (fn)) + { + if (id_equal (DECL_NAME (fn), "current") + && DECL_CLASS_SCOPE_P (fn) + && id_equal (TYPE_IDENTIFIER (DECL_CONTEXT (fn)), + "access_context")) + return true; + /* Similarly for these 3 metafns. */ + if (id_equal (DECL_NAME (fn), "current_function") + || id_equal (DECL_NAME (fn), "current_class") + || id_equal (DECL_NAME (fn), "current_namespace")) + return true; + } return false; } diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc index 145b04a60068..8687e3f8fe3c 100644 --- a/gcc/cp/reflect.cc +++ b/gcc/cp/reflect.cc @@ -6239,11 +6239,11 @@ eval_reflect_constant_array (location_t loc, const constexpr_ctx *ctx, return get_reflection_raw (loc, decl); } -/* Process std::meta::access_context::current. */ +/* Return CURRENT-SCOPE(P). */ static tree -eval_access_context_current (location_t loc, const constexpr_ctx *ctx, - tree call, bool *non_constant_p) +reflect_current_scope (location_t loc, const constexpr_ctx *ctx, tree call, + bool *non_constant_p, const char *name) { tree scope = cxx_constexpr_caller (ctx); /* Ignore temporary current_function_decl changes caused by @@ -6262,8 +6262,8 @@ eval_access_context_current (location_t loc, const constexpr_ctx *ctx, /* Outside of functions limit this to manifestly constant-evaluation so that we don't fold it prematurely. */ if (!cxx_constexpr_quiet_p (ctx)) - error_at (loc, "%<access_context::current%> used outside of " - "manifestly constant-evaluation"); + error_at (loc, "%qs used outside of manifestly constant-evaluation", + name); *non_constant_p = true; return call; } @@ -6279,6 +6279,63 @@ eval_access_context_current (location_t loc, const constexpr_ctx *ctx, && (lam = CLASSTYPE_LAMBDA_EXPR (CP_DECL_CONTEXT (scope))) && LAMBDA_EXPR_CONSTEVAL_BLOCK_P (lam)) scope = CP_TYPE_CONTEXT (CP_DECL_CONTEXT (scope)); + return scope; +} + +/* Process std::meta::current_function. */ + +static tree +eval_current_function (location_t loc, const constexpr_ctx *ctx, + tree call, bool *non_constant_p, tree *jump_target, + tree fun) +{ + tree scope = reflect_current_scope (loc, ctx, call, non_constant_p, + "std::meta::current_function"); + if (TREE_CODE (scope) != FUNCTION_DECL) + throw_exception (loc, ctx, "current scope does not represent a function", + fun, non_constant_p, jump_target); + return get_reflection_raw (loc, scope); +} + +/* Process std::meta::current_class. */ + +static tree +eval_current_class (location_t loc, const constexpr_ctx *ctx, + tree call, bool *non_constant_p, tree *jump_target, + tree fun) +{ + tree scope = reflect_current_scope (loc, ctx, call, non_constant_p, + "std::meta::current_class"); + if (TREE_CODE (scope) == FUNCTION_DECL + && DECL_CONTEXT (scope) + && TYPE_P (DECL_CONTEXT (scope))) + scope = DECL_CONTEXT (scope); + if (!CLASS_TYPE_P (scope)) + throw_exception (loc, ctx, "current scope does not represent a class" + " nor a member function", + fun, non_constant_p, jump_target); + return get_reflection_raw (loc, scope); +} + +/* Process std::meta::current_namespace. */ + +static tree +eval_current_namespace (location_t loc, const constexpr_ctx *ctx, + tree call, bool *non_constant_p) +{ + tree scope = reflect_current_scope (loc, ctx, call, non_constant_p, + "std::meta::current_namespace"); + return get_reflection_raw (loc, decl_namespace_context (scope)); +} + +/* Process std::meta::access_context::current. */ + +static tree +eval_access_context_current (location_t loc, const constexpr_ctx *ctx, + tree call, bool *non_constant_p) +{ + tree scope = reflect_current_scope (loc, ctx, call, non_constant_p, + "std::meta::access_context::current"); tree access_context = TREE_TYPE (call); if (TREE_CODE (access_context) != RECORD_TYPE) { @@ -7693,6 +7750,14 @@ process_metafunction (const constexpr_ctx *ctx, tree fun, tree call, return eval_has_inaccessible_subobjects (loc, ctx, h, expr, call, non_constant_p, jump_target, fun); + case METAFN_CURRENT_FUNCTION: + return eval_current_function (loc, ctx, call, non_constant_p, + jump_target, fun); + case METAFN_CURRENT_CLASS: + return eval_current_class (loc, ctx, call, non_constant_p, + jump_target, fun); + case METAFN_CURRENT_NAMESPACE: + return eval_current_namespace (loc, ctx, call, non_constant_p); case METAFN_MEMBERS_OF: return eval_members_of (loc, ctx, h, expr, call, non_constant_p, jump_target, fun); diff --git a/gcc/testsuite/g++.dg/reflect/current_class1.C b/gcc/testsuite/g++.dg/reflect/current_class1.C new file mode 100644 index 000000000000..4b0c17d47461 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/current_class1.C @@ -0,0 +1,70 @@ +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } +// Test std::meta::current_class. + +#include <meta> + +using namespace std::meta; + +consteval info +foo (info x = current_class ()) +{ + try + { + current_class (); + } + catch (const std::meta::exception &) + { + return x; + } + throw 1; +} + +static_assert (foo (^^std) == ^^std); + +struct T +{ + static_assert (current_class () == ^^T); + static_assert (foo () == ^^T); + info t = current_class (); +}; + +struct U +{ + static_assert (current_class () == ^^U); + static_assert (foo () == ^^U); + consteval U () {} + info u = current_class (); +}; + +struct V : U +{ + static_assert (current_class () == ^^V); + static_assert (foo () == ^^V); + using U::U; + consteval { + static_assert (current_class () == ^^V); + static_assert (foo () == ^^V); + consteval { + static_assert (current_class () == ^^V); + static_assert (foo () == ^^V); + } + } + void baz () + { + static_assert (current_class () == ^^V); + static_assert (foo () == ^^V); + static_assert (T {}.t == ^^V); + static_assert (U {}.u == ^^U); + } +}; + +void +bar () +{ + auto l = [] () { + int v = 0; + static_assert (current_class () == parent_of (parent_of (^^v))); + static_assert (parent_of (current_class ()) == ^^bar); + }; +} diff --git a/gcc/testsuite/g++.dg/reflect/current_class2.C b/gcc/testsuite/g++.dg/reflect/current_class2.C new file mode 100644 index 000000000000..e7c2e3370836 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/current_class2.C @@ -0,0 +1,73 @@ +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } +// Test std::meta::current_class. + +#include <meta> + +using namespace std::meta; + +constexpr auto a = current_class (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + +consteval info +foo (info x = current_class ()) +{ + return x; +} + +void +qux () +{ + static constexpr auto a = current_class (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } +} + +static_assert (foo (^^std) == ^^std); +constexpr auto b = foo (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + +namespace N +{ + struct S {}; + constexpr auto c = foo (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + namespace M + { + constexpr auto d = current_class (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + consteval { + auto e = foo (); + consteval { + auto f = current_class (); + } // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + } // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + } +} + +struct T +{ + info t = current_class (); +}; + +void +bar () +{ + static constexpr auto g = current_class (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + static constexpr auto h = T{}.t; // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + auto l2 = [] () -> int (&) [current_class () != ^^bar ? 2 : 3] { // { dg-error "size of array is not an integral constant-expression" } + static int a[2]; + return a; // { dg-error "invalid initialization of reference of type" } + }; +} + +consteval { + auto a = current_class (); + consteval { + auto b = foo (); + } // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } +} // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a class nor a member function'" } + +namespace O +{ + int a[2]; + auto + foo () -> int (&) [current_class () != ^^O ? 2 : 3] // { dg-error "size of array is not an integral constant-expression" } + { + return a; // { dg-error "invalid initialization of reference of type" } + } +} diff --git a/gcc/testsuite/g++.dg/reflect/current_function1.C b/gcc/testsuite/g++.dg/reflect/current_function1.C new file mode 100644 index 000000000000..c7d2ee4deb5f --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/current_function1.C @@ -0,0 +1,76 @@ +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } +// Test std::current_function. + +#include <meta> + +using namespace std::meta; + +consteval info +foo (info x = current_function ()) +{ + static_assert (current_function () == ^^foo); + return x; +} + +static_assert (foo (^^std) == ^^std); + +void +qux () +{ + static_assert (foo () == ^^qux); +} + +struct T +{ + info t = current_function (); +}; + +struct U +{ + consteval U () {} + info u = current_function (); +}; + +struct V : U +{ + using U::U; + info v = current_function (); +}; + +void +bar () +{ + static_assert (current_function () == ^^bar); + static_assert (foo (^^foo) == ^^foo); + static_assert (foo () == ^^bar); + static_assert (T {}.t == ^^bar); + consteval { + static_assert (current_function () == ^^bar); + consteval { + static_assert (current_function () == ^^bar); + } + } + auto l = [] () { + int v = 0; + static_assert (current_function () == parent_of (^^v)); + static_assert (parent_of (parent_of (current_function ())) == ^^bar); + }; + auto l2 = [] () -> int (&) [current_function () == ^^bar ? 2 : 3] { + static int a[2]; + return a; + }; +} + +consteval bool +baz () +{ + constexpr U u; + static_assert (is_constructor (u.u) && parent_of (u.u) == ^^U); + constexpr V v; + static_assert (is_constructor (v.u) && parent_of (v.u) == ^^U); + static_assert (is_constructor (v.v) && parent_of (v.v) == ^^V); + return true; +} + +static_assert (baz ()); diff --git a/gcc/testsuite/g++.dg/reflect/current_function2.C b/gcc/testsuite/g++.dg/reflect/current_function2.C new file mode 100644 index 000000000000..05277c076c7f --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/current_function2.C @@ -0,0 +1,78 @@ +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } +// Test std::meta::access_context. + +#include <meta> + +using namespace std::meta; + +constexpr auto a = current_function (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + +consteval info +foo (info x = current_function ()) +{ + return x; +} + +static_assert (foo (^^std) == ^^std); +constexpr auto b = foo (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + +namespace N +{ + constexpr auto c = current_function (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + constexpr auto d = foo (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + namespace M + { + constexpr auto e = current_function (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + constexpr auto f = foo (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + consteval { + constexpr auto g = current_function (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + consteval { + constexpr auto h = foo (); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + } + } + } +} + +struct T +{ + static_assert (current_function () != ^^T); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + // { dg-error "non-constant condition for static assertion" "" { target *-*-* } .-1 } + static_assert (foo () != ^^T); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + info t = current_function (); // { dg-error "non-constant condition for static assertion" "" { target *-*-* } .-1 } +}; + +struct U +{ + consteval U () {} + info u = current_function (); +}; + +struct V : U +{ + using U::U; + info v = current_function (); + consteval { + static_assert (current_function () != ^^V); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + consteval { // { dg-error "non-constant condition for static assertion" "" { target *-*-* } .-1 } + static_assert (current_function () != ^^V); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + } // { dg-error "non-constant condition for static assertion" "" { target *-*-* } .-1 } + } +}; + +consteval { + static_assert (current_function () != ^^::); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + consteval { // { dg-error "non-constant condition for static assertion" "" { target *-*-* } .-1 } + static_assert (current_function () != ^^::); // { dg-error "uncaught exception of type 'std::meta::exception'; 'what\\\(\\\)': 'current scope does not represent a function'" } + } // { dg-error "non-constant condition for static assertion" "" { target *-*-* } .-1 } +} + +namespace O +{ + int a[2]; + auto + foo () -> int (&) [current_function () != ^^O ? 2 : 3] // { dg-error "size of array is not an integral constant-expression" } + { + return a; // { dg-error "invalid initialization of reference of type" } + } +} diff --git a/gcc/testsuite/g++.dg/reflect/current_namespace1.C b/gcc/testsuite/g++.dg/reflect/current_namespace1.C new file mode 100644 index 000000000000..e56425fa602b --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/current_namespace1.C @@ -0,0 +1,93 @@ +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } +// Test std::meta::current_namespace. + +#include <meta> + +using namespace std::meta; + +static_assert (current_namespace () == ^^::); + +consteval info +foo (info x = current_namespace ()) +{ + static_assert (current_namespace () == ^^::); + return x; +} + +static_assert (foo (^^std) == ^^std); +static_assert (foo () == ^^::); + +namespace N +{ + static_assert (foo () == ^^N); + static_assert (current_namespace () == ^^N); + namespace M + { + static_assert (foo () == ^^M); + static_assert (current_namespace () == ^^M); + consteval { + static_assert (current_namespace () == ^^M); + consteval { + static_assert (current_namespace () == ^^M); + } + } + } +} + +struct T +{ + static_assert (current_namespace () == ^^::); + static_assert (foo () == ^^::); + info t = current_namespace (); +}; + +namespace O +{ + struct T + { + static_assert (current_namespace () == ^^O); + static_assert (foo () == ^^O); + info t = current_namespace (); + }; +} + +void +bar () +{ + static_assert (current_namespace () == ^^::); + static_assert (T {}.t == ^^::); + static_assert (O::T {}.t == ^^::); + static_assert (foo (^^foo) == ^^foo); + static_assert (foo () == ^^::); +} + +namespace P +{ + void + bar () + { + static_assert (current_namespace () == ^^P); + static_assert (T {}.t == ^^P); + static_assert (O::T {}.t == ^^P); + static_assert (foo (^^foo) == ^^foo); + static_assert (foo () == ^^P); + } +} + +consteval { + static_assert (current_namespace () == ^^::); + consteval { + static_assert (current_namespace () == ^^::); + } +} + +namespace Q +{ + int a[2]; + auto + foo () -> int (&) [current_namespace () == ^^Q ? 2 : 3] + { + return a; + } +} diff --git a/libstdc++-v3/include/std/meta b/libstdc++-v3/include/std/meta index fc587a92e4f9..4e438e8b6536 100644 --- a/libstdc++-v3/include/std/meta +++ b/libstdc++-v3/include/std/meta @@ -342,6 +342,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION consteval bool has_inaccessible_bases(info, access_context); consteval bool has_inaccessible_subobjects(info, access_context); + // [meta.reflection.scope], scope identification + consteval info current_function(); + consteval info current_class(); + consteval info current_namespace(); + // [meta.reflection.member.queries], reflection member queries consteval vector<info> members_of(info, access_context); consteval vector<info> bases_of(info, access_context); diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in index 210cbede5cfd..1e174b85af1b 100644 --- a/libstdc++-v3/src/c++23/std.cc.in +++ b/libstdc++-v3/src/c++23/std.cc.in @@ -2195,6 +2195,9 @@ export namespace std using std::meta::has_inaccessible_nonstatic_data_members; using std::meta::has_inaccessible_bases; using std::meta::has_inaccessible_subobjects; + using std::meta::current_function; + using std::meta::current_class; + using std::meta::current_namespace; using std::meta::members_of; using std::meta::bases_of; using std::meta::static_data_members_of;
