Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2217384/?format=api
{ "id": 2217384, "url": "http://patchwork.ozlabs.org/api/patches/2217384/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/ace9gxVOzrcF3xLS@tucnak/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<ace9gxVOzrcF3xLS@tucnak>", "list_archive_url": null, "date": "2026-03-28T11:37:39", "name": "c++, libstdc++: Implement P4156R0 - Rename meta::has_ellipsis_parameter to meta::is_vararg_function", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "0627da1e9d65db781919d893b233c0956f4213c5", "submitter": { "id": 671, "url": "http://patchwork.ozlabs.org/api/people/671/?format=api", "name": "Jakub Jelinek", "email": "jakub@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/ace9gxVOzrcF3xLS@tucnak/mbox/", "series": [ { "id": 497863, "url": "http://patchwork.ozlabs.org/api/series/497863/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=497863", "date": "2026-03-28T11:37:39", "name": "c++, libstdc++: Implement P4156R0 - Rename meta::has_ellipsis_parameter to meta::is_vararg_function", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/497863/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2217384/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2217384/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=OvC9pX6z;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=OvC9pX6z", "sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com", "sourceware.org; spf=pass smtp.mailfrom=redhat.com", "server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fjb9p3lMVz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 28 Mar 2026 22:38:22 +1100 (AEDT)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id A71DA4BA23E8\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 28 Mar 2026 11:38:18 +0000 (GMT)", "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 386EB4BA23F9\n for <gcc-patches@gcc.gnu.org>; Sat, 28 Mar 2026 11:37:47 +0000 (GMT)", "from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-423-gw-HqbO4MYi374i_s5Ik1A-1; Sat,\n 28 Mar 2026 07:37:45 -0400", "from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 5AF9A180034E\n for <gcc-patches@gcc.gnu.org>; Sat, 28 Mar 2026 11:37:44 +0000 (UTC)", "from tucnak.zalov.cz (unknown [10.45.225.193])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with\n ESMTPS\n id 553B119560B1; Sat, 28 Mar 2026 11:37:43 +0000 (UTC)", "from tucnak.zalov.cz (localhost [127.0.0.1])\n by tucnak.zalov.cz (8.18.1/8.18.1) with ESMTPS id 62SBbeaw2714478\n (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT);\n Sat, 28 Mar 2026 12:37:40 +0100", "(from jakub@localhost)\n by tucnak.zalov.cz (8.18.1/8.18.1/Submit) id 62SBbeXf2714477;\n Sat, 28 Mar 2026 12:37:40 +0100" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org A71DA4BA23E8", "OpenDKIM Filter v2.11.0 sourceware.org 386EB4BA23F9" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 386EB4BA23F9", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 386EB4BA23F9", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1774697867; cv=none;\n b=R5oxqmkf0/E7cBFPRP6IpW/PAtjsFENVdUaZhOEFS+79muVTD0PbS38OhLlitppDaWyl924dVaXk+q1K91YsmJg3O4e0csjQC8mWEJQzWxC/wwePHWZUlod0+G9s133bzM+ujMFIEzJu1mCBmKosIYFJSsxP2HDiTBSXh6XATE0=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1774697867; c=relaxed/simple;\n bh=rsGGqSmSdoMNlD8bgaHwFxNNGi53lhVGYi7V8GaHOOE=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=GoPo/W1yH2lHlNbgCzudPbjA8PRV4gnM/nBEf3V3O1ctJCUMPIrJeFqsSv2x5zy1f1xWzqvQIR02VCTUxm3WAvUXwhFSA5ox9Vz8qMcctr9TbKTYLkQBO5kRdDuw4GDuUuRlardjZWBQyzusap0SmkSNRrpg9MrRm18d1FNtMRU=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1774697866;\n h=from:from:reply-to:reply-to:subject:subject:date:date:\n message-id:message-id:to:to:cc:cc:mime-version:mime-version:\n content-type:content-type; bh=ItqvRj/hrSUwLhWndR7osbE5lqFLPpaHHkskIZP5QSs=;\n b=OvC9pX6zRMw3yX9v9dPgIrKxbLHFjgliROGel9UXKbPMiq0RwKBSfDERAbPyLZJhMvlgcq\n 7BDrR7Mwe6146uorx03uZPGe7125gii0iKI096suvDqCUzyL2bLeMbeGuq7txXAZjE0ulE\n bTuy3xueve7EfBINwbPqfd0/h7Rcrrw=", "X-MC-Unique": "gw-HqbO4MYi374i_s5Ik1A-1", "X-Mimecast-MFC-AGG-ID": "gw-HqbO4MYi374i_s5Ik1A_1774697864", "Date": "Sat, 28 Mar 2026 12:37:39 +0100", "From": "Jakub Jelinek <jakub@redhat.com>", "To": "Jason Merrill <jason@redhat.com>, Marek Polacek <polacek@redhat.com>,\n Jonathan Wakely <jwakely@redhat.com>", "Cc": "gcc-patches@gcc.gnu.org", "Subject": "[PATCH] c++, libstdc++: Implement P4156R0 - Rename\n meta::has_ellipsis_parameter to meta::is_vararg_function", "Message-ID": "<ace9gxVOzrcF3xLS@tucnak>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.12", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "65aOLmUXYsMqeUOB2llHZx_Crdgx14S0xniwjwrpBC8_1774697864", "X-Mimecast-Originator": "redhat.com", "Content-Type": "text/plain; charset=us-ascii", "Content-Disposition": "inline", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Reply-To": "Jakub Jelinek <jakub@redhat.com>", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "Hi!\n\nUnhappy about the old and new names, as a function type is not a function,\nbut ces't la vie.\n\nTested on x86_64-linux.\n\n2026-03-28 Jakub Jelinek <jakub@redhat.com>\n\ngcc/cp/\n\t* metafns.gperf (enum metafn_code): Remove\n\tMETAFN_HAS_ELLIPSIS_PARAMETER, add METAFN_IS_VARARG_FUNCTION.\n\t(has_ellipsis_parameter): Remove.\n\t(is_vararg_function): Add.\n\t* reflect.cc (eval_has_ellipsis_parameter): Rename to ...\n\t(eval_is_vararg_function): ... this. Adjust function comment.\n\t(process_metafunction): Handle METAFN_IS_VARARG_FUNCTION\n\tinstead of METAFN_HAS_ELLIPSIS_PARAMETER.\n\t* metafns.h: Regenerate.\ngcc/testsuite/\n\t* g++.dg/reflect/has_ellipsis_parameter1.C: Rename to ...\n\t* g++.dg/reflect/is_vararg_function1.C: this. New test. Rename\n\thas_ellipsis_parameter to is_vararg_function everywhere.\nlibstdc++-v3/\n\t* include/std/meta (has_ellipsis_parameter): Rename to ...\n\t(is_vararg_function): ... this. New declaration.\n\t* src/c++23/std.cc.in: Remove std::meta::has_ellipsis_parameter\n\texport, add std::meta::is_vararg_function export.\n\n\n\tJakub", "diff": "--- libstdc++-v3/include/std/meta.jj\t2026-03-27 18:34:12.497773682 +0100\n+++ libstdc++-v3/include/std/meta\t2026-03-27 18:35:27.617529247 +0100\n@@ -273,7 +273,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n consteval bool is_function_parameter(info);\n consteval bool is_explicit_object_parameter(info);\n consteval bool has_default_argument(info);\n- consteval bool has_ellipsis_parameter(info);\n+ consteval bool is_vararg_function(info);\n \n consteval bool is_template(info);\n consteval bool is_function_template(info);\n--- libstdc++-v3/src/c++23/std.cc.in.jj\t2026-03-27 18:34:12.497773682 +0100\n+++ libstdc++-v3/src/c++23/std.cc.in\t2026-03-27 18:35:44.631247398 +0100\n@@ -2161,7 +2161,7 @@ export namespace std\n using std::meta::is_function_parameter;\n using std::meta::is_explicit_object_parameter;\n using std::meta::has_default_argument;\n- using std::meta::has_ellipsis_parameter;\n+ using std::meta::is_vararg_function;\n using std::meta::is_template;\n using std::meta::is_function_template;\n using std::meta::is_variable_template;\n--- gcc/cp/metafns.gperf.jj\t2026-03-27 18:34:12.491773781 +0100\n+++ gcc/cp/metafns.gperf\t2026-03-27 18:36:38.861349024 +0100\n@@ -86,7 +86,7 @@ enum metafn_code {\n METAFN_IS_FUNCTION_PARAMETER,\n METAFN_IS_EXPLICIT_OBJECT_PARAMETER,\n METAFN_HAS_DEFAULT_ARGUMENT,\n- METAFN_HAS_ELLIPSIS_PARAMETER,\n+ METAFN_IS_VARARG_FUNCTION,\n METAFN_IS_TEMPLATE,\n METAFN_IS_FUNCTION_TEMPLATE,\n METAFN_IS_VARIABLE_TEMPLATE,\n@@ -521,7 +521,7 @@ is_destructor, METAFN_IS_DESTRUCTOR, MET\n is_function_parameter, METAFN_IS_FUNCTION_PARAMETER, METAFN_KIND_BOOL_INFO,\n is_explicit_object_parameter, METAFN_IS_EXPLICIT_OBJECT_PARAMETER, METAFN_KIND_BOOL_INFO,\n has_default_argument, METAFN_HAS_DEFAULT_ARGUMENT, METAFN_KIND_BOOL_INFO,\n-has_ellipsis_parameter, METAFN_HAS_ELLIPSIS_PARAMETER, METAFN_KIND_BOOL_INFO,\n+is_vararg_function, METAFN_IS_VARARG_FUNCTION, METAFN_KIND_BOOL_INFO,\n is_template, METAFN_IS_TEMPLATE, METAFN_KIND_BOOL_INFO,\n is_function_template, METAFN_IS_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,\n is_variable_template, METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,\n--- gcc/cp/reflect.cc.jj\t2026-03-27 18:34:12.495773715 +0100\n+++ gcc/cp/reflect.cc\t2026-03-28 12:24:18.968719205 +0100\n@@ -1759,12 +1759,12 @@ eval_has_default_argument (tree r, refle\n return boolean_false_node;\n }\n \n-/* Process std::meta::has_ellipsis_parameter.\n- Returns: true if r represents a function or function type that has an\n- ellipsis in its parameter-type-list. Otherwise, false. */\n+/* Process std::meta::is_vararg_function.\n+ Returns: true if r represents a function or function type that\n+ is a vararg function. Otherwise, false. */\n \n static tree\n-eval_has_ellipsis_parameter (tree r)\n+eval_is_vararg_function (tree r)\n {\n r = MAYBE_BASELINK_FUNCTIONS (r);\n if (TREE_CODE (r) == FUNCTION_DECL)\n@@ -7612,8 +7612,8 @@ process_metafunction (const constexpr_ct\n return eval_is_explicit_object_parameter (h, kind);\n case METAFN_HAS_DEFAULT_ARGUMENT:\n return eval_has_default_argument (h, kind);\n- case METAFN_HAS_ELLIPSIS_PARAMETER:\n- return eval_has_ellipsis_parameter (h);\n+ case METAFN_IS_VARARG_FUNCTION:\n+ return eval_is_vararg_function (h);\n case METAFN_IS_TEMPLATE:\n return eval_is_template (h);\n case METAFN_IS_FUNCTION_TEMPLATE:\n--- gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C.jj\t2026-03-27 10:17:16.125298250 +0100\n+++ gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C\t2026-03-28 12:25:05.023941440 +0100\n@@ -1,148 +0,0 @@\n-// { dg-do compile { target c++26 } }\n-// { dg-additional-options \"-freflection\" }\n-// Test std::meta::has_ellipsis_parameter.\n-\n-#include <meta>\n-\n-using namespace std::meta;\n-\n-constexpr info null_reflection;\n-struct cls {\n- int dm;\n- static int static_dm;\n- void mem_fun ();\n- void mem_fun2 (int, ...);\n- void mem_fun3 (...);\n- void mem_fun4 (int);\n- static void static_mem_fun ();\n- static void static_mem_fun2 (int, long, ...);\n- static void static_mem_fun3 (...);\n- static void static_mem_fun4 (long);\n- int &ref_dm = dm;\n- using type = int;\n-} cls_var;\n-union onion { };\n-static union { int anon; };\n-using alias = cls;\n-void fun ();\n-void fun2 (int, ...);\n-void fun3 (...);\n-void fun4 (int, int);\n-int var;\n-int &ref = var;\n-int &&rref = 42;\n-int *ptr = &var;\n-namespace ns {}\n-namespace ns_alias = ns;\n-enum Enum { A };\n-enum class Enum_class { A };\n-using funt = int ();\n-using funt2 = int (int, ...);\n-using funt3 = int (...);\n-using funt4 = int (int, long);\n-\n-template<typename> struct incomplete_cls;\n-template<typename> struct cls_tmpl {};\n-template<typename> void fun_tmpl ();\n-template<typename> void fun_tmpl2 (int, ...);\n-template<typename> void fun_tmpl3 (...);\n-template<typename> void fun_tmpl4 (long, int);\n-template<typename> concept conc = requires { true; };\n-template<typename> int var_tmpl;\n-template<typename T> using cls_tmpl_alias = cls_tmpl<T>;\n-\n-int arr[] = { 42 };\n-using inc_arr = int[];\n-using com_arr = int[42];\n-auto [ decomp ] = arr;\n-auto &[ decomp_ref ] = arr;\n-\n-static_assert (!has_ellipsis_parameter (null_reflection));\n-static_assert (!has_ellipsis_parameter (^^::));\n-static_assert (!has_ellipsis_parameter (^^ns));\n-static_assert (!has_ellipsis_parameter (^^ns_alias));\n-static_assert (!has_ellipsis_parameter (reflect_constant (3)));\n-static_assert (!has_ellipsis_parameter (^^cls));\n-static_assert (!has_ellipsis_parameter (^^cls::dm));\n-static_assert (!has_ellipsis_parameter (^^cls::ref_dm));\n-static_assert (!has_ellipsis_parameter (^^cls::static_dm));\n-static_assert (!has_ellipsis_parameter (^^cls::mem_fun));\n-static_assert (has_ellipsis_parameter (^^cls::mem_fun2));\n-static_assert (has_ellipsis_parameter (^^cls::mem_fun3));\n-static_assert (!has_ellipsis_parameter (^^cls::mem_fun4));\n-static_assert (!has_ellipsis_parameter (^^cls::static_mem_fun));\n-static_assert (has_ellipsis_parameter (^^cls::static_mem_fun2));\n-static_assert (has_ellipsis_parameter (^^cls::static_mem_fun3));\n-static_assert (!has_ellipsis_parameter (^^cls::static_mem_fun4));\n-static_assert (!has_ellipsis_parameter (^^cls::type));\n-static_assert (!has_ellipsis_parameter (^^cls_var));\n-static_assert (!has_ellipsis_parameter (^^onion));\n-static_assert (!has_ellipsis_parameter (^^anon));\n-static_assert (!has_ellipsis_parameter (^^fun));\n-static_assert (has_ellipsis_parameter (^^fun2));\n-static_assert (has_ellipsis_parameter (^^fun3));\n-static_assert (!has_ellipsis_parameter (^^fun4));\n-static_assert (!has_ellipsis_parameter (type_of (^^fun)));\n-static_assert (has_ellipsis_parameter (type_of (^^fun2)));\n-static_assert (has_ellipsis_parameter (type_of (^^fun3)));\n-static_assert (!has_ellipsis_parameter (type_of (^^fun4)));\n-static_assert (!has_ellipsis_parameter (^^alias));\n-static_assert (!has_ellipsis_parameter (^^var));\n-static_assert (!has_ellipsis_parameter (^^ref));\n-static_assert (!has_ellipsis_parameter (^^rref));\n-static_assert (!has_ellipsis_parameter (^^ptr));\n-static_assert (!has_ellipsis_parameter (^^cls_tmpl));\n-static_assert (!has_ellipsis_parameter (^^cls_tmpl<int>));\n-static_assert (!has_ellipsis_parameter (^^incomplete_cls<int>));\n-static_assert (!has_ellipsis_parameter (^^fun_tmpl));\n-static_assert (!has_ellipsis_parameter (^^fun_tmpl<int>));\n-static_assert (!has_ellipsis_parameter (^^fun_tmpl2));\n-static_assert (has_ellipsis_parameter (^^fun_tmpl2<int>));\n-static_assert (!has_ellipsis_parameter (^^fun_tmpl3));\n-static_assert (has_ellipsis_parameter (^^fun_tmpl3<int>));\n-static_assert (!has_ellipsis_parameter (^^fun_tmpl4));\n-static_assert (!has_ellipsis_parameter (^^fun_tmpl4<int>));\n-static_assert (!has_ellipsis_parameter (^^conc));\n-static_assert (!has_ellipsis_parameter (substitute (^^conc, { ^^int })));\n-static_assert (!has_ellipsis_parameter (^^var_tmpl));\n-static_assert (!has_ellipsis_parameter (^^var_tmpl<int>));\n-static_assert (!has_ellipsis_parameter (^^cls_tmpl_alias));\n-static_assert (!has_ellipsis_parameter (^^cls_tmpl_alias<int>));\n-static_assert (!has_ellipsis_parameter (^^Enum));\n-static_assert (!has_ellipsis_parameter (^^Enum::A));\n-static_assert (!has_ellipsis_parameter (^^Enum_class));\n-static_assert (!has_ellipsis_parameter (^^Enum_class::A));\n-static_assert (!has_ellipsis_parameter (^^decomp));\n-static_assert (!has_ellipsis_parameter (^^decomp_ref));\n-static_assert (!has_ellipsis_parameter (^^arr));\n-static_assert (!has_ellipsis_parameter (^^inc_arr));\n-static_assert (!has_ellipsis_parameter (^^com_arr));\n-static_assert (!has_ellipsis_parameter (^^funt));\n-static_assert (has_ellipsis_parameter (^^funt2));\n-static_assert (has_ellipsis_parameter (^^funt3));\n-static_assert (!has_ellipsis_parameter (^^funt4));\n-\n-constexpr auto dms = data_member_spec (^^int, { .name = u8\"a\" });\n-static_assert (!has_ellipsis_parameter (dms));\n-\n-struct Base {};\n-struct Derived : Base {};\n-static_assert (!has_ellipsis_parameter (bases_of (^^Derived, access_context::unchecked ())[0]));\n-\n-template<typename T, info R, info R2, info R3>\n-void\n-f ()\n-{\n- static_assert (!has_ellipsis_parameter (^^T));\n- static_assert (!has_ellipsis_parameter (R));\n- static_assert (!has_ellipsis_parameter (R2));\n- static_assert (!has_ellipsis_parameter (R3));\n-}\n-\n-void\n-g (int p, cls c)\n-{\n- f<int, ^^var, ^^ns, ^^cls>();\n- static_assert (!has_ellipsis_parameter (^^p));\n- static_assert (!has_ellipsis_parameter (^^c));\n-}\n--- gcc/testsuite/g++.dg/reflect/is_vararg_function1.C.jj\t2026-03-28 12:25:11.272835910 +0100\n+++ gcc/testsuite/g++.dg/reflect/is_vararg_function1.C\t2026-03-28 12:25:25.749591435 +0100\n@@ -0,0 +1,148 @@\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test std::meta::is_vararg_function.\n+\n+#include <meta>\n+\n+using namespace std::meta;\n+\n+constexpr info null_reflection;\n+struct cls {\n+ int dm;\n+ static int static_dm;\n+ void mem_fun ();\n+ void mem_fun2 (int, ...);\n+ void mem_fun3 (...);\n+ void mem_fun4 (int);\n+ static void static_mem_fun ();\n+ static void static_mem_fun2 (int, long, ...);\n+ static void static_mem_fun3 (...);\n+ static void static_mem_fun4 (long);\n+ int &ref_dm = dm;\n+ using type = int;\n+} cls_var;\n+union onion { };\n+static union { int anon; };\n+using alias = cls;\n+void fun ();\n+void fun2 (int, ...);\n+void fun3 (...);\n+void fun4 (int, int);\n+int var;\n+int &ref = var;\n+int &&rref = 42;\n+int *ptr = &var;\n+namespace ns {}\n+namespace ns_alias = ns;\n+enum Enum { A };\n+enum class Enum_class { A };\n+using funt = int ();\n+using funt2 = int (int, ...);\n+using funt3 = int (...);\n+using funt4 = int (int, long);\n+\n+template<typename> struct incomplete_cls;\n+template<typename> struct cls_tmpl {};\n+template<typename> void fun_tmpl ();\n+template<typename> void fun_tmpl2 (int, ...);\n+template<typename> void fun_tmpl3 (...);\n+template<typename> void fun_tmpl4 (long, int);\n+template<typename> concept conc = requires { true; };\n+template<typename> int var_tmpl;\n+template<typename T> using cls_tmpl_alias = cls_tmpl<T>;\n+\n+int arr[] = { 42 };\n+using inc_arr = int[];\n+using com_arr = int[42];\n+auto [ decomp ] = arr;\n+auto &[ decomp_ref ] = arr;\n+\n+static_assert (!is_vararg_function (null_reflection));\n+static_assert (!is_vararg_function (^^::));\n+static_assert (!is_vararg_function (^^ns));\n+static_assert (!is_vararg_function (^^ns_alias));\n+static_assert (!is_vararg_function (reflect_constant (3)));\n+static_assert (!is_vararg_function (^^cls));\n+static_assert (!is_vararg_function (^^cls::dm));\n+static_assert (!is_vararg_function (^^cls::ref_dm));\n+static_assert (!is_vararg_function (^^cls::static_dm));\n+static_assert (!is_vararg_function (^^cls::mem_fun));\n+static_assert (is_vararg_function (^^cls::mem_fun2));\n+static_assert (is_vararg_function (^^cls::mem_fun3));\n+static_assert (!is_vararg_function (^^cls::mem_fun4));\n+static_assert (!is_vararg_function (^^cls::static_mem_fun));\n+static_assert (is_vararg_function (^^cls::static_mem_fun2));\n+static_assert (is_vararg_function (^^cls::static_mem_fun3));\n+static_assert (!is_vararg_function (^^cls::static_mem_fun4));\n+static_assert (!is_vararg_function (^^cls::type));\n+static_assert (!is_vararg_function (^^cls_var));\n+static_assert (!is_vararg_function (^^onion));\n+static_assert (!is_vararg_function (^^anon));\n+static_assert (!is_vararg_function (^^fun));\n+static_assert (is_vararg_function (^^fun2));\n+static_assert (is_vararg_function (^^fun3));\n+static_assert (!is_vararg_function (^^fun4));\n+static_assert (!is_vararg_function (type_of (^^fun)));\n+static_assert (is_vararg_function (type_of (^^fun2)));\n+static_assert (is_vararg_function (type_of (^^fun3)));\n+static_assert (!is_vararg_function (type_of (^^fun4)));\n+static_assert (!is_vararg_function (^^alias));\n+static_assert (!is_vararg_function (^^var));\n+static_assert (!is_vararg_function (^^ref));\n+static_assert (!is_vararg_function (^^rref));\n+static_assert (!is_vararg_function (^^ptr));\n+static_assert (!is_vararg_function (^^cls_tmpl));\n+static_assert (!is_vararg_function (^^cls_tmpl<int>));\n+static_assert (!is_vararg_function (^^incomplete_cls<int>));\n+static_assert (!is_vararg_function (^^fun_tmpl));\n+static_assert (!is_vararg_function (^^fun_tmpl<int>));\n+static_assert (!is_vararg_function (^^fun_tmpl2));\n+static_assert (is_vararg_function (^^fun_tmpl2<int>));\n+static_assert (!is_vararg_function (^^fun_tmpl3));\n+static_assert (is_vararg_function (^^fun_tmpl3<int>));\n+static_assert (!is_vararg_function (^^fun_tmpl4));\n+static_assert (!is_vararg_function (^^fun_tmpl4<int>));\n+static_assert (!is_vararg_function (^^conc));\n+static_assert (!is_vararg_function (substitute (^^conc, { ^^int })));\n+static_assert (!is_vararg_function (^^var_tmpl));\n+static_assert (!is_vararg_function (^^var_tmpl<int>));\n+static_assert (!is_vararg_function (^^cls_tmpl_alias));\n+static_assert (!is_vararg_function (^^cls_tmpl_alias<int>));\n+static_assert (!is_vararg_function (^^Enum));\n+static_assert (!is_vararg_function (^^Enum::A));\n+static_assert (!is_vararg_function (^^Enum_class));\n+static_assert (!is_vararg_function (^^Enum_class::A));\n+static_assert (!is_vararg_function (^^decomp));\n+static_assert (!is_vararg_function (^^decomp_ref));\n+static_assert (!is_vararg_function (^^arr));\n+static_assert (!is_vararg_function (^^inc_arr));\n+static_assert (!is_vararg_function (^^com_arr));\n+static_assert (!is_vararg_function (^^funt));\n+static_assert (is_vararg_function (^^funt2));\n+static_assert (is_vararg_function (^^funt3));\n+static_assert (!is_vararg_function (^^funt4));\n+\n+constexpr auto dms = data_member_spec (^^int, { .name = u8\"a\" });\n+static_assert (!is_vararg_function (dms));\n+\n+struct Base {};\n+struct Derived : Base {};\n+static_assert (!is_vararg_function (bases_of (^^Derived, access_context::unchecked ())[0]));\n+\n+template<typename T, info R, info R2, info R3>\n+void\n+f ()\n+{\n+ static_assert (!is_vararg_function (^^T));\n+ static_assert (!is_vararg_function (R));\n+ static_assert (!is_vararg_function (R2));\n+ static_assert (!is_vararg_function (R3));\n+}\n+\n+void\n+g (int p, cls c)\n+{\n+ f<int, ^^var, ^^ns, ^^cls>();\n+ static_assert (!is_vararg_function (^^p));\n+ static_assert (!is_vararg_function (^^c));\n+}\n--- gcc/cp/metafns.h.jj\t2026-03-27 18:34:12.491773781 +0100\n+++ gcc/cp/metafns.h\t2026-03-27 18:36:49.234174196 +0100\n@@ -114,7 +114,7 @@ enum metafn_code {\n METAFN_IS_FUNCTION_PARAMETER,\n METAFN_IS_EXPLICIT_OBJECT_PARAMETER,\n METAFN_HAS_DEFAULT_ARGUMENT,\n- METAFN_HAS_ELLIPSIS_PARAMETER,\n+ METAFN_IS_VARARG_FUNCTION,\n METAFN_IS_TEMPLATE,\n METAFN_IS_FUNCTION_TEMPLATE,\n METAFN_IS_VARIABLE_TEMPLATE,\n@@ -511,7 +511,7 @@ metafn_lookup::hash (const char *str, si\n 918, 918, 918, 918, 918, 5, 100, 145, 10, 45,\n 165, 5, 55, 50, 72, 20, 248, 0, 55, 105,\n 0, 205, 0, 45, 35, 55, 25, 195, 5, 199,\n- 20, 311, 20, 918, 918, 918, 918, 918, 918, 918,\n+ 20, 311, 80, 918, 918, 918, 918, 918, 918, 918,\n 918, 918, 918, 918, 918, 918, 918, 918, 918, 918,\n 918, 918, 918, 918, 918, 918, 918, 918, 918, 918,\n 918, 918, 918, 918, 918, 918, 918, 918, 918, 918,\n@@ -630,12 +630,8 @@ metafn_lookup::find (const char *str, si\n {\"is_nothrow_move_constructible_type\", METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},\n #line 527 \"metafns.gperf\"\n {\"is_variable_template\", METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,},\n-#line 686 \"metafns.gperf\"\n- {\"variant_size\", METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,},\n #line 579 \"metafns.gperf\"\n {\"is_null_pointer_type\", METAFN_IS_NULL_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},\n-#line 504 \"metafns.gperf\"\n- {\"is_type\", METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,},\n #line 472 \"metafns.gperf\"\n {\"is_public\", METAFN_IS_PUBLIC, METAFN_KIND_BOOL_INFO,},\n #line 484 \"metafns.gperf\"\n@@ -690,6 +686,10 @@ metafn_lookup::find (const char *str, si\n {\"symbol_of\", METAFN_SYMBOL_OF, METAFN_KIND_STRING_VIEW_OPERATORS,},\n #line 617 \"metafns.gperf\"\n {\"is_copy_constructible_type\", METAFN_IS_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},\n+#line 686 \"metafns.gperf\"\n+ {\"variant_size\", METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,},\n+#line 504 \"metafns.gperf\"\n+ {\"is_type\", METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,},\n #line 615 \"metafns.gperf\"\n {\"is_constructible_type\", METAFN_IS_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},\n #line 495 \"metafns.gperf\"\n@@ -698,8 +698,8 @@ metafn_lookup::find (const char *str, si\n {\"is_copy_assignable_type\", METAFN_IS_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},\n #line 684 \"metafns.gperf\"\n {\"tuple_size\", METAFN_TUPLE_SIZE, METAFN_KIND_SIZE_T_TINFO,},\n-#line 506 \"metafns.gperf\"\n- {\"is_type_alias\", METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,},\n+#line 524 \"metafns.gperf\"\n+ {\"is_vararg_function\", METAFN_IS_VARARG_FUNCTION, METAFN_KIND_BOOL_INFO,},\n #line 515 \"metafns.gperf\"\n {\"is_copy_constructor\", METAFN_IS_COPY_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},\n #line 551 \"metafns.gperf\"\n@@ -754,8 +754,8 @@ metafn_lookup::find (const char *str, si\n {\"is_member_pointer_type\", METAFN_IS_MEMBER_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},\n #line 621 \"metafns.gperf\"\n {\"is_move_assignable_type\", METAFN_IS_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},\n-#line 524 \"metafns.gperf\"\n- {\"has_ellipsis_parameter\", METAFN_HAS_ELLIPSIS_PARAMETER, METAFN_KIND_BOOL_INFO,},\n+#line 506 \"metafns.gperf\"\n+ {\"is_type_alias\", METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,},\n #line 516 \"metafns.gperf\"\n {\"is_move_constructor\", METAFN_IS_MOVE_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},\n #line 550 \"metafns.gperf\"\n@@ -1042,8 +1042,6 @@ metafn_lookup::find (const char *str, si\n {\"is_integral_type\", METAFN_IS_INTEGRAL_TYPE, METAFN_KIND_BOOL_TINFO,},\n #line 560 \"metafns.gperf\"\n {\"nonstatic_data_members_of\", METAFN_NONSTATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},\n-#line 677 \"metafns.gperf\"\n- {\"decay\", METAFN_DECAY, METAFN_KIND_INFO_TINFO,},\n #line 607 \"metafns.gperf\"\n {\"is_final_type\", METAFN_IS_FINAL_TYPE, METAFN_KIND_BOOL_TINFO,},\n #line 662 \"metafns.gperf\"\n@@ -1056,6 +1054,8 @@ metafn_lookup::find (const char *str, si\n {\"annotations_of_with_type\", METAFN_ANNOTATIONS_OF_WITH_TYPE, METAFN_KIND_VECTOR_INFO_INFO_INFO,},\n #line 465 \"metafns.gperf\"\n {\"u8identifier_of\", METAFN_U8IDENTIFIER_OF, METAFN_KIND_U8STRING_VIEW_INFO,},\n+#line 677 \"metafns.gperf\"\n+ {\"decay\", METAFN_DECAY, METAFN_KIND_INFO_TINFO,},\n #line 689 \"metafns.gperf\"\n {\"annotations_of\", METAFN_ANNOTATIONS_OF, METAFN_KIND_VECTOR_INFO_INFO,},\n #line 589 \"metafns.gperf\"\n@@ -1078,21 +1078,21 @@ metafn_lookup::find (const char *str, si\n -1, -1, 1, -1, -1, 2, 3, -1, 4, -1,\n -1, -1, 5, -1, -1, -1, 6, 7, -1, 8,\n 9, 10, 11, -1, 12, 13, 14, -1, -1, 15,\n- 16, -1, 17, -1, -1, 18, -1, 19, -1, 20,\n- -1, 21, 22, -1, 23, -1, -1, -1, -1, 24,\n- 25, 26, 27, -1, -1, 28, 29, -1, 30, -1,\n- 31, -1, 32, 33, -1, 34, -1, -1, -1, -1,\n- 35, 36, 37, 38, 39, 40, -1, -1, -1, -1,\n- -1, 41, 42, -1, 43, -1, 44, -1, -1, 45,\n- -1, 46, -1, -1, -1, -1, -1, -1, -1, -1,\n+ 16, -1, -1, -1, -1, 17, -1, -1, -1, 18,\n+ -1, 19, 20, -1, 21, -1, -1, -1, -1, 22,\n+ 23, 24, 25, -1, -1, 26, 27, -1, 28, -1,\n+ 29, -1, 30, 31, -1, 32, -1, -1, -1, -1,\n+ 33, 34, 35, 36, 37, 38, -1, -1, -1, -1,\n+ -1, 39, 40, -1, 41, -1, 42, -1, -1, 43,\n+ -1, 44, 45, -1, -1, -1, -1, 46, -1, -1,\n -1, -1, -1, -1, -1, -1, 47, 48, 49, -1,\n 50, -1, -1, 51, 52, -1, 53, 54, 55, 56,\n 57, 58, -1, 59, -1, -1, -1, 60, -1, -1,\n -1, 61, -1, 62, -1, 63, 64, 65, 66, -1,\n -1, 67, -1, -1, -1, -1, -1, 68, -1, -1,\n -1, 69, 70, -1, 71, -1, -1, 72, -1, -1,\n- 73, -1, 74, 75, -1, 76, -1, 77, 78, 79,\n- -1, -1, -1, -1, 80, -1, -1, -1, 81, -1,\n+ 73, -1, 74, 75, -1, 76, -1, 77, 78, -1,\n+ -1, -1, -1, 79, 80, -1, -1, -1, 81, -1,\n -1, -1, 82, 83, -1, -1, -1, -1, 84, -1,\n 85, 86, -1, 87, 88, 89, 90, -1, 91, -1,\n -1, 92, -1, -1, -1, -1, 93, 94, -1, -1,\n@@ -1135,13 +1135,13 @@ metafn_lookup::find (const char *str, si\n -1, -1, -1, -1, -1, -1, -1, 218, -1, -1,\n -1, -1, -1, 219, -1, -1, -1, 220, -1, -1,\n -1, -1, 221, -1, -1, -1, -1, -1, -1, -1,\n- 222, -1, -1, -1, -1, -1, 223, -1, -1, -1,\n- -1, -1, 224, -1, -1, -1, -1, -1, -1, 225,\n- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n- -1, -1, 226, -1, -1, -1, -1, -1, 227, -1,\n- -1, -1, -1, -1, 228, -1, -1, -1, -1, -1,\n- -1, -1, -1, -1, -1, 229, -1, -1, -1, -1,\n+ 222, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n+ -1, -1, 223, -1, -1, -1, -1, -1, -1, 224,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n+ -1, -1, 225, -1, -1, -1, -1, -1, 226, -1,\n+ -1, -1, -1, -1, 227, -1, -1, -1, -1, -1,\n+ -1, -1, -1, -1, -1, 228, -1, -1, -1, -1,\n+ -1, -1, -1, -1, -1, -1, 229, -1, -1, -1,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n -1, -1, -1, -1, 230, -1, -1, -1, -1, -1,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n", "prefixes": [] }