[{"id":3679980,"web_url":"http://patchwork.ozlabs.org/comment/3679980/","msgid":"<ea6a4f30-55c0-4e96-a696-0734dd319326@redhat.com>","list_archive_url":null,"date":"2026-04-21T16:53:38","subject":"Re: [PATCH] c++: Parse splice-type-specifier in\n cp_parser_mem_initializer_id [PR124944]","submitter":{"id":4337,"url":"http://patchwork.ozlabs.org/api/people/4337/","name":"Jason Merrill","email":"jason@redhat.com"},"content":"On 4/21/26 2:21 AM, Jakub Jelinek wrote:\n> Hi!\n> \n> The grammar has:\n> mem-initializer-id:\n> \tclass-or-decltype\n> \tidentifier\n> class-or-decltype:\n> \tnested-name-specifier[opt] type-name\n> \tnested-name-specifier template simple-template-id\n> \tcomputed-type-specifier\n> computed-type-specifier:\n> \tdecltype-specifier\n> \tpack-index-specifier\n> \tsplice-type-specifier\n> but we weren't parsing splice-type-specifier in there, just in\n> cp_parser_base_specifier.  So, the following patch defers\n> similarly to cp_parser_base_specifier the typename diagnostics\n> because we don't know whether typename [: will be valid or not\n> - it could be splice-scope-specifier and in that case typename\n> is not valid, or splice-type-specifier, in which case it is valid\n> but not required.  And calls cp_parser_splice_type_specifier too\n> when nested-name-specifier nor :: don't appear.\n> \n> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?\n\nOK.\n\n> 2026-04-21  Jakub Jelinek  <jakub@redhat.com>\n> \n> \tPR c++/124944\n> \t* parser.cc (cp_parser_mem_initializer_id): Parse\n> \tsplice-type-specifier.\n> \n> \t* g++.dg/reflect/splice13.C: New test.\n> \t* g++.dg/reflect/splice14.C: New test.\n> \n> --- gcc/cp/parser.cc.jj\t2026-04-16 18:56:51.665066851 +0200\n> +++ gcc/cp/parser.cc\t2026-04-20 20:14:17.454246322 +0200\n> @@ -19974,14 +19974,17 @@ cp_parser_mem_initializer_id (cp_parser*\n>     bool template_p = false;\n>     tree id;\n>   \n> -  cp_token *token = cp_lexer_peek_token (parser->lexer);\n> +  cp_token *typename_token = nullptr, *splice_token = nullptr;\n>   \n> -  /* `typename' is not allowed in this context ([temp.res]).  */\n> +  /* `typename' is not allowed in this context ([temp.res]), unless\n> +      it is part of splice-type-specifier.  Defer diagnostics for now\n> +      because it needs to be diagnosed if followed by splice-scope-specifier\n> +      but not when followed by splice-type-specifier.  */\n>     if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))\n>       {\n> -      error_at (token->location,\n> -\t\t\"keyword %<typename%> not allowed in this context (a qualified \"\n> -\t\t\"member initializer is implicitly a type)\");\n> +      typename_token = cp_lexer_peek_token (parser->lexer);\n> +      if (cp_parser_next_tokens_start_splice_type_spec_p (parser, true))\n> +\tsplice_token = cp_lexer_peek_nth_token (parser->lexer, 2);\n>         cp_lexer_consume_token (parser->lexer);\n>       }\n>     /* Look for the optional `::' operator.  */\n> @@ -20008,6 +20011,12 @@ cp_parser_mem_initializer_id (cp_parser*\n>   \t\t\t\t\t    /*type_p=*/true,\n>   \t\t\t\t\t    /*is_declaration=*/true)\n>          != NULL_TREE);\n> +  if (typename_token && cp_lexer_peek_token (parser->lexer) != splice_token)\n> +    /* Emit deferred diagnostics for invalid typename keyword if\n> +       cp_parser_nested_name_specifier_opt parsed splice-scope-specifier.  */\n> +    error_at (typename_token->location,\n> +\t      \"keyword %<typename%> not allowed in this context (a qualified \"\n> +\t      \"member initializer is implicitly a type)\");\n>     if (nested_name_specifier_p)\n>       template_p = cp_parser_optional_template_keyword (parser);\n>     /* If there is a `::' operator or a nested-name-specifier, then we\n> @@ -20020,6 +20029,14 @@ cp_parser_mem_initializer_id (cp_parser*\n>   \t\t\t\t /*check_dependency_p=*/true,\n>   \t\t\t\t /*class_head_p=*/false,\n>   \t\t\t\t /*is_declaration=*/true);\n> +  else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SPLICE))\n> +    {\n> +      /* Parse C++26 splice-type-specifier.  */\n> +      id = cp_parser_splice_type_specifier (parser);\n> +      if (id == NULL_TREE)\n> +\treturn error_mark_node;\n> +      return id;\n> +    }\n>     /* Otherwise, we could also be looking for an ordinary identifier.  */\n>     cp_parser_parse_tentatively (parser);\n>     if (cp_lexer_next_token_is_decltype (parser->lexer))\n> --- gcc/testsuite/g++.dg/reflect/splice13.C.jj\t2026-04-20 20:17:23.199120525 +0200\n> +++ gcc/testsuite/g++.dg/reflect/splice13.C\t2026-04-20 20:16:47.095728081 +0200\n> @@ -0,0 +1,23 @@\n> +// PR c++/124944\n> +// { dg-do compile { target c++26 } }\n> +// { dg-additional-options \"-freflection\" }\n> +\n> +struct A {};\n> +constexpr auto x = ^^A;\n> +\n> +struct B : [: x :] {\n> +  B () : typename [: x :] () {}\n> +};\n> +\n> +struct C : [: x :] {\n> +  C () : [: x :] () {}\n> +};\n> +\n> +namespace D {\n> +  struct E {};\n> +}\n> +constexpr auto y = ^^D;\n> +\n> +struct F : [: y :]::E {\n> +  F () : [: y :]::E () {}\n> +};\n> --- gcc/testsuite/g++.dg/reflect/splice14.C.jj\t2026-04-20 20:17:30.732993744 +0200\n> +++ gcc/testsuite/g++.dg/reflect/splice14.C\t2026-04-20 20:20:51.386617097 +0200\n> @@ -0,0 +1,12 @@\n> +// PR c++/124944\n> +// { dg-do compile { target c++26 } }\n> +// { dg-additional-options \"-freflection\" }\n> +\n> +namespace D {\n> +  struct E {};\n> +}\n> +constexpr auto y = ^^D;\n> +\n> +struct F : [: y :]::E {\n> +  F () : typename [: y :]::E () {}\t// { dg-error \"keyword 'typename' not allowed in this context \\\\\\(a qualified member initializer is implicitly a type\\\\\\)\" }\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=ECj/FNXq;\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=ECj/FNXq","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\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 4g0T3C0f9Nz1yGs\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 02:54:13 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id EABA54BA9031\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Apr 2026 16:54:11 +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 F00FE4BA23F3\n for <gcc-patches@gcc.gnu.org>; Tue, 21 Apr 2026 16:53:42 +0000 (GMT)","from mail-qv1-f71.google.com (mail-qv1-f71.google.com\n [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-617-f6RgsCJwMKS2X-LvSF73mA-1; Tue, 21 Apr 2026 12:53:41 -0400","by mail-qv1-f71.google.com with SMTP id\n 6a1803df08f44-8aca6420fe3so23114666d6.0\n for <gcc-patches@gcc.gnu.org>; Tue, 21 Apr 2026 09:53:41 -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 6a1803df08f44-8b02ae5c4b9sm143753446d6.28.2026.04.21.09.53.39\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Tue, 21 Apr 2026 09:53:39 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org EABA54BA9031","OpenDKIM Filter v2.11.0 sourceware.org F00FE4BA23F3"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org F00FE4BA23F3","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org F00FE4BA23F3","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776790423; cv=none;\n b=wq8PuFHFrW+wn24SZdypUZNjv15EWO38cKDBp1z5SWtt5uomJbQNHkNk9Qwjzcnh3sGLtso5irz50O9oBIK+Xx5ZGlDXVIlQSy4CN0rKzQJr75wtGPdjXLk8UfRir3E/0CN/GND84Iufqsg7xpl56cLV/9scfbHKAcm10E69avg=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776790423; c=relaxed/simple;\n bh=R8fEJ7uznAAtZFH8gm5PyTD+qrXfYu4hV8v3/10YLWM=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From;\n b=QXuPVznElneM0cF9yIQpD/z46mVABRqHetr+3cr7O/IfoJPy1Tra4ecvN2ERIcM2/VGsZAejvPJlb8sXWS+o5fwTYSjFMdLN5w0TrnEd6vZqITzRiSaMHHAhj0vPBJMJtlQbQQjglzJoK3JF7XmPAkIqM1OUkebsPb9/gBkhMlE=","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=1776790422;\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=MB/MrkkgGmIj6YplI2e/0EBSWz89R2ufRXTwD5b+q98=;\n b=ECj/FNXqjmA+E9VMabeZSQmWeNdb44OuEiYA+IHU1WJKzZ4vqSRMl0mtSEGkAyWZigGLmn\n CWuE7zqDewBD0DesvOpgQSN9ux92/zJ5ACV5tKf0jptA+nnXBx08P5QKwTJlOM1QmUgoD+\n b0Q7FPxTNjZQ+Drm5uZ/23YwHdRAEHE=","X-MC-Unique":"f6RgsCJwMKS2X-LvSF73mA-1","X-Mimecast-MFC-AGG-ID":"f6RgsCJwMKS2X-LvSF73mA_1776790421","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776790421; x=1777395221;\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=MB/MrkkgGmIj6YplI2e/0EBSWz89R2ufRXTwD5b+q98=;\n b=N+LD6BXeUrzuIKZXVgQ2VQM5Ijnc001TryvsZl7tZlETiBslzR6SqImk00XRMxDSvf\n C59ryFsguYJlOjIRTWonBvN1DksjL7d3TcU3UBvixZMM+DhQGHquytBZDs8cKIsR336A\n KZpaUN/YotdcFdyT/GmrFLGbse9OqbCWMZjthibrp9uP8+h8lu3zp2yTijrfKhl15Aav\n At+xsrV4xwETgYFvqGrjrrVphwTCbUm2pU2KiOq2/dygvZPC8UbuBiTfw5S0xge78+3A\n 8C6JAY6V1B5x+6KSUmsHURnEpYN0EggyjdM9/Vbk2nfbtQFTHiAfICivGglknBYODx7B\n xkBg==","X-Gm-Message-State":"AOJu0Yxp86YWas0uEZq1NIdO4HY8g/8m/yIfUiyvd01Nr1JPOudC3w2u\n WRfnspxd9mRhWV5Dokt1PA5rxoNfPWvxSf+Cr8rO/TAS34F/qjhsxWW0MQkBTEXoIyEkfl1y8ZV\n u4A5aNbaoFmXRyIm3W2qQqPJcPUBbFoqrAE3RKyiygYR8ZWcogA2A6LLjAWI=","X-Gm-Gg":"AeBDiesuCpTRTre1GrelNAG947WmKljynXjqPQxmi+h92i8akXB9doa0jpuVLXGepYR\n FdNyHZ7Pe+YmFYTeotj3XqIbzpBAERzhC8/PpsK4dekEL8/TTkdPxXc69/2s7lYfTIFHcdDhpHT\n EIitNDVhR1ujvsh83azGNfIb4+mQNP1zjp4rFGh36+ru6phdMER0KLTfj0ozkcg/5fdBzgvh9Zd\n 4YbFa7qqw3T+zyj7anRIXO7x2TjkiPcEZEZ89XcgXVcEh6+oLleQec86hx8lwhCWAGSX+T4pw+b\n Em/4MJxbzEp9zOq4pAsWY/3kU7LqlUZivheqjmgkvCPw/W0YfWhgK/qz9cGIVtUDTTXPv5PXEhs\n f2+GQzKIHS70G53lflqqWWoz/SfULtjVXcZmM1r/UL2oeSq8uz4EmOAXdbH/L4iPaboWlpCCGhp\n t7GtQIgfCVFAR91ebsyz8AkjezGglInkl8UbKHG59CBw==","X-Received":["by 2002:a05:6214:2465:b0:8ac:b39b:e745 with SMTP id\n 6a1803df08f44-8b0280eafa7mr309706906d6.33.1776790420909;\n Tue, 21 Apr 2026 09:53:40 -0700 (PDT)","by 2002:a05:6214:2465:b0:8ac:b39b:e745 with SMTP id\n 6a1803df08f44-8b0280eafa7mr309706336d6.33.1776790420388;\n Tue, 21 Apr 2026 09:53:40 -0700 (PDT)"],"Message-ID":"<ea6a4f30-55c0-4e96-a696-0734dd319326@redhat.com>","Date":"Tue, 21 Apr 2026 12:53:38 -0400","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] c++: Parse splice-type-specifier in\n cp_parser_mem_initializer_id [PR124944]","To":"Jakub Jelinek <jakub@redhat.com>, Marek Polacek <polacek@redhat.com>","Cc":"gcc-patches@gcc.gnu.org","References":"<aecXWG8aqJfdhcDI@tucnak>","From":"Jason Merrill <jason@redhat.com>","In-Reply-To":"<aecXWG8aqJfdhcDI@tucnak>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"vIdiTP5rxwTMSCiiIbkmubFSJThylkRcja2jan4CIK8_1776790421","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"}}]