public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Martin Sebor <msebor@gmail.com>
To: Jason Merrill <jason@redhat.com>
Cc: Gcc Patch List <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] document cp_operator_id and cp_assignment_operator_id
Date: Thu, 15 Jun 2017 22:57:00 -0000	[thread overview]
Message-ID: <76d44f1b-0c31-094b-1f2a-d8a8ecc9e32e@gmail.com> (raw)
In-Reply-To: <CADzB+2kNyR4zkuC_ZWQqCZJE2a9aK5F0BZ=LaB13eHJahp_O1w@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1488 bytes --]

On 06/15/2017 03:24 PM, Jason Merrill wrote:
> On Thu, Jun 15, 2017 at 12:57 PM, Martin Sebor <msebor@gmail.com> wrote:
>> Attached is a documentation-only change to add comments explaining
>> the C++ cp_operator_id and cp_assignment_operator_id macros.
>
> Hmm, I'd say that these macros return the identifier used internally
> to represent "operator OP" and "operator OP=", respectively.  Looking
> up overloads is one thing you can do with that name, but the same is
> true of all identifiers, do we need to mention it specifically?

I tried to describe the use case that I needed but that wasn't
obvious to me from the examples I cam across.

If these cp_foo_id() helpers and the other identifier macros were
defined and documented in one place there could be a few examples
at the top of the section listing them showing some of the less
obvious use cases.  As it is, cp_operator_id() and
cp_assignment_operator_id() are defined in one place (and using
the cp_foobar_id() naming convention), while the {ctor,dtor}_
identifier macros in another (and using a different convention).
Perhaps there's a good reason for it but knowing as little as
I do I find it confusing because I used both to do the same
thing: iterate over the overloads of the special functions.

With that in mind, attached is an update that tries to clarify
things without mentioning the example in the comments for (just)
the operator _id macros.

If you have a better suggestion I'll be happy to take it.

Martin

[-- Attachment #2: gcc-cp_operator_id-doc.diff --]
[-- Type: text/x-patch, Size: 2723 bytes --]

gcc/cp/ChangeLog:

	* cp-tree.h (cp_operator_id, cp_assignment_operator_id): Document.

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index da45d95..b4795d2 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -209,8 +209,19 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
 /* std::align_val_t */
 #define align_type_node			cp_global_trees[CPTI_ALIGN_TYPE]
 
-/* We cache these tree nodes so as to call get_identifier less
-   frequently.  */
+/* We cache these tree nodes so as to call get_identifier less frequently.
+   For identifiers for functions, including special member functions such
+   as ctors and assignment operators, the nodes can be used (among other
+   things) to iterate over their overloads defined by/for a type.  For
+   example:
+
+     tree ovlid = cp_assignment_operator_id (NOP_EXPR);
+     tree overloads = lookup_fnfields_slot (type, ovlid);
+     for (ovl_iterator it (overloads); it; ++it) { ... }
+
+   iterates over the set of implicitly and explicitly defined overloads
+   of the assignment operator for type (including the copy and move
+   assignment operators, whether deleted or not).  */
 
 /* The name of a constructor that takes an in-charge parameter to
    decide whether or not to construct virtual base classes.  */
@@ -231,6 +242,18 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
 /* The name of a destructor that destroys virtual base classes, and
    then deletes the entire object.  */
 #define deleting_dtor_identifier	cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
+
+/* The name of the identifier used internally to represent operator CODE.  */
+#define cp_operator_id(CODE) \
+  (operator_name_info[(int) (CODE)].identifier)
+
+/* The name of the identifier used to represent assignment operator CODE,
+   both simple (i.e., operator= with CODE == NOP_EXPR) and compound (e.g.,
+   operator+= with CODE == PLUS_EXPR).  Includes copy and move assignment.
+   Use copy_fn_p() to test specifically for copy assignment.  */
+#define cp_assignment_operator_id(CODE)				\
+  (assignment_operator_name_info[(int) (CODE)].identifier)
+
 #define delta_identifier		cp_global_trees[CPTI_DELTA_IDENTIFIER]
 #define in_charge_identifier		cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
 /* The name of the parameter that contains a pointer to the VTT to use
@@ -1731,10 +1754,6 @@ struct GTY(()) language_function {
    || (NAME) == cp_operator_id (DELETE_EXPR)	\
    || (NAME) == cp_operator_id (VEC_DELETE_EXPR))
 
-#define cp_operator_id(CODE) \
-  (operator_name_info[(int) (CODE)].identifier)
-#define cp_assignment_operator_id(CODE) \
-  (assignment_operator_name_info[(int) (CODE)].identifier)
 /* In parser.c.  */
 extern tree cp_literal_operator_id (const char *);
 

  reply	other threads:[~2017-06-15 22:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-15 16:57 Martin Sebor
2017-06-15 21:25 ` Jason Merrill
2017-06-15 22:57   ` Martin Sebor [this message]
2017-07-01 21:42     ` Jason Merrill

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=76d44f1b-0c31-094b-1f2a-d8a8ecc9e32e@gmail.com \
    --to=msebor@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jason@redhat.com \
    /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).