{"id":2222038,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2222038/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/adktrw95NxSQ50vG@redhat.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/projects/17/?format=json","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},"msgid":"<adktrw95NxSQ50vG@redhat.com>","date":"2026-04-10T17:04:47","name":"[v2] c++/reflection: mangling dependent splices [PR123237]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"37236554083494c50b3c6288a779c3a51f250610","submitter":{"id":14370,"url":"http://patchwork.ozlabs.org/api/1.1/people/14370/?format=json","name":"Marek Polacek","email":"polacek@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/adktrw95NxSQ50vG@redhat.com/mbox/","series":[{"id":499488,"url":"http://patchwork.ozlabs.org/api/1.1/series/499488/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=499488","date":"2026-04-10T17:04:47","name":"[v2] c++/reflection: mangling dependent splices [PR123237]","version":2,"mbox":"http://patchwork.ozlabs.org/series/499488/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2222038/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2222038/checks/","tags":{},"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=RqDj+iih;\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=RqDj+iih","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.133.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 4fsjqF1vllz1yGb\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 11 Apr 2026 03:05:27 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 7F2324BA2E2E\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 17:05:25 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by sourceware.org (Postfix) with ESMTP id A4F664BA2E19\n for <gcc-patches@gcc.gnu.org>; Fri, 10 Apr 2026 17:04:53 +0000 (GMT)","from mail-vs1-f70.google.com (mail-vs1-f70.google.com\n [209.85.217.70]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-674--uFLD2toMGGaWjTUZxhffw-1; Fri, 10 Apr 2026 13:04:51 -0400","by mail-vs1-f70.google.com with SMTP id\n ada2fe7eead31-604eba0f2f8so1210563137.3\n for <gcc-patches@gcc.gnu.org>; Fri, 10 Apr 2026 10:04:51 -0700 (PDT)","from redhat.com ([2603:7000:9500:10::1db4])\n by smtp.gmail.com with ESMTPSA id\n 6a1803df08f44-8ac84cf477asm28321266d6.44.2026.04.10.10.04.48\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 10 Apr 2026 10:04:48 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 7F2324BA2E2E","OpenDKIM Filter v2.11.0 sourceware.org A4F664BA2E19"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org A4F664BA2E19","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org A4F664BA2E19","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775840693; cv=none;\n b=LhlyH3ngKPahCzoNoyfdDvFG1u5tmi9FDpcRcB6rmSRSTPcsYY2vkOIJSN1faylUyP8ABkUeDCtFd9E+/4f70J4ePLR81kmswthJPPz95kf4D0yTezUnGSOtrLjkaCuY7n1zDRntJYGgkDpq/3iAVKlGZre+O+Ye5jDpWReix4M=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775840693; c=relaxed/simple;\n bh=o/3xFqYHI2EfMZni8Q981qC9JG3Z3S6E0/bC/tTIgVU=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=s54xhLmhl2tX14Qhy8ELitRn06wY4wnbDnueP3trnFipKHcMwuCP4E9LElpiMzMoJLoKTWZryoDQqc/Cu7IrY/3BPhh2vLM99DEnXtpGeBTedsK4FsifiP5CblQV+U3RL7JOJn2J96YxzKPCMYXT20IwUBRodc5QkL04tGT/HBc=","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=1775840692;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=z1A5rQR2L44VOTTL3lMydWDmJdmv9ryKV2gQqNDtw+A=;\n b=RqDj+iihk+YgFNUxHIY5/578LZnPbj6tYnDxqJbXLIjMa3MHBhhQ7HuPpU3s/PSu8xKAgf\n sz3iiaiC5kdq2llKQO5h1myS86oAY23v3NR2OC6EUoDzgRcbw51cCM5TaJ9PCbUeRR7Bvo\n JXTzhiAFSpmnNmH2FrYPjhl7psXurCI=","X-MC-Unique":"-uFLD2toMGGaWjTUZxhffw-1","X-Mimecast-MFC-AGG-ID":"-uFLD2toMGGaWjTUZxhffw_1775840691","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775840691; x=1776445491;\n h=user-agent:in-reply-to:content-disposition:mime-version:references\n :message-id:subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=z1A5rQR2L44VOTTL3lMydWDmJdmv9ryKV2gQqNDtw+A=;\n b=BzX6AAqGpHFguOppSpJCZUahR15IezN7DvLMDiXji2JfwKQ4nMJ33DUwwpm5JYVMyu\n n1secCtfPJfD9us0e+fecbKi6andN756jx94SRctvORGKPiOOoGh7QYTh4ZYjEcLfVfq\n QuNshvR9UcTrcjdsm3gtrnG+EmTVrZEyiadfoSrtmj6xdinpeR9Hat2iMk/5JRD8QwRd\n BxCFjQHrgS7GxsW6gx9qimR3A6qoAvAbO4uT9nDLZlegQ5NGPcQuPCwW4kwQYPi1eTpQ\n A77srGDQRz2l3F3ZPptosGKzHml5i9ZIZHSv/d5aIoaXvu4AeNGu1koPa3Zay+oG8sY9\n DeJg==","X-Forwarded-Encrypted":"i=1;\n AJvYcCVyz7iy1k59bMPOuX24hWRz79SB1DwNmAMqOqgztZY93ZadzZEx4LbrRAVtOVs8JZZbongB9hPhssJbOQ==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YxMR0Kjncf9OdYDqVXdNOnWLKkFFaWWmQr5VU3SvujTSVsAoLNx\n +8jX0cKnZ7aybhAwhnyIQBRg7bHUQquKlqBscpvyu0bQ9BhUh1Y9a6IUuhXojq/VM325YAKg+u0\n SqYj/O7UkwNhx0uLacvhid5kB/8P0B43xqNN9pmNu8Kn/ICLWEPD6P5E1Ow0=","X-Gm-Gg":"AeBDiev1X13b0IpaWWuiOEHoGZIFOHoxy/iCxCkPLyIbSaZR0+Gyiwd7gXd9oK1wdl7\n D6lUip9Uv8rgResi9B7a1QBKpaXK4ZWc017O2B430dq7P3L5wztXILPtxatNsTzK8CYvh60F4QZ\n HkR9/Mq+1tqZUZjwkPxWGPBFGpKoAgfJhVC1KAbGsF0sZ+OHnZd5FxaYkEO4/ceDMnOmvb+1nqB\n avy/YEMXlaX+kG0kkayMt9NJOka8CLSuu+95Xe0Kv0qLqBL0OTWaVIkW62r68LAf+8ir/SzA7hv\n bYJTHIfMSDNbrdpCNJQ+QsuCiVwUQw5uega8aGka7g2fojDWj3ME8TRpL8rtC3cpvdZkAP9TEMK\n qDA==","X-Received":["by 2002:a05:6102:5126:b0:605:271c:b667 with SMTP id\n ada2fe7eead31-60a008419e1mr1865861137.19.1775840690401;\n Fri, 10 Apr 2026 10:04:50 -0700 (PDT)","by 2002:a05:6102:5126:b0:605:271c:b667 with SMTP id\n ada2fe7eead31-60a008419e1mr1865769137.19.1775840689659;\n Fri, 10 Apr 2026 10:04:49 -0700 (PDT)"],"Date":"Fri, 10 Apr 2026 13:04:47 -0400","From":"Marek Polacek <polacek@redhat.com>","To":"Jason Merrill <jason@redhat.com>","Cc":"Jakub Jelinek <jakub@redhat.com>, GCC Patches <gcc-patches@gcc.gnu.org>","Subject":"[PATCH v2] c++/reflection: mangling dependent splices [PR123237]","Message-ID":"<adktrw95NxSQ50vG@redhat.com>","References":"<20260318150312.630675-1-polacek@redhat.com>\n <aczktP_u9tYuAnK-@tucnak>\n <ef597b55-3c4f-46be-ba0d-2927d5282dfc@redhat.com>\n <ac1chZct0jZ3-UP_@tucnak>\n <39e90c0d-7bdb-46da-bf5e-2c5c7fa58f8a@redhat.com>","MIME-Version":"1.0","In-Reply-To":"<39e90c0d-7bdb-46da-bf5e-2c5c7fa58f8a@redhat.com>","User-Agent":"Mutt/2.3.1 (2026-03-20)","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"Fks1uE8mNmy35UZDD_bvum_kw3WylZzvjUNenfwq5aM_1775840691","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>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"On Wed, Apr 01, 2026 at 05:12:39PM -0400, Jason Merrill wrote:\n> On 4/1/26 1:57 PM, Jakub Jelinek wrote:\n> > On Wed, Apr 01, 2026 at 01:40:09PM -0400, Jason Merrill wrote:\n> > > In all three cases, I'd think; I expect the different contexts to be clear\n> > > from where it appears.\n> > > \n> > > > the question is if we need to differentiate also between the\n> > > > cases where they have different operands (your patch has one case for\n> > > > TEMPLATE_ID_EXPR and another for the rest, one is something <template-args>\n> > > > and one is <expression>.  For the something, you use <expression> but\n> > > > <expression> <template-args> doesn't appear anywhere else in the grammar,\n> > > > though perhaps it is needed because it might be say L Dm ft ... E etc.\n> > > > And similarly for <expression> cases.\n> > > \n> > > Could we just add\n> > > \n> > > ::= sl <expression> [ <template-args> ] # splice\n> > > \n> > > in <prefix>, <type>, and <expression>?  <template-param> doesn't get spelled\n> > > differently when it's a type vs expression.\n> > \n> > <template-param> has neither of those\n> \n> I mean when it appears as an expansion of <type> or <expression>, we have\n> all of\n> \n> <prefix> ::= <template-param>\n> <type> ::= <template-param>\n> <expression> ::= <template-param>\n> \n> but yes, we would need to choose a prefix that is unambiguous in all three\n> contexts, and as you point out 'sl' conflicts with 's', so I suppose your DS\n> suggestion is better.\n\nMy understanding is that you want DS for all three kind of splices.\nSo this patch adds\n\n  <splice> ::= DS <expression> [ <template-args> ] E\n\nI think the final E is desirable, <decltype> has it too.\n\nI've fixed the missing write_reflection bits.\n\nDoes this look OK?  Note that it depends on the 124835 fix.\nTested x86_64-pc-linux-gnu.\n\n-- >8 --\nThis patch adds a mangling for dependent splices.  Since the ABI discussion\nat <https://github.com/itanium-cxx-abi/cxx-abi/issues/208> hasn't gelled\nyet, this mangling might change in the future.  In this patch I'm adding\n\n  <splice> ::= DS <expression> [ <template-args> ] E\n\nfor all dependent splices.\n\nWhen we have ^^T::x, we can't say what kind of reflection this\nwill be, so this patch emits the \"de\" prefix.  For template template\nparameters we emit \"tt\".\n\n\tPR c++/123237\n\tPR c++/124771\n\tPR c++/124842\n\ngcc/cp/ChangeLog:\n\n\t* mangle.cc (write_splice): New.\n\t(write_prefix): Call write_splice for SPLICE_SCOPE.\n\t(write_type): Likewise.\n\t(write_expression): Call write_splice for dependent_splice_p.\n\t(write_reflection): Handle the \"tt\" and \"de\" prefixes.\n\t* reflect.cc (reflection_mangle_prefix): For\n\tDECL_TEMPLATE_TEMPLATE_PARM_P, use the prefix \"tt\".  For\n\tdependent reflections, use \"de\".\n\ngcc/testsuite/ChangeLog:\n\n\t* g++.dg/reflect/mangle2.C: New test.\n\t* g++.dg/reflect/mangle3.C: New test.\n\t* g++.dg/reflect/mangle4.C: New test.\n\t* g++.dg/reflect/mangle5.C: New test.\n---\n gcc/cp/mangle.cc                       |  61 ++++++-\n gcc/cp/reflect.cc                      |  15 ++\n gcc/testsuite/g++.dg/reflect/mangle2.C |  48 +++++\n gcc/testsuite/g++.dg/reflect/mangle3.C | 241 +++++++++++++++++++++++++\n gcc/testsuite/g++.dg/reflect/mangle4.C |  26 +++\n gcc/testsuite/g++.dg/reflect/mangle5.C |  25 +++\n 6 files changed, 412 insertions(+), 4 deletions(-)\n create mode 100644 gcc/testsuite/g++.dg/reflect/mangle2.C\n create mode 100644 gcc/testsuite/g++.dg/reflect/mangle3.C\n create mode 100644 gcc/testsuite/g++.dg/reflect/mangle4.C\n create mode 100644 gcc/testsuite/g++.dg/reflect/mangle5.C\n\n\nbase-commit: 790671b708400d1fc6bb1abbf1601f3616e8220d","diff":"diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc\nindex d1301789ef4..70b7d49e7b0 100644\n--- a/gcc/cp/mangle.cc\n+++ b/gcc/cp/mangle.cc\n@@ -240,6 +240,7 @@ static void write_local_name (tree, const tree, const tree);\n static void dump_substitution_candidates (void);\n static tree mangle_decl_string (const tree);\n static void maybe_check_abi_tags (tree, tree = NULL_TREE, int = 10);\n+static void write_splice (tree);\n \n /* Control functions.  */\n \n@@ -1299,7 +1300,8 @@ write_nested_name (const tree decl)\n \t    ::= <template-prefix> <template-args>\n \t    ::= <decltype>\n \t    ::= # empty\n-\t    ::= <substitution>  */\n+\t    ::= <substitution>\n+\t    ::= <splice>\t    # C++26 dependent splice [proposed]  */\n \n static void\n write_prefix (const tree node)\n@@ -1319,6 +1321,12 @@ write_prefix (const tree node)\n       return;\n     }\n \n+  if (TREE_CODE (node) == SPLICE_SCOPE)\n+    {\n+      write_splice (node);\n+      return;\n+    }\n+\n   if (find_substitution (node))\n     return;\n \n@@ -2444,7 +2452,7 @@ write_local_name (tree function, const tree local_entity,\n \t    ::= G <type>    # imaginary (C 2000)     [not supported]\n \t    ::= U <source-name> <type>   # vendor extended type qualifier\n \n-   C++0x extensions\n+   C++11 extensions\n \n      <type> ::= RR <type>   # rvalue reference-to\n      <type> ::= Dt <expression> # decltype of an id-expression or\n@@ -2452,6 +2460,7 @@ write_local_name (tree function, const tree local_entity,\n      <type> ::= DT <expression> # decltype of an expression\n      <type> ::= Dn              # decltype of nullptr\n      <type> ::= Dm\t\t# decltype of ^^int\n+     <type> ::= <splice>\t# C++26 dependent splice [proposed]\n \n    TYPE is a type node.  */\n \n@@ -2734,6 +2743,10 @@ write_type (tree type)\n \t      ++is_builtin_type;\n \t      break;\n \n+\t    case SPLICE_SCOPE:\n+\t      write_splice (type);\n+\t      break;\n+\n \t    case TYPEOF_TYPE:\n \t      sorry (\"mangling %<typeof%>, use %<decltype%> instead\");\n \t      break;\n@@ -3441,7 +3454,10 @@ range_expr_nelts (tree expr)\n \t\t  ::= L <mangled-name> E\t\t# external name\n \t\t  ::= st <type>\t\t\t\t# sizeof\n \t\t  ::= sr <type> <unqualified-name>\t# dependent name\n-\t\t  ::= sr <type> <unqualified-name> <template-args> */\n+\t\t  ::= sr <type> <unqualified-name> <template-args>\n+\t\t  ::= L Dm <value reflection> E\t\t# C++26 reflection\n+\t\t\t\t\t\t\t# value [proposed]\n+\t\t  ::= <splice>\t\t# C++26 dependent splice [proposed]  */\n \n static void\n write_expression (tree expr)\n@@ -3699,6 +3715,8 @@ write_expression (tree expr)\n \twrite_string (\"on\");\n       write_unqualified_id (expr);\n     }\n+  else if (dependent_splice_p (expr))\n+    write_splice (expr);\n   else if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)\n     {\n       tree fn = TREE_OPERAND (expr, 0);\n@@ -4174,7 +4192,9 @@ write_expression (tree expr)\n \t\t  ::= co [ <prefix> ] <unqualified-name> # concept\n \t\t  ::= na [ <prefix> ] <unqualified-name> # namespace alias\n \t\t  ::= ns [ <prefix> ] <unqualified-name> # namespace\n-\t\t  ::= gs\t\t\t\t# ^^::\n+\t\t  ::= gs\t\t\t\t # ^^::\n+\t\t  ::= tt <template-template-arg>\t # templ templ parm\n+\t\t  ::= de <expression>\t\t\t # dependent expr\n \t\t  ::= ba [ <nonnegative number> ] _ <type> # dir. base cls rel\n \t\t  ::= ds <type> _ [ <unqualified-name> ] _\n \t\t      [ <alignment number> ] _ [ <bit-width number> ] _\n@@ -4286,6 +4306,39 @@ write_reflection (tree refl)\n       for (int i = 5; i < TREE_VEC_LENGTH (arg); ++i)\n \twrite_template_arg (REFLECT_EXPR_HANDLE (TREE_VEC_ELT (arg, i)));\n     }\n+  else if (strcmp (prefix, \"tt\") == 0)\n+    {\n+      gcc_assert (DECL_TEMPLATE_TEMPLATE_PARM_P (arg));\n+      write_template_template_arg (arg);\n+    }\n+  else if (strcmp (prefix, \"de\") == 0)\n+    write_expression (arg);\n+}\n+\n+/* Mangle a dependent splice.\n+\n+     <splice> ::= DS <expression> [ <template-args> ] E\n+\n+   TODO: This is only a proposed mangling.\n+   See <https://github.com/itanium-cxx-abi/cxx-abi/issues/208>.  */\n+\n+static void\n+write_splice (tree sp)\n+{\n+  write_string (\"DS\");\n+\n+  if (TREE_CODE (sp) == SPLICE_SCOPE)\n+    sp = SPLICE_SCOPE_EXPR (sp);\n+  gcc_assert (dependent_splice_p (sp));\n+  if (TREE_CODE (sp) == TEMPLATE_ID_EXPR)\n+    {\n+      write_expression (TREE_OPERAND (TREE_OPERAND (sp, 0), 0));\n+      write_template_args (TREE_OPERAND (sp, 1));\n+    }\n+  else\n+    write_expression (TREE_OPERAND (sp, 0));\n+\n+  write_char ('E');\n }\n \n /* Literal subcase of non-terminal <template-arg>.\ndiff --git a/gcc/cp/reflect.cc b/gcc/cp/reflect.cc\nindex 8925bf49465..1b091f21437 100644\n--- a/gcc/cp/reflect.cc\n+++ b/gcc/cp/reflect.cc\n@@ -9161,6 +9161,21 @@ reflection_mangle_prefix (tree refl, char prefix[3])\n       strcpy (prefix, \"ds\");\n       return h;\n     }\n+  /* ??? We don't have a metafunction for template template parameters.  */\n+  if (DECL_TEMPLATE_TEMPLATE_PARM_P (h))\n+    {\n+      strcpy (prefix, \"tt\");\n+      return h;\n+    }\n+  /* For ^^T::x, we can't say what the reflection is going to be.  Just say\n+     it's something dependent.  This is at the end rather than the beginning\n+     because potential_constant_expression_1 doesn't handle codes like\n+     TREE_BINFO.  */\n+  if (uses_template_parms (h))\n+    {\n+      strcpy (prefix, \"de\");\n+      return h;\n+    }\n   gcc_unreachable ();\n }\n \ndiff --git a/gcc/testsuite/g++.dg/reflect/mangle2.C b/gcc/testsuite/g++.dg/reflect/mangle2.C\nnew file mode 100644\nindex 00000000000..452e172fcf4\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/mangle2.C\n@@ -0,0 +1,48 @@\n+// PR c++/123237\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+\n+#include <meta>\n+\n+template<typename T>\n+using A0 = [:^^T:];\n+\n+template<typename T>\n+using A1 = [:parent_of (^^T):]::B;\n+\n+namespace N {\n+  using B = int;\n+  struct S {};\n+}\n+namespace D {\n+  using B = long;\n+  struct S {};\n+}\n+\n+template <typename T>\n+using A2 = decltype (T ().[:std::meta::nonstatic_data_members_of (^^T, std::meta::access_context::unchecked ())[0]:]);\n+\n+struct B\n+{\n+  long a;\n+  int b;\n+};\n+\n+struct C\n+{\n+  int c;\n+  long d;\n+};\n+\n+\n+void\n+g ()\n+{\n+  []<typename T = int> requires(requires { A0<T> {}; }) {}();\n+  []<typename T = N::S> requires (requires { A1<T> {}; }) {} ();\n+  []<typename T = C> requires (requires { A2<T> {}; }) {} ();\n+}\n+\n+// { dg-final { scan-assembler \"_ZZ1gvENKUlTyQrqXtlDSLDmtyT_EEEEvE_clIiEEDav\" } }\n+// { dg-final { scan-assembler \"_ZZ1gvENKUlTyQrqXtlNDSclL_ZNSt4meta9parent_ofEDmELDmtyT_EEE1BEEEvE0_clIN1N1SEEEDav\" } }\n+// { dg-final { scan-assembler \"_ZZ1gvENKUlTyQrqXtlDtdtcvT__EDScldtclL_ZNSt4meta25nonstatic_data_members_ofEDmNS0_14access_contextEELDmtyS_EclL_ZNS1_9uncheckedEvEEEL_ZNSt6vectorIDmSaIDmEEixEmELi0EEEEEEvE1_clI1CEEDav\" } }\ndiff --git a/gcc/testsuite/g++.dg/reflect/mangle3.C b/gcc/testsuite/g++.dg/reflect/mangle3.C\nnew file mode 100644\nindex 00000000000..d589e7002f6\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/mangle3.C\n@@ -0,0 +1,241 @@\n+// PR c++/123237\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+// Test mangling dependent splices.\n+\n+#include <meta>\n+using namespace std::meta;\n+\n+int i;\n+int arr[] = {1, 2, 3};\n+auto [a1, a2, a3] = arr;\n+enum Enum { A };\n+using Alias = int;\n+\n+template<auto>\n+struct TCls { };\n+\n+template <auto> int TVar;\n+\n+template<typename T>\n+struct B {\n+  T t;\n+  constexpr T fn () { return 42; }\n+  template<typename>\n+  struct C { };\n+  template<typename U>\n+  using U = C<U>;\n+};\n+\n+struct Y {\n+  int i;\n+  using type = int;\n+};\n+\n+struct S : Y { };\n+\n+namespace N {\n+  struct NY {\n+    int i;\n+  };\n+}\n+\n+namespace NSAlias = N;\n+template <auto> concept Concept = requires { true; };\n+constexpr auto ctx = std::meta::access_context::current ();\n+\n+template<typename T>\n+using US = [:^^T:];\n+\n+template<info R>\n+constexpr auto f1 (typename [:R:] x) { return x; }\n+\n+template<info R>\n+constexpr auto f2 (typename [:R:]::NY x) { return x; }\n+\n+template<info R>\n+constexpr auto f3 () -> TCls<sizeof(typename [:R:])> { return {}; }\n+\n+template<info R>\n+constexpr auto f4 () -> TCls<sizeof([:R:])> { return {}; }\n+\n+template<info R>\n+constexpr auto f5 () -> decltype([:R:]) { return {}; }\n+\n+template<typename T>\n+constexpr auto f6 (US<T> y) { return y; }\n+\n+template<info R>\n+constexpr auto f7 (typename [:R:]<0> x) { return x; }\n+\n+template<typename T>\n+constexpr auto f8 (typename [:^^T:] x) { return x; }\n+\n+template<info R>\n+constexpr typename [:R:] f9 (int i) { return i; }\n+\n+template<typename T>\n+constexpr T foo (T t) { return t; }\n+\n+template<info R>\n+constexpr auto f10 () -> decltype([:R:](42)) { return {}; }\n+\n+template<info R>\n+constexpr auto f11 (TCls<[:R:](42)> a) { return a; }\n+\n+template<typename T>\n+consteval info id () { return ^^T; }\n+\n+template<typename T>\n+constexpr typename [:id<T>():] f12 () { return 42; }\n+\n+template<info R>\n+constexpr auto f13 (typename [:R:]::type x) { return x; }\n+\n+template<info R>\n+constexpr auto f14 () -> [:R:] { return {}; }\n+\n+template<typename T, info R>\n+constexpr auto f15 () -> decltype(T{}.[:R:]) { return {}; }\n+\n+template<typename T, info R>\n+constexpr auto f16 () -> decltype(T{}.[:R:]()) { return {}; }\n+\n+template<info O, info M>\n+constexpr auto f17 () -> decltype(typename [:O:]{}.[:M:]) { return {}; }\n+\n+template<info M>\n+constexpr auto f18 () -> decltype(Y{}.[:M:]) { return {}; }\n+\n+template<template<typename> class T>\n+constexpr auto f19 () -> [:^^T:]<int> { return {}; }\n+\n+template<typename T>\n+constexpr auto f20 () -> [:^^typename T::type:] { return {}; }\n+\n+template<typename T>\n+constexpr auto f21 () -> decltype(&[:^^T::i:]) { return {}; }\n+\n+template<typename T>\n+constexpr auto f22 () -> decltype(&[:^^T::fn:]) { return {}; }\n+\n+template<typename T>\n+constexpr auto f23 () -> [:^^typename T::C<int>:] { return {}; }\n+\n+template<typename T>\n+constexpr auto f24 () -> [:^^typename T::U<int>:] { return {}; }\n+\n+template<info R>\n+constexpr auto f25 () -> decltype([:R:])* { return {}; }\n+\n+template<typename T>\n+consteval auto f26 (typename [:^^T:] x) { return x; }\n+\n+template<info R>\n+constexpr auto f27 (typename [:R:]::Alias x) { return x; }\n+\n+void\n+g (int p)\n+{\n+  f1<^^Y>(Y{ 42 });\n+// { dg-final { scan-assembler \"_Z2f1ILDmty1YEEDaDST_E\" } }\n+  f1<^^Enum>(A);\n+// { dg-final { scan-assembler \"_Z2f1ILDmty4EnumEEDaDST_E\" } }\n+  f2<^^N>(N::NY{ 42 });\n+// { dg-final { scan-assembler \"_Z2f2ILDmns1NEEDaNDST_E2NYE\" } }\n+  f2<^^NSAlias>(NSAlias::NY{ 42 });\n+// { dg-final { scan-assembler \"_Z2f2ILDmna7NSAliasEEDaNDST_E2NYE\" } }\n+  f3<^^int>();\n+// { dg-final { scan-assembler \"_Z2f3ILDmtyiEE4TClsIXstDST_EEEv\" } }\n+  f3<^^Alias>();\n+// { dg-final { scan-assembler \"_Z2f3ILDmtyiEE4TClsIXstDST_EEEv\" } }\n+  f4<^^i>();\n+// { dg-final { scan-assembler \"_Z2f4ILDmvr1iEE4TClsIXszDST_EEEv\" } }\n+  f4<^^arr>();\n+// { dg-final { scan-assembler \"_Z2f4ILDmvr3arrEE4TClsIXszDST_EEEv\" } }\n+  f4<^^a1>();\n+// { dg-final { scan-assembler \"_Z2f4ILDmsb2a1EE4TClsIXszDST_EEEv\" } }\n+  f4<^^A>();\n+// { dg-final { scan-assembler \"_Z2f4ILDmen4Enum1AEE4TClsIXszDST_EEEv\" } }\n+  f4<^^TVar>();\n+// { dg-final { scan-assembler \"_Z2f4ILDmvt4TVarEE4TClsIXszDST_EEEv\" } }\n+  f5<^^i>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmvr1iEEDtDST_EEv\" } }\n+  f5<^^a1>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmsb2a1EEDtDST_EEv\" } }\n+  f5<^^A>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmen4Enum1AEEDtDST_EEv\" } }\n+  f5<^^TVar>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmvt4TVarEEDtDST_EEv\" } }\n+  f5<^^Concept>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmco7ConceptEEDtDST_EEv\" } }\n+  f5<^^p>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmvrZ1giE1pEEDtDST_EEv\" } }\n+  f5<std::meta::reflect_constant (42)>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmvlLi42EEEDtDST_EEv\" } }\n+  f5<std::meta::reflect_object (arr[1])>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmobixL_Z3arrELl1EEEDtDST_EEv\" } }\n+  f5<parameters_of (^^g)[0]>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmpa_1giEEDtDST_EEv\" } }\n+  f5<bases_of (^^S, ctx)[0]>();\n+// { dg-final { scan-assembler \"_Z2f5ILDmba_1SEEDtDST_EEv\" } }\n+  f6<Y>(Y{42});\n+// { dg-final { scan-assembler \"_Z2f6I1YEDaDSLDmtyT_EE\" } }\n+  f7<^^TCls>(TCls<0>{});\n+// { dg-final { scan-assembler \"_Z2f7ILDmct4TClsEEDaDST_ILi0EEE\" } }\n+  f8<int>(42);\n+// { dg-final { scan-assembler \"_Z2f8IiEDaDSLDmtyT_EE\" } }\n+  f8<Alias>(42);\n+// { dg-final { scan-assembler \"_Z2f8IiEDaDSLDmtyT_EE\" } }\n+  f9<^^int>(42);\n+// { dg-final { scan-assembler \"_Z2f9ILDmtyiEEDST_Ei\" } }\n+  f9<^^Alias>(42);\n+// { dg-final { scan-assembler \"_Z2f9ILDmtyiEEDST_Ei\" } }\n+  f10<^^foo<int>>();\n+// { dg-final { scan-assembler \"_Z3f10ILDmfn3fooIiET_S1_EEDTclDST_ELi42EEEv\" } }\n+  f10<^^foo<Alias>>();\n+// { dg-final { scan-assembler \"_Z3f10ILDmfn3fooIiET_S1_EEDTclDST_ELi42EEEv\" } }\n+  f11<^^foo<int>>(TCls<42>{});\n+// { dg-final { scan-assembler \"_Z3f11ILDmfn3fooIiET_S1_EEDa4TClsIXclDST_ELi42EEEE\" } }\n+  f11<^^foo<Alias>>(TCls<42>{});\n+// { dg-final { scan-assembler \"_Z3f11ILDmfn3fooIiET_S1_EEDa4TClsIXclDST_ELi42EEEE\" } }\n+  f12<int>();\n+// { dg-final { scan-assembler \"_Z3f12IiEDScl2idIT_EEEv\" } }\n+  f12<Alias>();\n+// { dg-final { scan-assembler \"_Z3f12IiEDScl2idIT_EEEv\" } }\n+  f13<^^Y>(42);\n+// { dg-final { scan-assembler \"_Z3f13ILDmty1YEEDaNDST_E4typeE\" } }\n+  f14<^^int>();\n+// { dg-final { scan-assembler \"_Z3f14ILDmtyiEEDST_Ev\" } }\n+  f14<^^TCls<1>>();\n+// { dg-final { scan-assembler \"_Z3f14ILDmty4TClsILi1EEEEDST_Ev\" } }\n+  f15<Y, ^^Y::i>();\n+// { dg-final { scan-assembler \"_Z3f15I1YLDmdmS0_1iEEDtdttlT_EDST0_EEv\" } }\n+  f15<B<int>, ^^B<int>::t>();\n+// { dg-final { scan-assembler \"_Z3f15I1BIiELDmdmS1_1tEEDtdttlT_EDST0_EEv\" } }\n+  f16<B<int>, ^^B<int>::fn>();\n+// { dg-final { scan-assembler \"_Z3f16I1BIiELDmfnNS1_2fnEvEEDTcldttlT_EDST0_EEEv\" } }\n+  f17<^^Y, ^^Y::i>();\n+// { dg-final { scan-assembler \"_Z3f17ILDmty1YELDmdmS0_1iEEDtdttlDST_EEDST0_EEv\" } }\n+  f18<^^Y::i>();\n+// { dg-final { scan-assembler \"_Z3f18ILDmdm1Y1iEEDtdttlS0_EDST_EEv\" } }\n+  f19<B>();\n+// { dg-final { scan-assembler \"_Z3f19I1BEDSLDmtt1TEIiEEv\" } }\n+  f20<Y>();\n+// { dg-final { scan-assembler \"_Z3f20I1YEDSLDmtyNT_4typeEEEv\" } }\n+  f21<Y>();\n+// { dg-final { scan-assembler \"_Z3f21I1YEDTadDSLDmdesrT_1iEEEv\" } }\n+  f22<B<int>>();\n+// { dg-final { scan-assembler \"_Z3f22I1BIiEEDTadDSLDmdesrT_2fnEEEv\" } }\n+  f23<B<int>>();\n+// { dg-final { scan-assembler \"_Z3f23I1BIiEEDSLDmtyNT_1CIiEEEEv\" } }\n+  f24<B<int>>();\n+// { dg-final { scan-assembler \"_Z3f24I1BIiEEDSLDmtyNT_1UIiEEEEv\" } }\n+  f24<B<Alias>>();\n+// { dg-final { scan-assembler \"_Z3f24I1BIiEEDSLDmtyNT_1UIiEEEEv\" } }\n+  f25<^^arr>();\n+// { dg-final { scan-assembler \"_Z3f25ILDmvr3arrEEPDtDST_EEv\" } }\n+  constexpr auto r = f26<std::meta::info>({});\n+  f27<^^::>(42);\n+// { dg-final { scan-assembler \"_Z3f27ILDmgsEEDaNDST_E5AliasE\" } }\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/mangle4.C b/gcc/testsuite/g++.dg/reflect/mangle4.C\nnew file mode 100644\nindex 00000000000..3880468daff\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/mangle4.C\n@@ -0,0 +1,26 @@\n+// PR c++/124771\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+\n+#include <mdspan>\n+#include <meta>\n+\n+namespace std {\n+template<random_access_iterator I>\n+  struct iterator_accessor {\n+    using element_type     = typename [: \n+      [] { return ^^iter_value_t<I>; }() \n+    :];\n+\n+    constexpr iterator_accessor() noexcept = default;\n+    constexpr operator default_accessor<const element_type>() noexcept\n+      requires contiguous_iterator<I> && (!is_const_v<element_type>)\n+        { return {}; }\n+  };\n+}\n+\n+int main() {\n+  // ??? It's not clear which of these should error.\n+  std::default_accessor<int>       _ = std::iterator_accessor<int*>();\n+  std::default_accessor<const int> _ = std::iterator_accessor<int*>(); // { dg-error \"conversion\" }\n+}\ndiff --git a/gcc/testsuite/g++.dg/reflect/mangle5.C b/gcc/testsuite/g++.dg/reflect/mangle5.C\nnew file mode 100644\nindex 00000000000..48635634f2f\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/reflect/mangle5.C\n@@ -0,0 +1,25 @@\n+// PR c++/124842\n+// { dg-do compile { target c++26 } }\n+// { dg-additional-options \"-freflection\" }\n+\n+#include <meta>\n+\n+inline constexpr int x = 1;\n+template <auto r>\n+typename[: std::meta::type_of(r) :] f() {\n+  return 1;\n+}\n+\n+int\n+f1 ()\n+{\n+  return f<^^x>();\n+// { dg-final { scan-assembler \"_Z1fITnDaLDmvr1xEEDScl7type_ofT_EEv\" } }\n+}\n+\n+int\n+f2 ()\n+{\n+  return f<std::meta::reflect_constant(1)>();\n+// { dg-final { scan-assembler \"_Z1fITnDaLDmvlLi1EEEDScl7type_ofT_EEv\" } }\n+}\n","prefixes":["v2"]}