public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/110349] [C++26] P2169R4 - Placeholder variables with no name
Date: Thu, 30 Nov 2023 08:11:44 +0000	[thread overview]
Message-ID: <bug-110349-4-E5QoSZHAK4@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-110349-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110349

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:6c9973e46bdb4496b5af8a7170269e91e36ad35a

commit r14-5991-g6c9973e46bdb4496b5af8a7170269e91e36ad35a
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Nov 30 09:09:21 2023 +0100

    c++: Implement C++26 P2169R4 - Placeholder variables with no name
[PR110349]

    The following patch implements the C++26 P2169R4 paper.
    As written in the PR, the patch expects that:
    1) https://eel.is/c++draft/expr.prim.lambda.capture#2
       "Ignoring appearances in initializers of init-captures, an identifier
        or this shall not appear more than once in a lambda-capture."
       is adjusted such that name-independent lambda captures with initializers
       can violate this rule (but lambda captures which aren't name-independent
       can't appear after name-independent ones)
    2) https://eel.is/c++draft/class.mem#general-5
       "A member shall not be declared twice in the member-specification,
        except that"
       having an exception that name-independent non-static data member
       declarations can appear multiple times (but again, if there is
       a member which isn't name-independent, it can't appear after
       name-independent ones)
    3) it assumes that any name-independent declarations which weren't
       previously valid result in the _ lookups being ambiguous, not just
       if there are 2 _ declarations in the same scope, in particular the
       https://eel.is/c++draft/basic.scope#block-2 mentioned cases
    4) it assumes that _ in static function/block scope structured bindings
       is never name-independent like in namespace scope structured bindings;
       it matches clang behavior and is consistent with e.g. static type _;
       not being name-independent both at namespace scope and at function/block
       scope

    As you preferred in the PR, for local scope bindings, the ambiguous cases
    use a TREE_LIST with the ambiguous cases which can often be directly fed
    into print_candidates.  For member_vec after sorting/deduping, I chose to
use
    instead OVERLOAD with a new flag but only internally inside of the
    member_vec, get_class_binding_direct turns it into a TREE_LIST.  There are
    2 reasons for that, in order to keep the member_vec binary search fast, I
    think it is better to keep OVL_NAME usable on all elements because having
    to special case TREE_LIST would slow everything down, and the callers need
    to be able to chain the results anyway and so need an unshared TREE_LIST
    they can tweak/destroy anyway.
    name-independent declarations (even in older standards) will not have
    -Wunused{,-variable,-but-set-variable} or -Wshadow* warnings diagnosed, but
    unlike e.g. the clang implementation, this patch does diagnose
    -Wunused-parameter for parameters with _ names because they aren't
    name-independent and one can just omit their name instead.

    2023-11-30  Jakub Jelinek  <jakub@redhat.com>

            PR c++/110349
    gcc/c-family/
            * c-cppbuiltin.cc (c_cpp_builtins): Predefine
            __cpp_placeholder_variables=202306L for C++26.
    gcc/cp/
            * cp-tree.h: Implement C++26 P2169R4 - Placeholder variables with
no
            name.
            (OVL_NAME_INDEPENDENT_DECL_P): Define.
            (add_capture): Add unsigned * argument.
            (name_independent_decl_p): New inline function.
            * name-lookup.cc (class name_lookup): Make ambiguous and
            add_value members public.
            (name_independent_linear_search): New function.
            (get_class_binding_direct): Handle member_vec_binary_search
            returning OVL_NAME_INDEPENDENT_DECL_P OVERLOAD.  Use
            name_independent_linear_search rather than fields_linear_search
            for linear lookup of _ name if !want_type.
            (member_name_cmp): Sort name-independent declarations first.
            (member_vec_dedup): Handle name-independent declarations.
            (pop_local_binding): Handle binding->value being a TREE_LIST for
            ambiguous name-independent declarations.
            (supplement_binding): Handle name-independent declarations.
            (update_binding): Likewise.
            (check_local_shadow): Return tree rather than void, normally
            NULL_TREE but old for name-independent declarations which used
            to conflict with outer scope declaration.  Don't emit -Wshadow*
            warnings for name-independent declarations.
            (pushdecl): Handle name-independent declarations.
            * search.cc (lookup_field_r): Handle nval being a TREE_LIST.
            * lambda.cc (build_capture_proxy): Adjust for ___.<number>
            names of members.
            (add_capture): Add NAME_INDEPENDENT_CNT argument.  Use ___.<number>
            name rather than ___ for second and following capture with
            _ name.
            (add_default_capture): Adjust add_capture caller.
            * decl.cc (poplevel): Don't warn about name-independent
declarations.
            (duplicate_decls): If in C++26 a _ named declaration conflicts with
            earlier declarations, emit explaining note why the new declaration
            is not name-independent.
            (reshape_init_class): If field is a TREE_LIST, emit an ambiguity
            error with list of candidates rather than error about non-existing
            non-static data member.
            * parser.cc (cp_parser_lambda_introducer): Adjust add_capture
callers.
            Allow name-independent capture redeclarations.
            (cp_parser_decomposition_declaration): Set decl_specs.storage_class
            to sc_static for static structured bindings.
            * pt.cc (tsubst_lambda_expr): Adjust add_capture caller.
    gcc/testsuite/
            * g++.dg/cpp26/name-independent-decl1.C: New test.
            * g++.dg/cpp26/name-independent-decl2.C: New test.
            * g++.dg/cpp26/name-independent-decl3.C: New test.
            * g++.dg/cpp26/name-independent-decl4.C: New test.
            * g++.dg/cpp26/name-independent-decl5.C: New test.
            * g++.dg/cpp26/name-independent-decl6.C: New test.
            * g++.dg/cpp26/feat-cxx26.C: Add __cpp_placeholder_variables test.

  parent reply	other threads:[~2023-11-30  8:11 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-21 16:27 [Bug c++/110349] New: " mpolacek at gcc dot gnu.org
2023-06-22  6:03 ` [Bug c++/110349] " pinskia at gcc dot gnu.org
2023-08-11 15:32 ` jakub at gcc dot gnu.org
2023-08-11 19:08 ` jason at gcc dot gnu.org
2023-08-18 15:01 ` jakub at gcc dot gnu.org
2023-08-18 15:33 ` jakub at gcc dot gnu.org
2023-08-18 16:14 ` jason at gcc dot gnu.org
2023-08-18 18:34 ` jakub at gcc dot gnu.org
2023-11-30  8:11 ` cvs-commit at gcc dot gnu.org [this message]
2023-11-30  8:16 ` jakub at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-110349-4-E5QoSZHAK4@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).