[{"id":3678202,"web_url":"http://patchwork.ozlabs.org/comment/3678202/","msgid":"<e225e486-2d0b-49b2-973e-51f57c80dc88@redhat.com>","list_archive_url":null,"date":"2026-04-16T13:58:48","subject":"Re: [PATCH] c++,\n v2: Reject splicing of function parameters [PR123783]","submitter":{"id":4337,"url":"http://patchwork.ozlabs.org/api/people/4337/","name":"Jason Merrill","email":"jason@redhat.com"},"content":"On 4/16/26 9:48 AM, Jakub Jelinek wrote:\n> On Thu, Apr 16, 2026 at 09:28:15AM -0400, Marek Polacek wrote:\n>> Looks ok.  Optionally:\n>> - add a comment saying why this isn't in check_splice_expr\n>> - we could also have a location_t for the cp_expr_loc_or_input_loc\n>>    since it's used 3x in the function now\n>> - could add %qD in the error message since that's what check_splice_expr\n>>    does\n> \n> This patch incorporates those 3 changes.\n\nOK.\n\n> Though unsure if the loc change is desirable, perhaps it should be done only\n> inside of the REFLECT_PARM if (the normal case is no diagnostics).\n\nIt seems good to me.\n\n> 2026-04-16  Jakub Jelinek  <jakub@redhat.com>\n> \n> \tPR c++/123783\n> \t* reflect.cc (splice): Reject splicing of function parameters.\n> \n> \t* g++.dg/reflect/mangle3.C: Remove f5<parameters_of (^^g)[0]>()\n> \tcase.\n> \t* g++.dg/reflect/dep14.C: Include <ranges>.\n> \t(func): Apply variable_of to each vector member.\n> \t(func2): Likewise.  Use ^^func2 instead of ^^func.\n> \t* g++.dg/reflect/splice12.C: New test.\n> \n> --- gcc/cp/reflect.cc.jj\t2026-04-16 15:17:56.980684094 +0200\n> +++ gcc/cp/reflect.cc\t2026-04-16 15:35:02.392552721 +0200\n> @@ -8503,13 +8503,28 @@ splice (tree refl)\n>         gcc_checking_assert (seen_error ());\n>         return error_mark_node;\n>       }\n> +  location_t loc = cp_expr_loc_or_input_loc (refl);\n>     if (!REFLECT_EXPR_P (refl))\n>       {\n> -      error_at (cp_expr_loc_or_input_loc (refl), \"splice argument must be an \"\n> +      error_at (loc, \"splice argument must be an \"\n>   \t\t\"expression of type %qs\", \"std::meta::info\");\n>         return error_mark_node;\n>       }\n>   \n> +  /* This isn't checked in check_splice_expr, because reflect_kind isn't\n> +     available there and variable_of (parameters_of (...)[...]) can be\n> +     spliced.  */\n> +  if (REFLECT_EXPR_KIND (refl) == REFLECT_PARM)\n> +    {\n> +      auto_diagnostic_group d;\n> +      error_at (loc, \"cannot use %qD function parameter reflection in a \"\n> +\t\t\"splice expression\", REFLECT_EXPR_HANDLE (refl));\n> +      if (DECL_CONTEXT (REFLECT_EXPR_HANDLE (refl)) == current_function_decl)\n> +\tinform (loc,\n> +\t\t\"apply %<std::meta::variable_of%> on it before splicing\");\n> +      return error_mark_node;\n> +    }\n> +\n>     /* We are bringing some entity from the unevaluated expressions world\n>        to possibly outside of that, mark it used.  */\n>     if (!mark_used (REFLECT_EXPR_HANDLE (refl)))\n> --- gcc/testsuite/g++.dg/reflect/mangle3.C.jj\t2026-04-16 15:17:56.980684094 +0200\n> +++ gcc/testsuite/g++.dg/reflect/mangle3.C\t2026-04-16 15:31:27.989860878 +0200\n> @@ -175,8 +175,6 @@ g (int p)\n>   // { dg-final { scan-assembler \"_Z2f5ILDmvlLi42EEEDtDST_EEv\" } }\n>     f5<std::meta::reflect_object (arr[1])>();\n>   // { dg-final { scan-assembler \"_Z2f5ILDmobixL_Z3arrEL\\[ilx]1EEEDtDST_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> --- gcc/testsuite/g++.dg/reflect/dep14.C.jj\t2026-04-16 15:17:56.980684094 +0200\n> +++ gcc/testsuite/g++.dg/reflect/dep14.C\t2026-04-16 15:31:27.990020066 +0200\n> @@ -3,6 +3,7 @@\n>   // { dg-additional-options \"-freflection\" }\n>   \n>   #include <meta>\n> +#include <ranges>\n>   \n>   namespace __impl {\n>     template<auto... vals>\n> @@ -30,7 +31,7 @@ int func(int counter, float factor) {\n>       std::array<void *, parameters_of(^^func).size()> args;\n>   \n>       std::size_t i = 0;\n> -    [:expand(parameters_of(^^func)):] >> [&i, &counter, &factor, &args]<auto e>\n> +    [:expand(parameters_of(^^func) | std::views::transform(std::meta::variable_of)):] >> [&i, &counter, &factor, &args]<auto e>\n>       {\n>           args[i++] = &[:e:]; // { dg-error \"use of local variable\" }\n>       };\n> @@ -38,10 +39,10 @@ int func(int counter, float factor) {\n>   }\n>   \n>   int func2(int counter, float factor) {\n> -    std::array<void *, parameters_of(^^func).size()> args;\n> +    std::array<void *, parameters_of(^^func2).size()> args;\n>   \n>       std::size_t i = 0;\n> -    [:expand(parameters_of(^^func)):] >> [&]<auto e>\n> +    [:expand(parameters_of(^^func2) | std::views::transform(std::meta::variable_of)):] >> [&]<auto e>\n>       {\n>           args[i++] = &[:e:]; // { dg-error \"use of local variable|trying to capture \\[^\\n\\r]* in instantiation of generic lambda\" }\n>       };\n> --- gcc/testsuite/g++.dg/reflect/splice12.C.jj\t2026-04-16 15:31:27.990111825 +0200\n> +++ gcc/testsuite/g++.dg/reflect/splice12.C\t2026-04-16 15:34:49.937761087 +0200\n> @@ -0,0 +1,21 @@\n> +// PR c++/123783\n> +// { dg-do compile { target c++26 } }\n> +// { dg-additional-options \"-freflection\" }\n> +\n> +#include <meta>\n> +\n> +void\n> +bar (int a)\n> +{\n> +}\n> +\n> +void\n> +foo (int a)\n> +{\n> +  auto b = &[: ^^a :];\n> +  auto c = &[: variable_of (parameters_of (^^foo)[0]) :];\n> +  auto d = &[: parameters_of (^^foo)[0] :];\t\t\t// { dg-error \"cannot use 'a' function parameter reflection in a splice expression\" }\n> +\t\t\t\t\t\t\t\t// { dg-message \"apply 'std::meta::variable_of' on it before splicing\" \"\" { target *-*-* } .-1 }\n> +  auto e = &[: parameters_of (^^bar)[0] :];\t\t\t// { dg-error \"cannot use 'a' function parameter reflection in a splice expression\" }\n> +  auto f = [] { auto g = &[: parameters_of (^^foo)[0] :]; };\t// { dg-error \"cannot use 'a' function parameter reflection in a splice expression\" }\n> +}\n> \n> \n> \tJakub\n>","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=EmvNMHlm;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::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=EmvNMHlm","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\n [IPv6:2620:52:6:3111::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 4fxKPk71zTz1yHP\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 23:59:22 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 2482A4BAD150\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 13:59:21 +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 779374BA900C\n for <gcc-patches@gcc.gnu.org>; Thu, 16 Apr 2026 13:58:53 +0000 (GMT)","from mail-qk1-f199.google.com (mail-qk1-f199.google.com\n [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-646-d1PUCSEzPty933llucfSig-1; Thu, 16 Apr 2026 09:58:52 -0400","by mail-qk1-f199.google.com with SMTP id\n af79cd13be357-8d3bb33c8b8so1725526985a.0\n for <gcc-patches@gcc.gnu.org>; Thu, 16 Apr 2026 06:58:52 -0700 (PDT)","from [192.168.50.130]\n (130-44-146-247.s12789.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com.\n [130.44.146.247]) by smtp.gmail.com with ESMTPSA id\n af79cd13be357-8e4eed6ed8asm376010885a.1.2026.04.16.06.58.49\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 16 Apr 2026 06:58:49 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 2482A4BAD150","OpenDKIM Filter v2.11.0 sourceware.org 779374BA900C"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 779374BA900C","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 779374BA900C","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776347933; cv=none;\n b=Z9+12fQxAO6ymC10ILRUoQqZj5d0TLD0fl+dNq0DEl70BaBNtWyvDD5ViBtRe797prbNmQcOoWBh9rgQZMI0g0Xkn7HR2vfMSWEmdHCiZ/qS2K5Y3J6ScxKpvA0vpzhJdyuaa+PRye/IlyEWP2EQXOhbeOpL2IhpyjKcc9gGPgA=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776347933; c=relaxed/simple;\n bh=ufC2XWLrNzMVNBrlCrdEIXTzk0h5XP5BLryF0AVA+sI=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From;\n b=jorwuzD4tYBLQ+4v26Mq3mbcB/T3CCytMaDnStfWgoQsKy0u85S23IB8Alkr+C4D0kbMxjcqkuo7196Dsb4no2JHG4V3syks6OaRBXqDvckhbTZMbqvbxfdXNS/S8StxRseNLYI4p2AXteUTilYLGJo6bLMzg6vxRcfEAuFLwkQ=","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=1776347933;\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 content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=tJYo8kNUKbz133ubfqactLx/Dt9xIo8fQpAsBj+Q504=;\n b=EmvNMHlmtslttYXH4QoYDbxta8OJgtW3sVg0JlceD7NawjbsvJn0BTp+v7z7Yysv55KHaZ\n jV6Wxe2LBjOHA1KdNiTtM6SOrz3l6x+/IFc+w8Z89BAQxOYQNnyc1ePdwG1+U9h/mK7HaN\n W9C5uFDLUr+9cg96g9/H6cBgjXTL8dA=","X-MC-Unique":"d1PUCSEzPty933llucfSig-1","X-Mimecast-MFC-AGG-ID":"d1PUCSEzPty933llucfSig_1776347932","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776347931; x=1776952731;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=tJYo8kNUKbz133ubfqactLx/Dt9xIo8fQpAsBj+Q504=;\n b=dXXwfPV53xiiItRoatsSPObL3eQugORJmUIMMBnmSL3qD99orrwp0vUFGBbPOB5hUg\n Sb3C7WwYmEoIVW96ffbpv73Iz7KQxARWfGUPbvHq+S0su4lpv9Q3P/idywy/2aSCfYLF\n IiKyi5GdwyL3SJXKrB60sxv6aap1sRnKKewT5YaXNlQMVd7V+m4MJbdVUymKtTG9edw2\n VDVdKb1sMLP9fAGv/L3O3w131784vOICgB74cqx9EX0c06Q0AzjjfU2ShmNQQo5O3npy\n 6K+mUghtkE1vQqXozf0X3NqtA6lkfc77bJR+Wfk1Niu38q7gx5/1sWS6OwoZjNgmw2O2\n Uz7w==","X-Gm-Message-State":"AOJu0YxhYkBNSYRj5nV/GgKu3GwzAf4FE/Uwyu3Btu/6HkBpjxVSoTsh\n kqxYDIsBX7Xh6IdViC9of+NLalpRDf8ofxJP5lzPtgBU53DXmb+bed2wOAga3LFBGXD6mUEj+kd\n paw7hZvfJfvzqsLtoq8xunjETxvG3EH8TXUlnZaJq74AO23reKB6yZdKdjcwiNjkzbs26Ag==","X-Gm-Gg":"AeBDieuWDCX9Iq51oafhpBor+M6EtJKVG+SAiiP92z4qF3lGuXPBb8pNci0q1rvV4eG\n hVQChVRPZnV+JC+RpgRxpDw6S7IiVfUJX55w33b7ljgEekTr7253Ix28rCah2f+yZUZVJqKJu7G\n TghF6OU87mRT/0IplFSFMUazb65MSUlVibJS5o7CkTAVyfY4AVM9Zv2yrsoXpw7Top8mP2dLChM\n 4v9J0hW3kHODgT0LKbfBKLr8EQv9QjUy6fy+MKGCYPqU0mU5i5HiQfSEw73UIEhAYyoRGX1Mov4\n nPkhQorF61nnGuJSIDHVVlwWyaJM/t+qFz56ydLFd9MxZEcd7h3YmeSKnT+z2ByReC6nwUWKISc\n Z5ib1kjfgcgOGYRgvHBZtkRdbU3/ukyurBG6fnwVTdxdWCTzqLdA7qGE+2oypH1bqgMISCwut65\n 8s469iliSg7pQLGBg30DX6WnX0MTG4bqg++8+qRtok6g==","X-Received":["by 2002:a05:620a:7113:b0:8cf:d565:fca4 with SMTP id\n af79cd13be357-8ddccb3040fmr3813517185a.3.1776347930870;\n Thu, 16 Apr 2026 06:58:50 -0700 (PDT)","by 2002:a05:620a:7113:b0:8cf:d565:fca4 with SMTP id\n af79cd13be357-8ddccb3040fmr3813512285a.3.1776347930288;\n Thu, 16 Apr 2026 06:58:50 -0700 (PDT)"],"Message-ID":"<e225e486-2d0b-49b2-973e-51f57c80dc88@redhat.com>","Date":"Thu, 16 Apr 2026 09:58:48 -0400","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] c++,\n v2: Reject splicing of function parameters [PR123783]","To":"Jakub Jelinek <jakub@redhat.com>, Marek Polacek <polacek@redhat.com>","Cc":"gcc-patches@gcc.gnu.org","References":"<aeC5t2bY4NkoD4nm@tucnak> <aeDj7wrH60HjsnPU@redhat.com>\n <aeDomvgfcUnzz1XG@tucnak>","From":"Jason Merrill <jason@redhat.com>","In-Reply-To":"<aeDomvgfcUnzz1XG@tucnak>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"j2H0QD2L3Y3JKfNAufvnAZ60c9vO0zINh3Ri6PqzDSo_1776347932","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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"}}]