[gcc r16-8328] c++, libstdc++: Implement P4156R0 - Rename meta::has_ellipsis_parameter to meta::is_vararg_function

Jakub Jelinek jakub@gcc.gnu.org
Mon Mar 30 10:03:40 GMT 2026


https://gcc.gnu.org/g:8c4f5e682f2f585bc1533e6c60a9a4eda4de8669

commit r16-8328-g8c4f5e682f2f585bc1533e6c60a9a4eda4de8669
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Mar 30 12:02:47 2026 +0200

    c++, libstdc++: Implement P4156R0 - Rename meta::has_ellipsis_parameter to meta::is_vararg_function
    
    Unhappy about the old and new names, as a function type is not a function,
    but ces't la vie.
    
    2026-03-30  Jakub Jelinek  <jakub@redhat.com>
    
    gcc/cp/
            * metafns.gperf (enum metafn_code): Remove
            METAFN_HAS_ELLIPSIS_PARAMETER, add METAFN_IS_VARARG_FUNCTION.
            (has_ellipsis_parameter): Remove.
            (is_vararg_function): Add.
            * reflect.cc (eval_has_ellipsis_parameter): Rename to ...
            (eval_is_vararg_function): ... this.  Adjust function comment.
            (process_metafunction): Handle METAFN_IS_VARARG_FUNCTION
            instead of METAFN_HAS_ELLIPSIS_PARAMETER.
            * metafns.h: Regenerate.
    gcc/testsuite/
            * g++.dg/reflect/has_ellipsis_parameter1.C: Rename to ...
            * g++.dg/reflect/is_vararg_function1.C: this.  New test.  Rename
            has_ellipsis_parameter to is_vararg_function everywhere.
    libstdc++-v3/
            * include/std/meta (has_ellipsis_parameter): Rename to ...
            (is_vararg_function): ... this.  New declaration.
            * src/c++23/std.cc.in: Remove std::meta::has_ellipsis_parameter
            export, add std::meta::is_vararg_function export.

Diff:
---
 gcc/cp/metafns.gperf                               |   4 +-
 gcc/cp/metafns.h                                   |  54 ++++----
 gcc/cp/reflect.cc                                  |  12 +-
 .../g++.dg/reflect/has_ellipsis_parameter1.C       | 148 ---------------------
 gcc/testsuite/g++.dg/reflect/is_vararg_function1.C | 148 +++++++++++++++++++++
 libstdc++-v3/include/std/meta                      |   2 +-
 libstdc++-v3/src/c++23/std.cc.in                   |   2 +-
 7 files changed, 185 insertions(+), 185 deletions(-)

diff --git a/gcc/cp/metafns.gperf b/gcc/cp/metafns.gperf
index 2559384fce3e..c395291e0115 100644
--- a/gcc/cp/metafns.gperf
+++ b/gcc/cp/metafns.gperf
@@ -86,7 +86,7 @@ enum metafn_code {
   METAFN_IS_FUNCTION_PARAMETER,
   METAFN_IS_EXPLICIT_OBJECT_PARAMETER,
   METAFN_HAS_DEFAULT_ARGUMENT,
-  METAFN_HAS_ELLIPSIS_PARAMETER,
+  METAFN_IS_VARARG_FUNCTION,
   METAFN_IS_TEMPLATE,
   METAFN_IS_FUNCTION_TEMPLATE,
   METAFN_IS_VARIABLE_TEMPLATE,
@@ -521,7 +521,7 @@ is_destructor, METAFN_IS_DESTRUCTOR, METAFN_KIND_BOOL_INFO,
 is_function_parameter, METAFN_IS_FUNCTION_PARAMETER, METAFN_KIND_BOOL_INFO,
 is_explicit_object_parameter, METAFN_IS_EXPLICIT_OBJECT_PARAMETER, METAFN_KIND_BOOL_INFO,
 has_default_argument, METAFN_HAS_DEFAULT_ARGUMENT, METAFN_KIND_BOOL_INFO,
-has_ellipsis_parameter, METAFN_HAS_ELLIPSIS_PARAMETER, METAFN_KIND_BOOL_INFO,
+is_vararg_function, METAFN_IS_VARARG_FUNCTION, METAFN_KIND_BOOL_INFO,
 is_template, METAFN_IS_TEMPLATE, METAFN_KIND_BOOL_INFO,
 is_function_template, METAFN_IS_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,
 is_variable_template, METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,
diff --git a/gcc/cp/metafns.h b/gcc/cp/metafns.h
index 62512fec59a0..5beabdcef13f 100644
--- a/gcc/cp/metafns.h
+++ b/gcc/cp/metafns.h
@@ -114,7 +114,7 @@ enum metafn_code {
   METAFN_IS_FUNCTION_PARAMETER,
   METAFN_IS_EXPLICIT_OBJECT_PARAMETER,
   METAFN_HAS_DEFAULT_ARGUMENT,
-  METAFN_HAS_ELLIPSIS_PARAMETER,
+  METAFN_IS_VARARG_FUNCTION,
   METAFN_IS_TEMPLATE,
   METAFN_IS_FUNCTION_TEMPLATE,
   METAFN_IS_VARIABLE_TEMPLATE,
@@ -511,7 +511,7 @@ metafn_lookup::hash (const char *str, size_t len)
       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,  20, 918, 918, 918, 918, 918, 918, 918,
+       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,
@@ -630,12 +630,8 @@ metafn_lookup::find (const char *str, size_t len)
       {"is_nothrow_move_constructible_type", METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
 #line 527 "metafns.gperf"
       {"is_variable_template", METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,},
-#line 686 "metafns.gperf"
-      {"variant_size", METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,},
 #line 579 "metafns.gperf"
       {"is_null_pointer_type", METAFN_IS_NULL_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},
-#line 504 "metafns.gperf"
-      {"is_type", METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,},
 #line 472 "metafns.gperf"
       {"is_public", METAFN_IS_PUBLIC, METAFN_KIND_BOOL_INFO,},
 #line 484 "metafns.gperf"
@@ -690,6 +686,10 @@ metafn_lookup::find (const char *str, size_t len)
       {"symbol_of", METAFN_SYMBOL_OF, METAFN_KIND_STRING_VIEW_OPERATORS,},
 #line 617 "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"
       {"is_constructible_type", METAFN_IS_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},
 #line 495 "metafns.gperf"
@@ -698,8 +698,8 @@ metafn_lookup::find (const char *str, size_t len)
       {"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 506 "metafns.gperf"
-      {"is_type_alias", METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,},
+#line 524 "metafns.gperf"
+      {"is_vararg_function", METAFN_IS_VARARG_FUNCTION, METAFN_KIND_BOOL_INFO,},
 #line 515 "metafns.gperf"
       {"is_copy_constructor", METAFN_IS_COPY_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},
 #line 551 "metafns.gperf"
@@ -754,8 +754,8 @@ metafn_lookup::find (const char *str, size_t len)
       {"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 524 "metafns.gperf"
-      {"has_ellipsis_parameter", METAFN_HAS_ELLIPSIS_PARAMETER, METAFN_KIND_BOOL_INFO,},
+#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"
@@ -1042,8 +1042,6 @@ metafn_lookup::find (const char *str, size_t len)
       {"is_integral_type", METAFN_IS_INTEGRAL_TYPE, METAFN_KIND_BOOL_TINFO,},
 #line 560 "metafns.gperf"
       {"nonstatic_data_members_of", METAFN_NONSTATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},
-#line 677 "metafns.gperf"
-      {"decay", METAFN_DECAY, METAFN_KIND_INFO_TINFO,},
 #line 607 "metafns.gperf"
       {"is_final_type", METAFN_IS_FINAL_TYPE, METAFN_KIND_BOOL_TINFO,},
 #line 662 "metafns.gperf"
@@ -1056,6 +1054,8 @@ metafn_lookup::find (const char *str, size_t len)
       {"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"
       {"annotations_of", METAFN_ANNOTATIONS_OF, METAFN_KIND_VECTOR_INFO_INFO,},
 #line 589 "metafns.gperf"
@@ -1078,21 +1078,21 @@ metafn_lookup::find (const char *str, size_t len)
        -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,  17,  -1,  -1,  18,  -1,  19,  -1,  20,
-       -1,  21,  22,  -1,  23,  -1,  -1,  -1,  -1,  24,
-       25,  26,  27,  -1,  -1,  28,  29,  -1,  30,  -1,
-       31,  -1,  32,  33,  -1,  34,  -1,  -1,  -1,  -1,
-       35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,
-       -1,  41,  42,  -1,  43,  -1,  44,  -1,  -1,  45,
-       -1,  46,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       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,  79,
-       -1,  -1,  -1,  -1,  80,  -1,  -1,  -1,  81,  -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,
@@ -1135,13 +1135,13 @@ metafn_lookup::find (const char *str, size_t len)
        -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, 223,  -1,  -1,  -1,
-       -1,  -1, 224,  -1,  -1,  -1,  -1,  -1,  -1, 225,
-       -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1, 226,  -1,  -1,  -1,  -1,  -1, 227,  -1,
-       -1,  -1,  -1,  -1, 228,  -1,  -1,  -1,  -1,  -1,
-       -1,  -1,  -1,  -1,  -1, 229,  -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,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
diff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc
index e4313ae5e987..c6f4f835b6e7 100644
--- a/gcc/cp/reflect.cc
+++ b/gcc/cp/reflect.cc
@@ -1759,12 +1759,12 @@ eval_has_default_argument (tree r, reflect_kind kind)
     return boolean_false_node;
 }
 
-/* Process std::meta::has_ellipsis_parameter.
-   Returns: true if r represents a function or function type that has an
-   ellipsis in its parameter-type-list.  Otherwise, false.  */
+/* Process std::meta::is_vararg_function.
+   Returns: true if r represents a function or function type that
+   is a vararg function.  Otherwise, false.  */
 
 static tree
-eval_has_ellipsis_parameter (tree r)
+eval_is_vararg_function (tree r)
 {
   r = MAYBE_BASELINK_FUNCTIONS (r);
   if (TREE_CODE (r) == FUNCTION_DECL)
@@ -7612,8 +7612,8 @@ process_metafunction (const constexpr_ctx *ctx, tree fun, tree call,
       return eval_is_explicit_object_parameter (h, kind);
     case METAFN_HAS_DEFAULT_ARGUMENT:
       return eval_has_default_argument (h, kind);
-    case METAFN_HAS_ELLIPSIS_PARAMETER:
-      return eval_has_ellipsis_parameter (h);
+    case METAFN_IS_VARARG_FUNCTION:
+      return eval_is_vararg_function (h);
     case METAFN_IS_TEMPLATE:
       return eval_is_template (h);
     case METAFN_IS_FUNCTION_TEMPLATE:
diff --git a/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C b/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C
deleted file mode 100644
index e749ce5b066c..000000000000
--- a/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C
+++ /dev/null
@@ -1,148 +0,0 @@
-// { dg-do compile { target c++26 } }
-// { dg-additional-options "-freflection" }
-// Test std::meta::has_ellipsis_parameter.
-
-#include <meta>
-
-using namespace std::meta;
-
-constexpr info null_reflection;
-struct cls {
-  int dm;
-  static int static_dm;
-  void mem_fun ();
-  void mem_fun2 (int, ...);
-  void mem_fun3 (...);
-  void mem_fun4 (int);
-  static void static_mem_fun ();
-  static void static_mem_fun2 (int, long, ...);
-  static void static_mem_fun3 (...);
-  static void static_mem_fun4 (long);
-  int &ref_dm = dm;
-  using type = int;
-} cls_var;
-union onion { };
-static union { int anon; };
-using alias = cls;
-void fun ();
-void fun2 (int, ...);
-void fun3 (...);
-void fun4 (int, int);
-int var;
-int &ref = var;
-int &&rref = 42;
-int *ptr = &var;
-namespace ns {}
-namespace ns_alias = ns;
-enum Enum { A };
-enum class Enum_class { A };
-using funt = int ();
-using funt2 = int (int, ...);
-using funt3 = int (...);
-using funt4 = int (int, long);
-
-template<typename> struct incomplete_cls;
-template<typename> struct cls_tmpl {};
-template<typename> void fun_tmpl ();
-template<typename> void fun_tmpl2 (int, ...);
-template<typename> void fun_tmpl3 (...);
-template<typename> void fun_tmpl4 (long, int);
-template<typename> concept conc = requires { true; };
-template<typename> int var_tmpl;
-template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
-
-int arr[] = { 42 };
-using inc_arr = int[];
-using com_arr = int[42];
-auto [ decomp ] = arr;
-auto &[ decomp_ref ] = arr;
-
-static_assert (!has_ellipsis_parameter (null_reflection));
-static_assert (!has_ellipsis_parameter (^^::));
-static_assert (!has_ellipsis_parameter (^^ns));
-static_assert (!has_ellipsis_parameter (^^ns_alias));
-static_assert (!has_ellipsis_parameter (reflect_constant (3)));
-static_assert (!has_ellipsis_parameter (^^cls));
-static_assert (!has_ellipsis_parameter (^^cls::dm));
-static_assert (!has_ellipsis_parameter (^^cls::ref_dm));
-static_assert (!has_ellipsis_parameter (^^cls::static_dm));
-static_assert (!has_ellipsis_parameter (^^cls::mem_fun));
-static_assert (has_ellipsis_parameter (^^cls::mem_fun2));
-static_assert (has_ellipsis_parameter (^^cls::mem_fun3));
-static_assert (!has_ellipsis_parameter (^^cls::mem_fun4));
-static_assert (!has_ellipsis_parameter (^^cls::static_mem_fun));
-static_assert (has_ellipsis_parameter (^^cls::static_mem_fun2));
-static_assert (has_ellipsis_parameter (^^cls::static_mem_fun3));
-static_assert (!has_ellipsis_parameter (^^cls::static_mem_fun4));
-static_assert (!has_ellipsis_parameter (^^cls::type));
-static_assert (!has_ellipsis_parameter (^^cls_var));
-static_assert (!has_ellipsis_parameter (^^onion));
-static_assert (!has_ellipsis_parameter (^^anon));
-static_assert (!has_ellipsis_parameter (^^fun));
-static_assert (has_ellipsis_parameter (^^fun2));
-static_assert (has_ellipsis_parameter (^^fun3));
-static_assert (!has_ellipsis_parameter (^^fun4));
-static_assert (!has_ellipsis_parameter (type_of (^^fun)));
-static_assert (has_ellipsis_parameter (type_of (^^fun2)));
-static_assert (has_ellipsis_parameter (type_of (^^fun3)));
-static_assert (!has_ellipsis_parameter (type_of (^^fun4)));
-static_assert (!has_ellipsis_parameter (^^alias));
-static_assert (!has_ellipsis_parameter (^^var));
-static_assert (!has_ellipsis_parameter (^^ref));
-static_assert (!has_ellipsis_parameter (^^rref));
-static_assert (!has_ellipsis_parameter (^^ptr));
-static_assert (!has_ellipsis_parameter (^^cls_tmpl));
-static_assert (!has_ellipsis_parameter (^^cls_tmpl<int>));
-static_assert (!has_ellipsis_parameter (^^incomplete_cls<int>));
-static_assert (!has_ellipsis_parameter (^^fun_tmpl));
-static_assert (!has_ellipsis_parameter (^^fun_tmpl<int>));
-static_assert (!has_ellipsis_parameter (^^fun_tmpl2));
-static_assert (has_ellipsis_parameter (^^fun_tmpl2<int>));
-static_assert (!has_ellipsis_parameter (^^fun_tmpl3));
-static_assert (has_ellipsis_parameter (^^fun_tmpl3<int>));
-static_assert (!has_ellipsis_parameter (^^fun_tmpl4));
-static_assert (!has_ellipsis_parameter (^^fun_tmpl4<int>));
-static_assert (!has_ellipsis_parameter (^^conc));
-static_assert (!has_ellipsis_parameter (substitute (^^conc, { ^^int })));
-static_assert (!has_ellipsis_parameter (^^var_tmpl));
-static_assert (!has_ellipsis_parameter (^^var_tmpl<int>));
-static_assert (!has_ellipsis_parameter (^^cls_tmpl_alias));
-static_assert (!has_ellipsis_parameter (^^cls_tmpl_alias<int>));
-static_assert (!has_ellipsis_parameter (^^Enum));
-static_assert (!has_ellipsis_parameter (^^Enum::A));
-static_assert (!has_ellipsis_parameter (^^Enum_class));
-static_assert (!has_ellipsis_parameter (^^Enum_class::A));
-static_assert (!has_ellipsis_parameter (^^decomp));
-static_assert (!has_ellipsis_parameter (^^decomp_ref));
-static_assert (!has_ellipsis_parameter (^^arr));
-static_assert (!has_ellipsis_parameter (^^inc_arr));
-static_assert (!has_ellipsis_parameter (^^com_arr));
-static_assert (!has_ellipsis_parameter (^^funt));
-static_assert (has_ellipsis_parameter (^^funt2));
-static_assert (has_ellipsis_parameter (^^funt3));
-static_assert (!has_ellipsis_parameter (^^funt4));
-
-constexpr auto dms = data_member_spec (^^int, { .name = u8"a" });
-static_assert (!has_ellipsis_parameter (dms));
-
-struct Base {};
-struct Derived : Base {};
-static_assert (!has_ellipsis_parameter (bases_of (^^Derived, access_context::unchecked ())[0]));
-
-template<typename T, info R, info R2, info R3>
-void
-f ()
-{
-  static_assert (!has_ellipsis_parameter (^^T));
-  static_assert (!has_ellipsis_parameter (R));
-  static_assert (!has_ellipsis_parameter (R2));
-  static_assert (!has_ellipsis_parameter (R3));
-}
-
-void
-g (int p, cls c)
-{
-  f<int, ^^var, ^^ns, ^^cls>();
-  static_assert (!has_ellipsis_parameter (^^p));
-  static_assert (!has_ellipsis_parameter (^^c));
-}
diff --git a/gcc/testsuite/g++.dg/reflect/is_vararg_function1.C b/gcc/testsuite/g++.dg/reflect/is_vararg_function1.C
new file mode 100644
index 000000000000..705fc8c985f7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/reflect/is_vararg_function1.C
@@ -0,0 +1,148 @@
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+// Test std::meta::is_vararg_function.
+
+#include <meta>
+
+using namespace std::meta;
+
+constexpr info null_reflection;
+struct cls {
+  int dm;
+  static int static_dm;
+  void mem_fun ();
+  void mem_fun2 (int, ...);
+  void mem_fun3 (...);
+  void mem_fun4 (int);
+  static void static_mem_fun ();
+  static void static_mem_fun2 (int, long, ...);
+  static void static_mem_fun3 (...);
+  static void static_mem_fun4 (long);
+  int &ref_dm = dm;
+  using type = int;
+} cls_var;
+union onion { };
+static union { int anon; };
+using alias = cls;
+void fun ();
+void fun2 (int, ...);
+void fun3 (...);
+void fun4 (int, int);
+int var;
+int &ref = var;
+int &&rref = 42;
+int *ptr = &var;
+namespace ns {}
+namespace ns_alias = ns;
+enum Enum { A };
+enum class Enum_class { A };
+using funt = int ();
+using funt2 = int (int, ...);
+using funt3 = int (...);
+using funt4 = int (int, long);
+
+template<typename> struct incomplete_cls;
+template<typename> struct cls_tmpl {};
+template<typename> void fun_tmpl ();
+template<typename> void fun_tmpl2 (int, ...);
+template<typename> void fun_tmpl3 (...);
+template<typename> void fun_tmpl4 (long, int);
+template<typename> concept conc = requires { true; };
+template<typename> int var_tmpl;
+template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+
+int arr[] = { 42 };
+using inc_arr = int[];
+using com_arr = int[42];
+auto [ decomp ] = arr;
+auto &[ decomp_ref ] = arr;
+
+static_assert (!is_vararg_function (null_reflection));
+static_assert (!is_vararg_function (^^::));
+static_assert (!is_vararg_function (^^ns));
+static_assert (!is_vararg_function (^^ns_alias));
+static_assert (!is_vararg_function (reflect_constant (3)));
+static_assert (!is_vararg_function (^^cls));
+static_assert (!is_vararg_function (^^cls::dm));
+static_assert (!is_vararg_function (^^cls::ref_dm));
+static_assert (!is_vararg_function (^^cls::static_dm));
+static_assert (!is_vararg_function (^^cls::mem_fun));
+static_assert (is_vararg_function (^^cls::mem_fun2));
+static_assert (is_vararg_function (^^cls::mem_fun3));
+static_assert (!is_vararg_function (^^cls::mem_fun4));
+static_assert (!is_vararg_function (^^cls::static_mem_fun));
+static_assert (is_vararg_function (^^cls::static_mem_fun2));
+static_assert (is_vararg_function (^^cls::static_mem_fun3));
+static_assert (!is_vararg_function (^^cls::static_mem_fun4));
+static_assert (!is_vararg_function (^^cls::type));
+static_assert (!is_vararg_function (^^cls_var));
+static_assert (!is_vararg_function (^^onion));
+static_assert (!is_vararg_function (^^anon));
+static_assert (!is_vararg_function (^^fun));
+static_assert (is_vararg_function (^^fun2));
+static_assert (is_vararg_function (^^fun3));
+static_assert (!is_vararg_function (^^fun4));
+static_assert (!is_vararg_function (type_of (^^fun)));
+static_assert (is_vararg_function (type_of (^^fun2)));
+static_assert (is_vararg_function (type_of (^^fun3)));
+static_assert (!is_vararg_function (type_of (^^fun4)));
+static_assert (!is_vararg_function (^^alias));
+static_assert (!is_vararg_function (^^var));
+static_assert (!is_vararg_function (^^ref));
+static_assert (!is_vararg_function (^^rref));
+static_assert (!is_vararg_function (^^ptr));
+static_assert (!is_vararg_function (^^cls_tmpl));
+static_assert (!is_vararg_function (^^cls_tmpl<int>));
+static_assert (!is_vararg_function (^^incomplete_cls<int>));
+static_assert (!is_vararg_function (^^fun_tmpl));
+static_assert (!is_vararg_function (^^fun_tmpl<int>));
+static_assert (!is_vararg_function (^^fun_tmpl2));
+static_assert (is_vararg_function (^^fun_tmpl2<int>));
+static_assert (!is_vararg_function (^^fun_tmpl3));
+static_assert (is_vararg_function (^^fun_tmpl3<int>));
+static_assert (!is_vararg_function (^^fun_tmpl4));
+static_assert (!is_vararg_function (^^fun_tmpl4<int>));
+static_assert (!is_vararg_function (^^conc));
+static_assert (!is_vararg_function (substitute (^^conc, { ^^int })));
+static_assert (!is_vararg_function (^^var_tmpl));
+static_assert (!is_vararg_function (^^var_tmpl<int>));
+static_assert (!is_vararg_function (^^cls_tmpl_alias));
+static_assert (!is_vararg_function (^^cls_tmpl_alias<int>));
+static_assert (!is_vararg_function (^^Enum));
+static_assert (!is_vararg_function (^^Enum::A));
+static_assert (!is_vararg_function (^^Enum_class));
+static_assert (!is_vararg_function (^^Enum_class::A));
+static_assert (!is_vararg_function (^^decomp));
+static_assert (!is_vararg_function (^^decomp_ref));
+static_assert (!is_vararg_function (^^arr));
+static_assert (!is_vararg_function (^^inc_arr));
+static_assert (!is_vararg_function (^^com_arr));
+static_assert (!is_vararg_function (^^funt));
+static_assert (is_vararg_function (^^funt2));
+static_assert (is_vararg_function (^^funt3));
+static_assert (!is_vararg_function (^^funt4));
+
+constexpr auto dms = data_member_spec (^^int, { .name = u8"a" });
+static_assert (!is_vararg_function (dms));
+
+struct Base {};
+struct Derived : Base {};
+static_assert (!is_vararg_function (bases_of (^^Derived, access_context::unchecked ())[0]));
+
+template<typename T, info R, info R2, info R3>
+void
+f ()
+{
+  static_assert (!is_vararg_function (^^T));
+  static_assert (!is_vararg_function (R));
+  static_assert (!is_vararg_function (R2));
+  static_assert (!is_vararg_function (R3));
+}
+
+void
+g (int p, cls c)
+{
+  f<int, ^^var, ^^ns, ^^cls>();
+  static_assert (!is_vararg_function (^^p));
+  static_assert (!is_vararg_function (^^c));
+}
diff --git a/libstdc++-v3/include/std/meta b/libstdc++-v3/include/std/meta
index 2a7d08e67e1c..fc587a92e4f9 100644
--- a/libstdc++-v3/include/std/meta
+++ b/libstdc++-v3/include/std/meta
@@ -273,7 +273,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     consteval bool is_function_parameter(info);
     consteval bool is_explicit_object_parameter(info);
     consteval bool has_default_argument(info);
-    consteval bool has_ellipsis_parameter(info);
+    consteval bool is_vararg_function(info);
 
     consteval bool is_template(info);
     consteval bool is_function_template(info);
diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in
index ac964511424b..210cbede5cfd 100644
--- a/libstdc++-v3/src/c++23/std.cc.in
+++ b/libstdc++-v3/src/c++23/std.cc.in
@@ -2161,7 +2161,7 @@ export namespace std
     using std::meta::is_function_parameter;
     using std::meta::is_explicit_object_parameter;
     using std::meta::has_default_argument;
-    using std::meta::has_ellipsis_parameter;
+    using std::meta::is_vararg_function;
     using std::meta::is_template;
     using std::meta::is_function_template;
     using std::meta::is_variable_template;


More information about the Libstdc++-cvs mailing list